package org.jactr.tools.grapher.core.selector;
/*
* default logging
*/
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.Executor;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jactr.core.concurrent.ExecutorServices;
import org.jactr.tools.grapher.core.container.IProbeContainer;
import org.jactr.tools.grapher.core.container.ProbeContainer;
import org.jactr.tools.grapher.core.probe.IProbe;
import org.jactr.tools.marker.markerof.IMarkerOf;
public abstract class AbstractNameSelector<T> implements ISelector<T>
{
/**
* Logger definition
*/
static private final transient Log LOGGER = LogFactory
.getLog(AbstractNameSelector.class);
private Matcher _patternMatcher;
private Collection<IProbe<T>> _trackerTemplates;
private Collection<IMarkerOf<T>> _markersOf;
private Map<String, IProbeContainer> _containers;
private String _groupId = "";
public AbstractNameSelector(String regex)
{
_patternMatcher = Pattern.compile(regex).matcher("");
_trackerTemplates = new ArrayList<IProbe<T>>();
_containers = new TreeMap<String, IProbeContainer>();
_markersOf = new ArrayList<IMarkerOf<T>>();
}
public void setGroupId(String group)
{
_groupId = group;
}
public String getGroupId()
{
return _groupId;
}
public void add(IProbe<T> tracker)
{
_trackerTemplates.add(tracker);
}
public void add(IMarkerOf<T> markerOf)
{
_markersOf.add(markerOf);
}
abstract protected String getName(T element);
public boolean matches(T element)
{
String name = getName(element);
if (name != null)
{
_patternMatcher.reset(name);
boolean matched = _patternMatcher.matches();
if (LOGGER.isDebugEnabled())
LOGGER.debug(_patternMatcher + " matches " + name + " : " + matched);
return matched;
}
else if (LOGGER.isDebugEnabled()) LOGGER.debug("null name for " + element);
return false;
}
protected IProbeContainer getProbeContainer(T element)
{
return _containers.get(getContainerName(element));
}
protected String getContainerName(T element)
{
return getName(element);
}
public IProbeContainer install(T element, IProbeContainer container)
{
String name = getContainerName(element);
container = new ProbeContainer(name, container);
_containers.put(name, container);
if (LOGGER.isDebugEnabled())
LOGGER.debug("Installed probe container into " + name);
Executor executor = ExecutorServices
.getExecutor(ExecutorServices.BACKGROUND);
// Executor executor = ExecutorServices.INLINE_EXECUTOR;
for (IProbe<T> tracker : _trackerTemplates)
{
tracker = tracker.instantiate(element);
if (LOGGER.isDebugEnabled()) LOGGER.debug("Installing probe " + tracker);
tracker.install(element, executor);
container.add(tracker);
}
installMarkersOf(element);
return container;
}
public void installMarkersOf(T element)
{
for (IMarkerOf<T> marker : _markersOf)
marker.install(element);
}
}