# Class LayerManager<T extends BloomFilter<T>>

java.lang.Object
org.apache.commons.collections4.bloomfilter.LayerManager<T>

Type Parameters:
  `T` - the `BloomFilter` type.

All Implemented Interfaces:
  `BloomFilterExtractor`

public class LayerManager<T extends BloomFilter<T>> extends Object implements BloomFilterExtractor
Implementation of the methods to manage the layers in a layered Bloom filter.

The manager comprises a list of Bloom filters that are managed based on various rules. The last filter in the list is known as the `target` and is the filter into which merges are performed. The Layered manager utilizes three methods to manage the list.

- ExtendCheck - A Predicate that if true causes a new Bloom filter to be created as the new target.
- FilterSupplier - A Supplier that produces empty Bloom filters to be used as a new target.
- Cleanup - A Consumer of a `LinkedList` of BloomFilter that removes any expired or out dated filters from the list.

When extendCheck returns `true` the following steps are taken:

1. `Cleanup` is called
2. `FilterSuplier` is executed and the new filter added to the list as the `target` filter.

Since:
  4.5.0-M1

- ## Nested Class Summary

  Nested Classes
  Modifier and Type
  Class
  Description
  `static class`
  `LayerManager.Builder<T extends BloomFilter<T>>`
  Builds new instances of `LayerManager`.
  `static final class`
  `LayerManager.Cleanup`
  Static methods to create a Consumer of a List of BloomFilter perform tests on whether to reduce the collection of Bloom filters.
  `static final class`
  `LayerManager.ExtendCheck`
  A collection of common ExtendCheck implementations to test whether to extend the depth of a LayerManager.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `static <T extends BloomFilter<T>>
  LayerManager.Builder<T>`
  `builder()`
  Creates a new Builder with defaults of `LayerManager.ExtendCheck.neverAdvance()` and `LayerManager.Cleanup.noCleanup()`.
  `final void`
  `clear()`
  Removes all the filters from the layer manager, and sets up a new one as the target.
  `LayerManager<T>`
  `copy()`
  Creates a deep copy of this `LayerManager`.
  `final T`
  `first()`
  Gets the Bloom filter from the first layer.
  `final T`
  `get(int depth)`
  Gets the Bloom filter at the specified depth.
  `final int`
  `getDepth()`
  Gets the number of filters in the LayerManager.
  `final T`
  `getTarget()`
  Gets the current target filter.
  `final T`
  `last()`
  Gets the Bloom filter from the last layer.
  `boolean`
  `processBloomFilters(Predicate<BloomFilter> bloomFilterPredicate)`
  Executes a Bloom filter Predicate on each Bloom filter in the manager in depth order.

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

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

  ### Methods inherited from interface org.apache.commons.collections4.bloomfilter.BloomFilterExtractor

  `asBloomFilterArray, flatten, processBloomFilterPair`

- ## Method Details

  - ### builder

    public static <T extends BloomFilter<T>> LayerManager.Builder<T> builder()
    Creates a new Builder with defaults of `LayerManager.ExtendCheck.neverAdvance()` and `LayerManager.Cleanup.noCleanup()`.
    Type Parameters:
      `T` - Type of BloomFilter.
    Returns:
      A builder.
    See Also:
      - `LayerManager.ExtendCheck.neverAdvance()`
      - `LayerManager.Cleanup.noCleanup()`

  - ### clear

    public final void clear()
    Removes all the filters from the layer manager, and sets up a new one as the target.

  - ### copy

    public LayerManager<T> copy()
    Creates a deep copy of this `LayerManager`.

    Filters in the copy are deep copies, not references, so changes in the copy are NOT reflected in the original.

    The `filterSupplier`, `extendCheck`, and the `filterCleanup` are shared between the copy and this instance.

    Returns:
      a copy of this `LayerManager`.

  - ### first

    public final T first()
    Gets the Bloom filter from the first layer. No extension check is performed during this call.
    Returns:
      The Bloom filter from the first layer.
    See Also:
      - `getTarget()`

  - ### get

    public final T get(int depth)
    Gets the Bloom filter at the specified depth. The filter at depth 0 is the oldest filter.
    Parameters:
      `depth` - the depth at which the desired filter is to be found.
    Returns:
      the filter.
    Throws:
      `NoSuchElementException` - if depth is not in the range [0,filters.size())

  - ### getDepth

    public final int getDepth()
    Gets the number of filters in the LayerManager. In the default LayerManager implementation there is always at least one layer.
    Returns:
      the current depth.

  - ### getTarget

    public final T getTarget()
    Gets the current target filter. If a new filter should be created based on `extendCheck` it will be created before this method returns.
    Returns:
      the current target filter after any extension.

  - ### last

    public final T last()
    Gets the Bloom filter from the last layer. No extension check is performed during this call.
    Returns:
      The Bloom filter from the last layer.
    See Also:
      - `getTarget()`

  - ### processBloomFilters

    public boolean processBloomFilters(Predicate<BloomFilter> bloomFilterPredicate)
    Executes a Bloom filter Predicate on each Bloom filter in the manager in depth order. Oldest filter first.
    Specified by:
      `processBloomFilters` in interface `BloomFilterExtractor`
    Parameters:
      `bloomFilterPredicate` - the predicate to evaluate each Bloom filter with.
    Returns:
      `false` when the a filter fails the predicate test. Returns `true` if all filters pass the test.