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/03/28 08:01:58 UTC

cvs commit: jakarta-commons/digester/src/java/org/apache/commons/digester/plugins PluginCreateRule.java

skitching    2004/03/27 22:01:58

  Modified:    digester/src/java/org/apache/commons/digester/plugins Tag:
                        DIGESTER_PLUGIN_REFACTORING_BRANCH
                        PluginCreateRule.java
  Log:
  * Remove ugly static members formerly used to store default xml-attribute
    names for plugin id and class into. This info is now stored on a
    PerDigesterResources object and accessed via methods on the PluginRules
    class.
  * This change does affect the public API/behaviour of the PluginCreateRule
    class. However plugins have never been present in a public Digester
    release, and this feature (setting default xml attr names) is not
    a commonly-used feature.
  * Also minor changes due to change in Declaration class API.
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.14.2.1  +84 -132   jakarta-commons/digester/src/java/org/apache/commons/digester/plugins/PluginCreateRule.java
  
  Index: PluginCreateRule.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/plugins/PluginCreateRule.java,v
  retrieving revision 1.14
  retrieving revision 1.14.2.1
  diff -u -r1.14 -r1.14.2.1
  --- PluginCreateRule.java	23 Mar 2004 07:11:00 -0000	1.14
  +++ PluginCreateRule.java	28 Mar 2004 06:01:57 -0000	1.14.2.1
  @@ -33,31 +33,13 @@
    */
   public class PluginCreateRule extends Rule implements InitializableRule {
   
  -    // the xml attribute the user uses on an xml element to specify
  -    // the plugin's class
  -    public static final String GLOBAL_PLUGIN_CLASS_ATTR_NS = null;
  -    public static final String GLOBAL_PLUGIN_CLASS_ATTR = "plugin-class";
  -
  -    // the xml attribute the user uses on an xml element to specify
  -    // the plugin's class
  -    public static final String GLOBAL_PLUGIN_ID_ATTR_NS = null;
  -    public static final String GLOBAL_PLUGIN_ID_ATTR = "plugin-id";
  -    
  -    // see setGlobalPluginClassAttribute
  -    private static String globalPluginClassAttrNs = GLOBAL_PLUGIN_CLASS_ATTR_NS;
  -    private static String globalPluginClassAttr = GLOBAL_PLUGIN_CLASS_ATTR;
  -
  -    // see setGlobalPluginIdAttribute
  -    private static String globalPluginIdAttrNs = GLOBAL_PLUGIN_ID_ATTR_NS;
  -    private static String globalPluginIdAttr = GLOBAL_PLUGIN_ID_ATTR;
  -    
       // see setPluginClassAttribute
  -    private String pluginClassAttrNs = globalPluginClassAttrNs;
  -    private String pluginClassAttr = globalPluginClassAttr;
  +    private String pluginClassAttrNs = null;
  +    private String pluginClassAttr = null;
       
       // see setPluginIdAttribute
  -    private String pluginIdAttrNs = globalPluginIdAttrNs;
  -    private String pluginIdAttr = globalPluginIdAttr;
  +    private String pluginIdAttrNs = null;
  +    private String pluginIdAttr = null;
       
       /**
        * In order to invoke the addRules method on the plugin class correctly,
  @@ -83,76 +65,6 @@
        */
       private PluginConfigurationException initException;
   
  -    //-------------------- static methods -----------------------------------
  -    
  -    /**
  -     * Sets the xml attribute which the input xml uses to indicate to a 
  -     * PluginCreateRule which class should be instantiated.
  -     * <p>
  -     * Example:
  -     * <pre>
  -     * PluginCreateRule.setGlobalPluginClassAttribute(null, "class");
  -     * </pre>
  -     * will allow this in the input xml:
  -     * <pre>
  -     *  [root]
  -     *    [some-plugin class="com.acme.widget"] ......
  -     * </pre>
  -     *
  -     * Note that this changes the default for <i>all</i> PluginCreateRule
  -     * instances. To override just specific PluginCreateRule instances (which
  -     * may be more friendly in container-based environments), see method
  -     * setPluginClassAttribute.
  -     *
  -     * @param namespaceUri is the namespace uri that the specified attribute
  -     * is in. If the attribute is in no namespace, then this should be null.
  -     * Note that if a namespace is used, the attrName value should <i>not</i>
  -     * contain any kind of namespace-prefix. Note also that if you are using
  -     * a non-namespace-aware parser, this parameter <i>must</i> be null.
  -     *
  -     * @param attrName is the attribute whose value contains the name of the
  -     * class to be instantiated.
  -     */
  -    public static void setGlobalPluginClassAttribute(String namespaceUri, 
  -                                                     String attrName) {
  -        globalPluginClassAttrNs = namespaceUri;
  -        globalPluginClassAttr = attrName;
  -    }
  -
  -    /**
  -     * Sets the xml attribute which the input xml uses to indicate to a 
  -     * PluginCreateRule which plugin declaration is being referenced.
  -     * <p>
  -     * Example:
  -     * <pre>
  -     * PluginCreateRule.setGlobalPluginIdAttribute(null, "id");
  -     * </pre>
  -     * will allow this in the input xml:
  -     * <pre>
  -     *  [root]
  -     *    [some-plugin id="widget"] ......
  -     * </pre>
  -     *
  -     * Note that this changes the default for <i>all</i> PluginCreateRule
  -     * instances. To override just specific PluginCreateRule instances (which
  -     * may be more friendly in container-based environments), see method
  -     * setPluginIdAttribute.
  -     *
  -     * @param namespaceUri is the namespace uri that the specified attribute
  -     * is in. If the attribute is in no namespace, then this should be null.
  -     * Note that if a namespace is used, the attrName value should <i>not</i>
  -     * contain any kind of namespace-prefix. Note also that if you are using
  -     * a non-namespace-aware parser, this parameter <i>must</i> be null.
  -     *
  -     * @param attrName is the attribute whose value contains the id of the
  -     * plugin declaration to be used when instantiating an object.
  -     */
  -    public static void setGlobalPluginIdAttribute(String namespaceUri, 
  -                                                  String attrName) {
  -        globalPluginIdAttrNs = namespaceUri;
  -        globalPluginIdAttr = attrName;
  -    }
  -
       //-------------------- constructors -------------------------------------
   
       /**
  @@ -163,7 +75,6 @@
        * descended from.
        */
       public PluginCreateRule(Class baseClass) {
  -        super();
           this.baseClass = baseClass;
       }
   
  @@ -179,50 +90,42 @@
        * custom rules installed for it just like a declared plugin.
        */
       public PluginCreateRule(Class baseClass, Class dfltPluginClass) {
  -        super();
           this.baseClass = baseClass;
           if (dfltPluginClass != null) {
               defaultPlugin = new Declaration(dfltPluginClass);
           }
       }
   
  -    //------------------- properties ---------------------------------------
  +    /**
  +     * Create a plugin rule where the user <i>may</i> specify a plugin.
  +     * If the user doesn't specify a plugin, then the default class specified 
  +     * in this constructor is used.
  +     * 
  +     * @param baseClass is the class which any specified plugin <i>must</i> be
  +     * descended from.
  +     * @param dfltPluginClass is the class which will be used if the user
  +     * doesn't specify any plugin-class or plugin-id. This class will have
  +     * custom rules installed for it just like a declared plugin.
  +     * @param dfltPluginRuleLoader is a RuleLoader instance which knows how
  +     * to load the custom rules associated with this default plugin.
  +     */
  +    public PluginCreateRule(Class baseClass, Class dfltPluginClass,
  +                    RuleLoader dfltPluginRuleLoader) {
   
  -    public void setDefaultRuleMethod(String dfltPluginRuleMethod) {
  -        if (defaultPlugin != null) {
  -            defaultPlugin.setRuleMethod(dfltPluginRuleMethod);
  -        }
  -    }
  -    
  -    public void setDefaultRuleClass(Class dfltPluginRuleClass) {
  -        if (defaultPlugin != null) {
  -            defaultPlugin.setRuleClass(dfltPluginRuleClass);
  -        }
  -    }
  -    
  -    public void setDefaultRuleResource(String dfltPluginRuleResource) {
  -        if (defaultPlugin != null) {
  -            defaultPlugin.setRuleResource(dfltPluginRuleResource);
  -        }
  -    }
  -    
  -    public void setDefaultRuleFile(String dfltPluginRuleFile) {
  -        if (defaultPlugin != null) {
  -            defaultPlugin.setRuleFile(new File(dfltPluginRuleFile));
  +        this.baseClass = baseClass;
  +        if (dfltPluginClass != null) {
  +            defaultPlugin = 
  +                new Declaration(dfltPluginClass, dfltPluginRuleLoader);
           }
       }
   
  -    public void setDefaultRuleAutoSetProperties(boolean enabled) {
  -        if (defaultPlugin != null) {
  -            defaultPlugin.setAutoSetProperties(enabled);
  -        }
  -    }
  +    //------------------- properties ---------------------------------------
       
       /**
        * Sets the xml attribute which the input xml uses to indicate to a 
        * PluginCreateRule which class should be instantiated.
        * <p>
  -     * See setGlobalPluginClassAttribute for more info.
  +     * See {@link PluginRules#setPluginClassAttribute} for more info.
        */
       public void setPluginClassAttribute(String namespaceUri, String attrName) {
           pluginClassAttrNs = namespaceUri;
  @@ -233,7 +136,7 @@
        * Sets the xml attribute which the input xml uses to indicate to a 
        * PluginCreateRule which plugin declaration is being referenced.
        * <p>
  -     * See setGlobalPluginIdAttribute for more info.
  +     * See {@link PluginRules#setPluginIdAttribute} for more info.
        */
       public void setPluginIdAttribute(String namespaceUri, String attrName) {
           pluginIdAttrNs = namespaceUri;
  @@ -257,7 +160,7 @@
           boolean debug = log.isDebugEnabled();
           if (debug) {
               log.debug("PluginCreateRule.postRegisterInit" + 
  -                      ": rule registered for pattern [" + pattern + "]");
  +                      ": rule registered for pattern [" + matchPattern + "]");
           }
   
           if (digester == null) {
  @@ -309,6 +212,9 @@
               baseClass = Object.class;
           }
           
  +        PluginRules rules = (PluginRules) digester.getRules();
  +        PluginManager pm = rules.getPluginManager();
  +
           // check default class is valid
           if (defaultPlugin != null) {
               if (!baseClass.isAssignableFrom(defaultPlugin.getPluginClass())) {
  @@ -321,9 +227,9 @@
               }
   
               try {
  -                defaultPlugin.init(digester);
  +                defaultPlugin.init(digester, pm);
                   
  -            } catch(PluginWrappedException pwe) {
  +            } catch(PluginException pwe) {
               
                   throw new PluginConfigurationException(
                       pwe.getMessage(), pwe.getCause());
  @@ -332,6 +238,48 @@
   
           // remember the pattern for later
           pattern = matchPattern;
  +        
  +        if (pluginClassAttr ==  null) {
  +            // the user hasn't set explicit xml attr names on this rule,
  +            // so fetch the default values
  +            pluginClassAttrNs = rules.getPluginClassAttrNs();
  +            pluginClassAttr = rules.getPluginClassAttr();
  +            
  +            if (debug) {
  +                log.debug(
  +                    "init: pluginClassAttr set to per-digester values ["
  +                    + "ns=" + pluginClassAttrNs 
  +                    + ", name=" + pluginClassAttr + "]");
  +            }
  +        } else {
  +            if (debug) {
  +                log.debug(
  +                    "init: pluginClassAttr set to rule-specific values ["
  +                    + "ns=" + pluginClassAttrNs 
  +                    + ", name=" + pluginClassAttr + "]");
  +            }
  +        }
  +        
  +        if (pluginIdAttr ==  null) {
  +            // the user hasn't set explicit xml attr names on this rule,
  +            // so fetch the default values
  +            pluginIdAttrNs = rules.getPluginIdAttrNs();
  +            pluginIdAttr = rules.getPluginIdAttr();
  +            
  +            if (debug) {
  +                log.debug(
  +                    "init: pluginIdAttr set to per-digester values ["
  +                    + "ns=" + pluginIdAttrNs 
  +                    + ", name=" + pluginIdAttr + "]");
  +            }
  +        } else {
  +            if (debug) {
  +                log.debug(
  +                    "init: pluginIdAttr set to rule-specific values ["
  +                    + "ns=" + pluginIdAttrNs 
  +                    + ", name=" + pluginIdAttr + "]");
  +            }
  +        }
       }
   
       /**
  @@ -407,21 +355,26 @@
           String pluginId; 
           if (pluginIdAttrNs == null) {
               pluginId = attributes.getValue(pluginIdAttr);
  -        }
  -        else {
  +        } else {
               pluginId = 
                   attributes.getValue(pluginIdAttrNs, pluginIdAttr);
           }
           
           if (pluginClassName != null) {
  +            // The user is using a plugin "inline", ie without a previous
  +            // explicit declaration. If they have used the same plugin class
  +            // before, we have already gone to the effort of creating a 
  +            // Declaration object, so retrieve it. If there is no existing
  +            // declaration object for this class, then create one.
  +
               currDeclaration = pluginManager.getDeclarationByClass(
                   pluginClassName);
   
               if (currDeclaration == null) {
                   currDeclaration = new Declaration(pluginClassName);
                   try {
  -                    currDeclaration.init(digester);
  -                } catch(PluginWrappedException pwe) {
  +                    currDeclaration.init(digester, pluginManager);
  +                } catch(PluginException pwe) {
                       throw new PluginInvalidInputException(
                           pwe.getMessage(), pwe.getCause());
                   }
  @@ -436,8 +389,7 @@
               }
           } else if (defaultPlugin != null) {
               currDeclaration = defaultPlugin;
  -        }
  -        else {
  +        } else {
               throw new PluginInvalidInputException(
                   "No plugin class specified for element " +
                   pattern);
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org