You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by sk...@apache.org on 2004/04/14 10:30:54 UTC
cvs commit: jakarta-commons/digester/src/java/org/apache/commons/digester/plugins PluginDeclarationRule.java
skitching 2004/04/14 01:30:54
Modified: digester/src/java/org/apache/commons/digester/plugins
PluginDeclarationRule.java
Log:
* Move guts of implementation to a public static method where it can be
called from other code to "manually" add plugin declarations.
* Remove restriction on redeclaring plugins and mapping two ids to the
same plugin. These were both due to limitations on earlier plugins
implementations that no longer apply with the latest code.
Revision Changes Path
1.13 +32 -44 jakarta-commons/digester/src/java/org/apache/commons/digester/plugins/PluginDeclarationRule.java
Index: PluginDeclarationRule.java
===================================================================
RCS file: /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/plugins/PluginDeclarationRule.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- PluginDeclarationRule.java 8 Apr 2004 06:11:37 -0000 1.12
+++ PluginDeclarationRule.java 14 Apr 2004 08:30:54 -0000 1.13
@@ -66,71 +66,59 @@
org.xml.sax.Attributes attributes)
throws java.lang.Exception {
+ int nAttrs = attributes.getLength();
+ Properties props = new Properties();
+ for(int i=0; i<nAttrs; ++i) {
+ String key = attributes.getLocalName(i);
+ if ((key == null) || (key.length() == 0)) {
+ key = attributes.getQName(i);
+ }
+ String value = attributes.getValue(i);
+ props.setProperty(key, value);
+ }
+
+ try {
+ declarePlugin(digester, props);
+ } catch(PluginInvalidInputException ex) {
+ throw new PluginInvalidInputException(
+ "Error on element [" + digester.getMatch() +
+ "]: " + ex.getMessage());
+ }
+ }
+
+ public static void declarePlugin(Digester digester, Properties props)
+ throws PluginException {
+
Log log = digester.getLogger();
boolean debug = log.isDebugEnabled();
- String id = attributes.getValue("id");
- String pluginClassName = attributes.getValue("class");
+ String id = props.getProperty("id");
+ String pluginClassName = props.getProperty("class");
if (id == null) {
throw new PluginInvalidInputException(
- "mandatory attribute id not present on tag" +
- " <" + name + ">");
+ "mandatory attribute id not present on plugin declaration");
}
if (pluginClassName == null) {
throw new PluginInvalidInputException(
- "mandatory attribute class not present on tag" +
- " <" + name + ">");
+ "mandatory attribute class not present on plugin declaration");
}
- int nAttrs = attributes.getLength();
- Properties props = new Properties();
- for(int i=0; i<nAttrs; ++i) {
- String key = attributes.getLocalName(i);
- if ((key == null) || (key.length() == 0)) {
- key = attributes.getQName(i);
- }
- String value = attributes.getValue(i);
- props.setProperty(key, value);
- }
-
Declaration newDecl = new Declaration(pluginClassName);
newDecl.setId(id);
newDecl.setProperties(props);
PluginRules rc = (PluginRules) digester.getRules();
PluginManager pm = rc.getPluginManager();
- Declaration oldDecl = pm.getDeclarationById(id);
- if (oldDecl != null) {
- if (oldDecl.isEquivalent(newDecl)) {
- // this is a redeclaration of the same plugin mapping.
- // this could happen when using xml Entities to include
- // external files into the main config file, or to include
- // the same external file at multiple locations within a
- // parent document. if the declaration is identical,
- // then we just ignore it.
- if (debug) {
- log.debug("plugin redeclaration is identical: ignoring");
- }
- return;
- } else {
- throw new PluginInvalidInputException(
- "Plugin id [" + id + "] is not unique");
- }
- }
-
- // check whether this class has already been mapped to a different
- // name. It might be nice someday to allow this but lets keep it
- // simple for now.
- if (pm.getDeclarationByClass(pluginClassName) != null) {
- throw new PluginInvalidInputException(
- "Plugin id [" + id + "] maps to class [" + pluginClassName + "]" +
- " which has already been mapped by some other id.");
- }
newDecl.init(digester, pm);
pm.addDeclaration(newDecl);
+
+ // Note that it is perfectly safe to redeclare a plugin, because
+ // the declaration doesn't add any rules to digester; all it does
+ // is create a RuleLoader instance whch is *capable* of adding the
+ // rules to the digester.
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org