net.i2p.kademlia

## Class KBucketImpl<T extends SimpleDataStructure>

- java.lang.Object
- - net.i2p.kademlia.KBucketImpl<T>

- Type Parameters:
    `T` - type of SimpleDataStructure objects stored in this bucket
  All Implemented Interfaces:
    KBucket<T>

      class KBucketImpl<T extends SimpleDataStructure>
      extends Object
      implements KBucket<T>

  A concurrent implementation using ConcurrentHashSet. The max size (K) may be temporarily exceeded due to concurrency, a pending split, or the behavior of the supplied trimmer, as explained below. The creator is responsible for splits. This class has no knowledge of the DHT base used for XORing, and thus there are no validity checks in add/remove. The begin and end values are immutable. All entries in this bucket will have at least one bit different from us in the range [begin, end] inclusive. Splits must be implemented by creating two new buckets and discarding this one. The keys are kept in a Set and are NOT sorted by last-seen. Per-key last-seen-time, failures, etc. must be tracked elsewhere. If this bucket is full (i.e. begin == end && size == max) then add() will call KBucketTrimmer.trim() do (possibly) remove older entries, and indicate whether to add the new entry. If the trimmer returns true without removing entries, this KBucket will exceed the max size. Refactored from net.i2p.router.networkdb.kademlia

- - ### Constructor Summary

    Constructors
    Constructor and Description
    `KBucketImpl(I2PAppContext context, int begin, int end, int max, KBucketTrimmer<T> trimmer)` All entries in this bucket will have at least one bit different from us in the range [begin, end] inclusive.

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `boolean` | `add(T peer)` Sets last-changed if rv is true OR if the peer is already present.
    `void` | `clear()`
    `Set<T>` | `getEntries()` Retrieve all routing table entries stored in the bucket
    `void` | `getEntries(SelectionCollector<T> collector)`
    `int` | `getKeyCount()` Number of keys already contained in this kbucket
    `long` | `getLastChanged()` The last-changed timestamp, which actually indicates last-added or last-seen.
    `int` | `getRangeBegin()` Lowest order high bit for difference keys.
    `int` | `getRangeEnd()` Highest high bit for the difference keys.
    `boolean` | `remove(T peer)` Remove the key from the bucket
    `void` | `setLastChanged()` Update the last-changed timestamp to now.
    `String` | `toString()`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

- - ### Constructor Detail

    - #### KBucketImpl

          public KBucketImpl(I2PAppContext context,
                             int begin,
                             int end,
                             int max,
                             KBucketTrimmer<T> trimmer)

      All entries in this bucket will have at least one bit different from us in the range [begin, end] inclusive.

  - ### Method Detail

    - #### add

          public boolean add(T peer)

      Sets last-changed if rv is true OR if the peer is already present. Calls the trimmer if begin == end and we are full. If begin != end then add it and caller must do bucket splitting.
      Specified by:
        `add` in interface `KBucket<T extends SimpleDataStructure>`
      Returns:
        true if added

    - #### clear

          public void clear()

      Specified by:
        `clear` in interface `KBucket<T extends SimpleDataStructure>`

    - #### getEntries

          public Set<T> getEntries()

      Description copied from interface: `KBucket`
      Retrieve all routing table entries stored in the bucket
      Specified by:
        `getEntries` in interface `KBucket<T extends SimpleDataStructure>`
      Returns:
        an unmodifiable view; not a copy

    - #### getEntries

          public void getEntries(SelectionCollector<T> collector)

      Specified by:
        `getEntries` in interface `KBucket<T extends SimpleDataStructure>`

    - #### getKeyCount

          public int getKeyCount()

      Description copied from interface: `KBucket`
      Number of keys already contained in this kbucket
      Specified by:
        `getKeyCount` in interface `KBucket<T extends SimpleDataStructure>`

    - #### getLastChanged

          public long getLastChanged()

      The last-changed timestamp, which actually indicates last-added or last-seen.
      Specified by:
        `getLastChanged` in interface `KBucket<T extends SimpleDataStructure>`

    - #### getRangeBegin

          public int getRangeBegin()

      Description copied from interface: `KBucket`
      Lowest order high bit for difference keys. The lower-bounds distance of this bucket is 2**begin. If begin == 0, this is the closest bucket.
      Specified by:
        `getRangeBegin` in interface `KBucket<T extends SimpleDataStructure>`

    - #### getRangeEnd

          public int getRangeEnd()

      Description copied from interface: `KBucket`
      Highest high bit for the difference keys. The upper-bounds distance of this bucket is (2**(end+1)) - 1. If begin == end, the bucket cannot be split further. If end == (numbits - 1), this is the furthest bucket.
      Specified by:
        `getRangeEnd` in interface `KBucket<T extends SimpleDataStructure>`

    - #### remove

          public boolean remove(T peer)

      Description copied from interface: `KBucket`
      Remove the key from the bucket
      Specified by:
        `remove` in interface `KBucket<T extends SimpleDataStructure>`
      Returns:
        if removed. Does NOT set lastChanged.

    - #### setLastChanged

          public void setLastChanged()

      Update the last-changed timestamp to now.
      Specified by:
        `setLastChanged` in interface `KBucket<T extends SimpleDataStructure>`

    - #### toString

          public String toString()

      Overrides:
        `toString` in class `Object`