package net.sourceforge.pain.logic.trigger; import net.sourceforge.pain.data.*; import net.sourceforge.pain.logic.*; import java.util.*; public final class TriggerFactory { public static final String TRIGGER_PACKAGE_PREFIX = TriggerData.TRIGGER_LOGIC_PACKAGE_PREFIX; private static final Map cache = new HashMap(); private static Object[] paramsValues = new TriggerData[1]; private static Class[] paramsTypes = new Class[]{TriggerData.class}; private TriggerFactory() { } //todo: test cache performance: do we need it at all -->> yes reflection 10 times slower (jdk1.4.2) public static Trigger provideTrigger(TriggerData td) throws Exception { String classNameSuffix = td.getTriggerClassName(); Trigger sample = (Trigger) cache.get(classNameSuffix); if (sample == null) { Class c = Class.forName(TRIGGER_PACKAGE_PREFIX + classNameSuffix); sample = (Trigger) c.getDeclaredConstructor(paramsTypes).newInstance(paramsValues); cache.put(classNameSuffix, sample); } paramsValues[0] = td; Trigger t = sample.newInstance(td); paramsValues[0] = null; return t; } }