package org.jactr.tools.grapher.core.probe; /* * default logging */ import java.util.ArrayList; import java.util.Collection; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import java.util.concurrent.Executor; import java.util.regex.Pattern; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jactr.core.utils.parameter.IParameterized; public abstract class AbstractParameterizedProbe<T> implements IProbe<T>, IPollingProbe<T> { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(AbstractParameterizedProbe.class); final protected T _parameterized; final private String _name; final protected TreeMap<String, Object> _parameterMap; final private TreeSet<String> _added; final private TreeSet<String> _removed; final private Collection<Pattern> _parameterPatterns; private boolean _shouldPoll = false; protected AbstractParameterizedProbe(String name, T parameterized) { _name = name; _parameterized = parameterized; _parameterMap = new TreeMap<String, Object>(); _added = new TreeSet<String>(); _removed = new TreeSet<String>(); _parameterPatterns = new ArrayList<Pattern>(); } public void setPollable(boolean pollable) { _shouldPoll = pollable; } public boolean isPolling() { return _shouldPoll; } public void update() { if (!_shouldPoll) { if (LOGGER.isDebugEnabled()) LOGGER.debug("Not polling"); return; } if (LOGGER.isDebugEnabled()) LOGGER.debug("Polling " + getTrackedName()); IParameterized parameterized = asParameterized(_parameterized); for (String parameter : parameterized.getPossibleParameters()) if (isValidParameterName(parameter)) set(parameter, parameterized.getParameter(parameter)); } abstract protected IParameterized asParameterized(T parameterizedObject); abstract protected AbstractParameterizedProbe<T> newInstance(T parameterized); public IProbe<T> instantiate(T parameterized) { AbstractParameterizedProbe<T> tracker = newInstance(parameterized); for (Pattern pattern : _parameterPatterns) tracker._parameterPatterns.add(pattern); tracker.setPollable(_shouldPoll); return tracker; } public void addPattern(String regex) { _parameterPatterns.add(Pattern.compile(regex)); } abstract public void install(T parameterized, Executor executor); synchronized public boolean getChanges(Set<String> additions, Map<String, Object> changes, Set<String> removed) { boolean changed = false; changed |= additions.addAll(_added); _added.clear(); changed |= !_parameterMap.isEmpty(); for (Map.Entry<String, Object> entry : _parameterMap.entrySet()) changes.put(entry.getKey(), entry.getValue()); _parameterMap.clear(); changed |= removed.addAll(_removed); _removed.clear(); return changed; } public String getTrackedName() { return _name; } protected boolean isValidParameterName(String parameter) { for (Pattern pattern : _parameterPatterns) if (pattern.matcher(parameter).matches()) return true; return false; } synchronized protected void set(String parameter, Object value) { if (!isValidParameterName(parameter)) { if (LOGGER.isDebugEnabled()) LOGGER .debug(parameter + " is not being tracked in " + getTrackedName()); return; } if (LOGGER.isDebugEnabled()) LOGGER.debug("Updated " + getTrackedName() + "." + parameter + " = " + value); if (!_parameterMap.containsKey(parameter)) { _added.add(parameter); _removed.remove(parameter); } _parameterMap.put(parameter, value); } synchronized protected void remove(String parameter) { if (!isValidParameterName(parameter)) return; _removed.add(parameter); _parameterMap.remove(parameter); } }