I found a bug in the digester.
It happens when you use the rules written in xml
instead of writing them in the code (see code below).
The bug happens when you use "<call-param-rule />" in
the xml file.

try
{
FileInputStream fis = new
FileInputStream(configFileName);
// the file "config-rules.xml" contains rules written 
//in xml
URL url = getClass().getResource("config-rules.xml");
BatchContext config =  (BatchContext) 
DigesterLoader.load(url, getClass().getClassLoader(),
fis, this);
fis.close();
}
catch(DigesterLoadingException dle)
{
throw new BatchException(dle);   
}
catch (SAXException ioe)
{
ioe.printStackTrace();
throw new BatchException(ioe);
}
catch (IOException ioe)
{
throw new BatchException(ioe);
}
 


___________________________________________________________
Do You Yahoo!? -- Une adresse @yahoo.fr gratuite et en français !
Yahoo! Mail : http://fr.mail.yahoo.com
    public void addRuleInstances(Digester digester) {
        final String ruleClassName = Rule.class.getName();
        digester.register(DIGESTER_PUBLIC_ID, getDigesterRulesDTD());

        digester.addRule("*/pattern", new PatternRule(digester, "value"));

        digester.addRule("*/include", new IncludeRule(digester));

        digester.addFactoryCreate("*/call-method-rule", new CallMethodRuleFactory());
        digester.addRule("*/call-method-rule", new PatternRule(digester, "pattern"));
        digester.addSetNext("*/call-method-rule", "add", ruleClassName);

         
/********************************************************************************/
        //
        // Modified by Philippe Mouawad
        //

        digester.addFactoryCreate("*/call-param-rule", new CallParamRuleFactory());
        digester.addRule("*/call-param-rule", new PatternRule(digester, "pattern"));
        digester.addSetNext("*/call-param-rule", "add", ruleClassName);

        //
        // End of modification
        //
         
/********************************************************************************/

        digester.addFactoryCreate("*/factory-create-rule", new 
FactoryCreateRuleFactory());
        digester.addRule("*/factory-create-rule", new PatternRule(digester, 
"pattern"));
        digester.addSetNext("*/factory-create-rule", "add", ruleClassName);

        digester.addFactoryCreate("*/object-create-rule", new 
ObjectCreateRuleFactory());
        digester.addRule("*/object-create-rule", new PatternRule(digester, "pattern"));
        digester.addSetNext("*/object-create-rule", "add", ruleClassName);

        digester.addFactoryCreate("*/set-properties-rule", new 
SetPropertiesRuleFactory());
        digester.addRule("*/set-properties-rule", new PatternRule(digester, 
"pattern"));
        digester.addSetNext("*/set-properties-rule", "add", ruleClassName);

        digester.addRule("*/set-properties-rule/alias", new 
SetPropertiesAliasRule(digester));

        digester.addFactoryCreate("*/set-property-rule", new SetPropertyRuleFactory());
        digester.addRule("*/set-property-rule", new PatternRule(digester, "pattern"));
        digester.addSetNext("*/set-property-rule", "add", ruleClassName);

        digester.addFactoryCreate("*/set-top-rule", new SetTopRuleFactory());
        digester.addRule("*/set-top-rule", new PatternRule(digester, "pattern"));
        digester.addSetNext("*/set-top-rule", "add", ruleClassName);

        digester.addFactoryCreate("*/set-next-rule", new SetNextRuleFactory());
        digester.addRule("*/set-next-rule", new PatternRule(digester, "pattern"));
        digester.addSetNext("*/set-next-rule", "add", ruleClassName);
    }


    protected class CallParamRuleFactory extends AbstractObjectCreationFactory {

// Old code
//        public Object createObject(Attributes attributes) {
//            // create callmethodrule
//            int paramNumber = Integer.parseInt(attributes.getValue("paramnumber"));
//            String methodName = attributes.getValue("attrname");
//            Rule callMethodRule = new CallMethodRule(targetDigester, methodName,
//                    paramNumber);
//            return callMethodRule;
//        }
// End of old code

         
/********************************************************************************/
        //
        // Modified by Philippe Mouawad
        //
        //
        // Modified by Philippe Mouawad
        //
        public Object createObject(Attributes attributes) {
            // create callmethodrule
            int paramNumber = Integer.parseInt(attributes.getValue("paramnumber"));
            String attrName = attributes.getValue("attrname");
            Rule callParamRule = new CallParamRule(targetDigester, paramNumber, 
attrName);
            return callParamRule ;
        }

        //
        // End of modification
        //
         
/********************************************************************************/

    }
--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to