package org.jactr.tools.grapher.core.selector; /* * default logging */ import java.util.ArrayList; import java.util.Collection; import java.util.concurrent.Executor; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jactr.core.buffer.IActivationBuffer; import org.jactr.core.chunk.IChunk; import org.jactr.core.chunktype.IChunkType; import org.jactr.core.concurrent.ExecutorServices; import org.jactr.core.extensions.IExtension; import org.jactr.core.model.IModel; import org.jactr.core.model.event.ModelEvent; import org.jactr.core.model.event.ModelListenerAdaptor; import org.jactr.core.module.IModule; import org.jactr.core.module.declarative.event.DeclarativeModuleEvent; import org.jactr.core.module.declarative.event.DeclarativeModuleListenerAdaptor; import org.jactr.core.module.declarative.event.IDeclarativeModuleListener; import org.jactr.core.module.procedural.event.IProceduralModuleListener; import org.jactr.core.module.procedural.event.ProceduralModuleEvent; import org.jactr.core.module.procedural.event.ProceduralModuleListenerAdaptor; import org.jactr.core.production.IProduction; import org.jactr.core.utils.parameter.IParameterized; import org.jactr.instrument.IInstrument; import org.jactr.tools.grapher.core.container.IProbeContainer; public class ModelSelector extends AbstractNameSelector<IModel> { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(ModelSelector.class); private IProceduralModuleListener _proceduralListener; private IDeclarativeModuleListener _declarativeListener; private Collection<ProductionSelector> _productionSelectors; private Collection<ChunkSelector> _chunkSelectors; private Collection<ChunkTypeSelector> _chunkTypeSelectors; private Collection<ModuleSelector> _moduleSelectors; private Collection<BufferSelector> _bufferSelectors; private Collection<ExtensionSelector> _extensionSelectors; private Collection<InstrumentSelector> _instrumentSelectors; public ModelSelector(String regex) { super(regex); _productionSelectors = new ArrayList<ProductionSelector>(); _chunkSelectors = new ArrayList<ChunkSelector>(); _chunkTypeSelectors = new ArrayList<ChunkTypeSelector>(); _moduleSelectors = new ArrayList<ModuleSelector>(); _extensionSelectors = new ArrayList<ExtensionSelector>(); _bufferSelectors = new ArrayList<BufferSelector>(); _instrumentSelectors = new ArrayList<InstrumentSelector>(); _proceduralListener = new ProceduralModuleListenerAdaptor() { @Override public void productionAdded(ProceduralModuleEvent pme) { checkProduction(pme.getProduction(), getProbeContainer(pme.getSource() .getModel())); } }; _declarativeListener = new DeclarativeModuleListenerAdaptor() { @Override public void chunkAdded(DeclarativeModuleEvent dme) { checkChunk(dme.getChunk(), getProbeContainer(dme.getSource().getModel())); } @Override public void chunkTypeAdded(DeclarativeModuleEvent dme) { checkChunkType(dme.getChunkType(), getProbeContainer(dme.getSource() .getModel())); } }; } public void add(ISelector selector) { selector.setGroupId(getGroupId()); if (selector instanceof ProductionSelector) _productionSelectors.add((ProductionSelector) selector); else if (selector instanceof ChunkSelector) _chunkSelectors.add((ChunkSelector) selector); else if (selector instanceof ChunkTypeSelector) _chunkTypeSelectors.add((ChunkTypeSelector) selector); else if (selector instanceof ModuleSelector) _moduleSelectors.add((ModuleSelector) selector); else if (selector instanceof BufferSelector) _bufferSelectors.add((BufferSelector) selector); else if (selector instanceof ExtensionSelector) _extensionSelectors.add((ExtensionSelector) selector); else if (selector instanceof InstrumentSelector) _instrumentSelectors.add((InstrumentSelector) selector); } @Override protected String getContainerName(IModel element) { if (getGroupId().length() == 0) return getName(element); return getName(element) + "." + getGroupId(); } @Override public IProbeContainer install(IModel element, IProbeContainer container) { container = super.install(element, container); // Executor executor = ExecutorServices // .getExecutor(ExecutorServices.BACKGROUND); Executor executor = ExecutorServices.INLINE_EXECUTOR; element.getProceduralModule().addListener(_proceduralListener, executor); element.getDeclarativeModule().addListener(_declarativeListener, executor); element.addListener(new ModelListenerAdaptor() { @Override public void extensionInstalled(ModelEvent me) { IExtension extension = me.getExtension(); if (extension instanceof IParameterized) checkGeneral(extension, getProbeContainer(me.getSource()), _extensionSelectors); } @Override public void instrumentInstalled(ModelEvent me) { IInstrument instrument = me.getInstrument(); if (instrument instanceof IParameterized) checkGeneral((IParameterized) instrument, getProbeContainer(me.getSource()), _instrumentSelectors); } @Override public void moduleInstalled(ModelEvent me) { IModule module = me.getModule(); if (module instanceof IParameterized) checkGeneral((IParameterized) module, getProbeContainer(me.getSource()), _moduleSelectors); } }, executor); try { for (IModule module : element.getModules()) if (module instanceof IParameterized) checkGeneral((IParameterized) module, container, _moduleSelectors); for (IExtension extension : element.getExtensions()) checkGeneral(extension, container, _extensionSelectors); for (IActivationBuffer buffer : element.getActivationBuffers()) if (buffer instanceof IParameterized) checkGeneral((IParameterized) buffer, container, _bufferSelectors); for (IInstrument instrument : element.getInstruments()) if (instrument instanceof IParameterized) checkGeneral((IParameterized) instrument, container, _instrumentSelectors); for (IProduction production : element.getProceduralModule() .getProductions().get()) checkProduction(production, container); for (IChunkType chunkType : element.getDeclarativeModule() .getChunkTypes().get()) checkChunkType(chunkType, container); for (IChunk chunk : element.getDeclarativeModule().getChunks().get()) checkChunk(chunk, container); } catch (Exception e) { LOGGER.error("Could not get individual elements for selector matching ", e); } return container; } protected void checkProduction(IProduction production, IProbeContainer container) { for (ProductionSelector selector : _productionSelectors) if (selector.matches(production)) selector.install(production, container); } protected void checkChunk(IChunk chunk, IProbeContainer container) { for (ChunkSelector selector : _chunkSelectors) if (selector.matches(chunk)) selector.install(chunk, container); } protected void checkChunkType(IChunkType chunkType, IProbeContainer container) { for (ChunkTypeSelector selector : _chunkTypeSelectors) if (selector.matches(chunkType)) selector.install(chunkType, container); } protected void checkGeneral(IParameterized parameterized, IProbeContainer container, Collection<? extends ClassNamedParameterSelector> selectors) { for (ClassNamedParameterSelector selector : selectors) if (selector.matches(parameterized)) selector.install(parameterized, container); } @Override protected String getName(IModel element) { return element.getName(); } }