package rocks.inspectit.shared.cs.indexing.buffer.impl; import java.util.ArrayList; import java.util.Map.Entry; import java.util.concurrent.ExecutorService; import rocks.inspectit.shared.all.communication.DefaultData; import rocks.inspectit.shared.cs.indexing.AbstractBranch; import rocks.inspectit.shared.cs.indexing.ITreeComponent; import rocks.inspectit.shared.cs.indexing.buffer.IBufferBranchIndexer; import rocks.inspectit.shared.cs.indexing.buffer.IBufferTreeComponent; /** * {@link Branch} is a {@link ITreeComponent} that holds references to other {@link ITreeComponent} * s, which are actually branch children. * * @author Ivan Senic * * @param <E> * Element type that the branch can index (and hold). */ public class Branch<E extends DefaultData> extends AbstractBranch<E, E> implements IBufferTreeComponent<E> { /** * Buffer branch indexer. */ private IBufferBranchIndexer<E> bufferBranchIndexer; /** * Default constructor. * * @param bufferBranchIndexer * Indexer. */ public Branch(IBufferBranchIndexer<E> bufferBranchIndexer) { super(bufferBranchIndexer); this.bufferBranchIndexer = bufferBranchIndexer; } /** * {@inheritDoc} */ @Override protected ITreeComponent<E, E> getNextTreeComponent(E element) { return bufferBranchIndexer.getNextTreeComponent(); } /** * {@inheritDoc} */ @Override public void cleanWithRunnable(ExecutorService executorService) { for (Entry<Object, ITreeComponent<E, E>> entry : getComponentMap().entrySet()) { if (entry.getValue() instanceof IBufferTreeComponent) { ((IBufferTreeComponent<E>) entry.getValue()).cleanWithRunnable(executorService); } } } /** * {@inheritDoc} */ @Override public boolean clean() { ArrayList<Object> keysToRemove = new ArrayList<>(); for (Entry<Object, ITreeComponent<E, E>> entry : getComponentMap().entrySet()) { if (entry.getValue() instanceof IBufferTreeComponent) { boolean toClear = ((IBufferTreeComponent<E>) entry.getValue()).clean(); if (toClear) { keysToRemove.add(entry.getKey()); } } } for (Object key : keysToRemove) { getComponentMap().remove(key); } if (getComponentMap().isEmpty()) { return true; } return false; } /** * {@inheritDoc} */ @Override public boolean clearEmptyComponents() { ArrayList<Object> keysToRemove = new ArrayList<>(); for (Entry<Object, ITreeComponent<E, E>> entry : getComponentMap().entrySet()) { if (entry.getValue() instanceof IBufferTreeComponent) { boolean toClear = ((IBufferTreeComponent<E>) entry.getValue()).clearEmptyComponents(); if (toClear) { keysToRemove.add(entry.getKey()); } } } for (Object key : keysToRemove) { getComponentMap().remove(key); } if (getComponentMap().isEmpty()) { return true; } return false; } /** * {@inheritDoc} */ @Override public long getNumberOfElements() { long sum = 0; for (ITreeComponent<E, E> treeComponent : getComponentMap().values()) { if (treeComponent instanceof IBufferTreeComponent) { sum += ((IBufferTreeComponent<E>) treeComponent).getNumberOfElements(); } } return sum; } /** * @return the bufferBranchIndexer */ public IBufferBranchIndexer<E> getBufferBranchIndexer() { return bufferBranchIndexer; } }