skitching 2004/03/27 22:12:29 Modified: digester/src/java/org/apache/commons/digester/plugins Tag: DIGESTER_PLUGIN_REFACTORING_BRANCH PluginManager.java Log: * Now holds a reference to a PerDigesterResources object * added findLoader method which scans the list of RuleFinders in the PerDigesterResources object to find a suitable RuleLoader for a plugin declaration. Revision Changes Path No revision No revision 1.9.2.1 +60 -5 jakarta-commons/digester/src/java/org/apache/commons/digester/plugins/PluginManager.java Index: PluginManager.java =================================================================== RCS file: /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/plugins/PluginManager.java,v retrieving revision 1.9 retrieving revision 1.9.2.1 diff -u -r1.9 -r1.9.2.1 --- PluginManager.java 29 Feb 2004 02:22:15 -0000 1.9 +++ PluginManager.java 28 Mar 2004 06:12:29 -0000 1.9.2.1 @@ -17,6 +17,9 @@ package org.apache.commons.digester.plugins; import java.util.HashMap; +import java.util.List; +import java.util.Properties; +import java.util.Iterator; import org.apache.commons.digester.Digester; @@ -26,8 +29,7 @@ * Coordinates between PluginDeclarationRule and PluginCreateRule objects, * providing a place to share data between instances of these rules. * <p> - * One instance of this class exists per PluginRules instance, - * ie one per Digester instance. + * One instance of this class exists per PluginRules instance. */ public class PluginManager { @@ -40,16 +42,25 @@ /** the parent manager to which this one may delegate lookups. */ private PluginManager parent; - + + /** + * The object containing data that should only exist once for each + * Digester instance. + */ + private PerDigesterResources perDigesterResources; + //------------------- constructors --------------------------------------- /** Constructor. */ - public PluginManager() { + public PluginManager(PerDigesterResources r) { + perDigesterResources = r; } /** Constructor. */ - public PluginManager(PluginManager parent) { + public PluginManager(PerDigesterResources r, PluginManager parent) { this.parent = parent; + this.perDigesterResources = r; + // assert r == parent.perDigesterResources } //------------------- methods -------------------------------------------- @@ -112,5 +123,49 @@ } return decl; + } + + /** + * Given a plugin class and some associated properties, scan the + * list of known RuleFinder instances until one detects a source of + * custom rules for this plugin (aka a RuleLoader). + * <p> + * If no source of custom rules can be found, null is returned. + */ + public RuleLoader findLoader(Digester digester, String id, + Class pluginClass, Properties props) + throws PluginException { + + // iterate over the list of RuleFinders, trying each one + // until one of them locates a source of dynamic rules given + // this specific plugin class and the associated declaration + // properties. + Log log = LogUtils.getLogger(digester); + boolean debug = log.isDebugEnabled(); + log.debug("scanning ruleFinders to locate loader.."); + + List ruleFinders = perDigesterResources.getRuleFinders(); + RuleLoader ruleLoader = null; + try { + for(Iterator i = ruleFinders.iterator(); + i.hasNext() && ruleLoader == null; ) { + + RuleFinder finder = (RuleFinder) i.next(); + if (debug) { + log.debug("checking finder of type " + finder.getClass().getName()); + } + ruleLoader = finder.findLoader(digester, pluginClass, props); + } + } + catch(PluginException e) { + throw new PluginException( + "Unable to locate plugin rules for plugin" + + " with id [" + id + "]" + + ", and class [" + pluginClass.getName() + "]" + + ":" + e.getMessage(), e.getCause()); + } + log.debug("scanned ruleFinders."); + + return ruleLoader; } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]