package org.jactr.tools.grapher.core.selector; /* * default logging */ import java.util.Collection; import java.util.concurrent.Executor; import javolution.util.FastList; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jactr.core.chunk.IChunk; import org.jactr.core.chunktype.IChunkType; import org.jactr.core.chunktype.event.ChunkTypeEvent; import org.jactr.core.chunktype.event.ChunkTypeListenerAdaptor; import org.jactr.core.chunktype.event.IChunkTypeListener; import org.jactr.core.concurrent.ExecutorServices; import org.jactr.tools.grapher.core.container.IProbeContainer; public class ChunkTypeSelector extends AbstractNameSelector<IChunkType> { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(ChunkTypeSelector.class); private Collection<ChunkSelector> _chunkSelectors; private IChunkTypeListener _listener; public ChunkTypeSelector(String regex) { super(regex); _chunkSelectors = FastList.newInstance(); _listener = new ChunkTypeListenerAdaptor() { @Override public void chunkAdded(ChunkTypeEvent cte) { checkChunk(cte.getChunk(), getProbeContainer(cte.getChunk() .getSymbolicChunk().getChunkType())); } }; } @Override protected String getName(IChunkType element) { return element.getSymbolicChunkType().getName(); } public void add(ISelector selector) { _chunkSelectors.add((ChunkSelector) selector); } @Override public IProbeContainer install(IChunkType element, IProbeContainer container) { IProbeContainer rtnContainer = super.install(element, container); Executor executor = ExecutorServices.INLINE_EXECUTOR; element.addListener(_listener, executor); /* * process the known chunks */ try { for (IChunk chunk : element.getSymbolicChunkType().getChunks()) checkChunk(chunk, rtnContainer); } catch (Exception e) { LOGGER.error("Could not extract chunks from " + element, e); } return rtnContainer; } protected void checkChunk(IChunk chunk, IProbeContainer container) { for (ChunkSelector selector : _chunkSelectors) if (selector.matches(chunk)) selector.install(chunk, container); } }