Return-Path: Delivered-To: apmail-jakarta-commons-dev-archive@www.apache.org Received: (qmail 12209 invoked from network); 28 Mar 2004 06:12:34 -0000 Received: from daedalus.apache.org (HELO mail.apache.org) (208.185.179.12) by minotaur-2.apache.org with SMTP; 28 Mar 2004 06:12:34 -0000 Received: (qmail 92529 invoked by uid 500); 28 Mar 2004 06:12:09 -0000 Delivered-To: apmail-jakarta-commons-dev-archive@jakarta.apache.org Received: (qmail 92474 invoked by uid 500); 28 Mar 2004 06:12:09 -0000 Mailing-List: contact commons-dev-help@jakarta.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Subscribe: List-Help: List-Post: List-Id: "Jakarta Commons Developers List" Reply-To: "Jakarta Commons Developers List" Delivered-To: mailing list commons-dev@jakarta.apache.org Received: (qmail 92460 invoked by uid 500); 28 Mar 2004 06:12:09 -0000 Received: (qmail 92457 invoked from network); 28 Mar 2004 06:12:09 -0000 Received: from unknown (HELO minotaur.apache.org) (209.237.227.194) by daedalus.apache.org with SMTP; 28 Mar 2004 06:12:09 -0000 Received: (qmail 12179 invoked by uid 1786); 28 Mar 2004 06:12:29 -0000 Date: 28 Mar 2004 06:12:29 -0000 Message-ID: <20040328061229.12178.qmail@minotaur.apache.org> From: skitching@apache.org To: jakarta-commons-cvs@apache.org Subject: cvs commit: jakarta-commons/digester/src/java/org/apache/commons/digester/plugins PluginManager.java X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N 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. *

- * 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). + *

+ * 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: commons-dev-unsubscribe@jakarta.apache.org For additional commands, e-mail: commons-dev-help@jakarta.apache.org