package context.arch.discoverer.component.dataModel; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import context.arch.discoverer.ComponentDescription; import context.arch.discoverer.component.AbstractCollectionElement; import context.arch.discoverer.component.AbstractElement; /** * Overrides IndexTable to add multiple keys each corresponding to an element (i.e. multiple elements are extracted each time). * * @author Brian Y. Lim * */ public abstract class IndicesTable<E> extends IndexTable<E> { private static final long serialVersionUID = -6749977918316326913L; @SuppressWarnings("unchecked") public IndicesTable(String indexName, AbstractCollectionElement<?,?> delegate) { super(indexName, (AbstractElement<E, ?, ?>) delegate); } /** * Deprecated so that subclasses should not use it. * @see #extractAttributes(ComponentDescription) */ @Override @Deprecated protected E extractKey(ComponentDescription component) { // extractKeys(ComponentDescription) method deprecated; use extractAttributes(ComponentDescription) instead. return null; } @SuppressWarnings("unchecked") protected Collection<E> extractKeys(ComponentDescription component) { return (Collection<E>) delegate.extractElement(component); } @Override public void addComponent(ComponentDescription component) { Collection<E> elementsAsKeys = extractKeys(component); for (E elementAsKey : elementsAsKeys) { List<ComponentDescription> components = super.get(elementAsKey); // create components entry if not done before if (components == null) { components = Collections.synchronizedList(new ArrayList<ComponentDescription>()); put(elementAsKey, components); } // add index to the vector; i.e. one of the indices for this component components.add(component); } } @Override public void removeComponent(ComponentDescription component) { Collection<E> elementsAsKeys = extractKeys(component); for (E elementAsKey : elementsAsKeys) { List<ComponentDescription> components = super.get(elementAsKey); if (components != null) { components.remove(component); if (components.isEmpty()) { super.remove(elementAsKey); } } } } }