package rocks.inspectit.shared.cs.indexing.buffer.impl;
import org.apache.commons.lang.builder.ToStringBuilder;
import rocks.inspectit.shared.all.communication.DefaultData;
import rocks.inspectit.shared.all.indexing.IIndexQuery;
import rocks.inspectit.shared.cs.indexing.buffer.IBufferBranchIndexer;
import rocks.inspectit.shared.cs.indexing.buffer.IBufferTreeComponent;
import rocks.inspectit.shared.cs.indexing.indexer.IBranchIndexer;
/**
* Implementation of branch indexer for the {@link IBufferTreeComponent}. This indexer is delegating
* generation of the indexing keys to the {@link IBranchIndexer}.
*
* @author Ivan Senic
*
* @param <E>
* Type of the elements indexed.
*/
public class BufferBranchIndexer<E extends DefaultData> implements IBufferBranchIndexer<E> {
/**
* Delegate indexer.
*/
private IBranchIndexer<E> delegateIndexer;
/**
* Child indexer.
*/
private BufferBranchIndexer<E> childBufferIndexer;
/**
* Default constructor.
*
* @param delegateIndexer
* Delegate indexer that should generate keys.
*/
public BufferBranchIndexer(IBranchIndexer<E> delegateIndexer) {
this(delegateIndexer, null);
}
/**
* Secondary constructor.
*
* @param delegateIndexer
* Type of the delegate indexer that will actually generate keys for objects.
* @param childBufferIndexer
* Indexer to be used in the child branch.
*/
public BufferBranchIndexer(IBranchIndexer<E> delegateIndexer, BufferBranchIndexer<E> childBufferIndexer) {
this.delegateIndexer = delegateIndexer;
this.childBufferIndexer = childBufferIndexer;
}
/**
* {@inheritDoc}
*/
@Override
public Object getKey(E element) {
return delegateIndexer.getKey(element);
}
/**
* {@inheritDoc}
*/
@Override
public Object[] getKeys(IIndexQuery query) {
return delegateIndexer.getKeys(query);
}
/**
* {@inheritDoc}
*/
@Override
public IBufferBranchIndexer<E> getChildIndexer() {
return childBufferIndexer;
}
/**
* {@inheritDoc}
*/
@Override
public boolean sharedInstance() {
return delegateIndexer.sharedInstance();
}
/**
* {@inheritDoc}
*/
@Override
public IBufferBranchIndexer<E> getNewInstance() {
if (!sharedInstance()) {
BufferBranchIndexer<E> bufferBranchIndexer = new BufferBranchIndexer<>(delegateIndexer.getNewInstance(), childBufferIndexer);
return bufferBranchIndexer;
} else {
throw new UnsupportedOperationException("Method getNewInstance() called on the Indexer that has a shared instance.");
}
}
/**
* {@inheritDoc}
*/
@Override
public IBufferTreeComponent<E> getNextTreeComponent() {
if (null != childBufferIndexer) {
if (childBufferIndexer.sharedInstance()) {
return new Branch<>(childBufferIndexer);
} else {
return new Branch<>(childBufferIndexer.getNewInstance());
}
} else {
return new Leaf<>();
}
}
/**
* Gets {@link #delegateIndexer}.
*
* @return {@link #delegateIndexer}
*/
IBranchIndexer<E> getDelegateIndexer() {
return delegateIndexer;
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
ToStringBuilder toStringBuilder = new ToStringBuilder(this);
toStringBuilder.append("delegateIndexer", delegateIndexer);
return toStringBuilder.toString();
}
}