package org.jactr.tools.experiment.triggers; /* * default logging */ import java.util.ArrayList; import java.util.Collection; import java.util.Map; import java.util.TreeMap; import javolution.util.FastList; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jactr.tools.experiment.impl.IVariableContext; public class NamedTriggerManager { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(NamedTriggerManager.class); private Map<String, Collection<NamedTrigger>> _triggers = new TreeMap<String, Collection<NamedTrigger>>(); synchronized public void add(NamedTrigger trigger) { String name = trigger.getName().toLowerCase(); Collection<NamedTrigger> triggers = _triggers.get(name); if (triggers == null) { triggers = new ArrayList<NamedTrigger>(); _triggers.put(name, triggers); } triggers.add(trigger); } synchronized public void remove(NamedTrigger trigger) { String name = trigger.getName().toLowerCase(); Collection<NamedTrigger> triggers = _triggers.get(name); if (triggers != null) { triggers.remove(trigger); if (triggers.size() == 0) _triggers.remove(name); } } public boolean fire(String triggerName, IVariableContext context) { triggerName = triggerName.toLowerCase(); FastList<NamedTrigger> triggers = FastList.newInstance(); synchronized (this) { if (_triggers.containsKey(triggerName)) triggers.addAll(_triggers.get(triggerName)); } try { if (triggers == null) return false; boolean anyFired = false; for (NamedTrigger trigger : triggers) { trigger.fire(context); anyFired = true; } return anyFired; } finally { FastList.recycle(triggers); } } }