rdonkin     2003/10/22 11:28:58

  Modified:    digester/src/java/org/apache/commons/digester/xmlrules
                        DigesterLoader.java FromXmlRuleSet.java
               digester/src/test/org/apache/commons/digester/xmlrules
                        DigesterLoaderTest.java
  Log:
  Added ability to load xml rules from org.xml.sax.ImputSource to DigesterLoader
  
  Revision  Changes    Path
  1.9       +33 -3     
jakarta-commons/digester/src/java/org/apache/commons/digester/xmlrules/DigesterLoader.java
  
  Index: DigesterLoader.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/xmlrules/DigesterLoader.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- DigesterLoader.java       9 Oct 2003 21:09:48 -0000       1.8
  +++ DigesterLoader.java       22 Oct 2003 18:28:57 -0000      1.9
  @@ -70,7 +70,9 @@
   
   import org.apache.commons.digester.Digester;
   import org.apache.commons.digester.RuleSet;
  +
   import org.xml.sax.SAXException;
  +import org.xml.sax.InputSource;
   
   
   /**
  @@ -83,6 +85,34 @@
    */
   
   public class DigesterLoader {
  +
  +    /**
  +     * Creates a new digester and initializes it from the specified InputSource
  +     * @param inputSource load the xml rules from this InputSource
  +     * @return a new Digester initialized with the rules
  +     */
  +    public static Digester createDigester(InputSource rulesSource) {
  +        RuleSet ruleSet = new FromXmlRuleSet(rulesSource);
  +        Digester digester = new Digester();
  +        digester.addRuleSet(ruleSet);
  +        return digester;
  +    }
  +
  +    /**
  +     * Creates a new digester and initializes it from the specified InputSource.
  +     * This constructor allows the digester to be used to load the rules to be 
specified.
  +     * This allows properties to be configured on the Digester instance before it 
is used.
  +     *
  +     * @param inputSource load the xml rules from this InputSource
  +     * @param rulesDigester digester to load the specified XML file.
  +     * @return a new Digester initialized with the rules
  +     */
  +    public static Digester createDigester(InputSource rulesSource, Digester 
rulesDigester) {
  +        RuleSet ruleSet = new FromXmlRuleSet(rulesSource, rulesDigester);
  +        Digester digester = new Digester();
  +        digester.addRuleSet(ruleSet);
  +        return digester;
  +    }
   
       /**
        * Creates a new digester and initializes it from the specified XML file
  
  
  
  1.10      +97 -16    
jakarta-commons/digester/src/java/org/apache/commons/digester/xmlrules/FromXmlRuleSet.java
  
  Index: FromXmlRuleSet.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/xmlrules/FromXmlRuleSet.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- FromXmlRuleSet.java       9 Oct 2003 21:09:48 -0000       1.9
  +++ FromXmlRuleSet.java       22 Oct 2003 18:28:57 -0000      1.10
  @@ -68,6 +68,8 @@
   import org.apache.commons.digester.Digester;
   import org.apache.commons.digester.RuleSetBase;
   
  +import org.xml.sax.InputSource;
  +
   /**
    * A Digester rule set where the rules come from an XML file.
    *
  @@ -82,17 +84,17 @@
       /**
        * The file containing the Digester rules, in XML.
        */
  -    private URL xmlRules;
  +    private XMLRulesLoader rulesLoader;
   
       /**
        * The rule set for parsing the Digester rules
        */
       private DigesterRuleParser parser;
   
  -     /**
  -      * The digester for loading the rules xml.
  -      */
  -     private Digester rulesDigester;
  +    /**
  +        * The digester for loading the rules xml.
  +        */
  +    private Digester rulesDigester;
   
       /**
        * Constructs a FromXmlRuleSet using the default DigesterRuleParser and
  @@ -118,8 +120,8 @@
        * @param parser an instance of DigesterRuleParser, for parsing the rules from 
XML
        */
       public FromXmlRuleSet(URL rulesXml, DigesterRuleParser parser) {
  -             this(rulesXml, parser, new Digester());
  -     }
  +        this(rulesXml, parser, new Digester());
  +    }
   
       /**
        * @param rulesXml the path to the XML document defining the Digester rules
  @@ -127,11 +129,54 @@
        * @param rulesDigester the digester used to load the Xml rules.
        */
       public FromXmlRuleSet(URL rulesXml, DigesterRuleParser parser, Digester 
rulesDigester) {
  -        xmlRules = rulesXml;
  +        init(new URLXMLRulesLoader(rulesXml), parser, rulesDigester);
  +    }
  +
  +    /**
  +     * Constructs a FromXmlRuleSet using the default DigesterRuleParser and
  +     * rulesDigester.
  +     * @param inputSource load the xml rules from this InputSource
  +     */
  +    public FromXmlRuleSet(InputSource inputSource) {
  +        this(inputSource, new DigesterRuleParser(), new Digester());
  +    }
  +    
  +    /**
  +     * Constructs a FromXmlRuleSet using the default DigesterRuleParser and
  +     * a ruleDigester for loading the rules xml.
  +     * @param inputSource load the xml rules from this InputSource
  +     * @param rulesDigester the digester to read the rules xml.
  +     */
  +    public FromXmlRuleSet(InputSource inputSource, Digester rulesDigester) {
  +        this(inputSource, new DigesterRuleParser(), rulesDigester);
  +    }
  +
  +    /**
  +     * @param inputSource load the xml rules from this InputSource
  +     * @param parser an instance of DigesterRuleParser, for parsing the rules from 
XML
  +     */
  +    public FromXmlRuleSet(InputSource inputSource, DigesterRuleParser parser) {
  +        this(inputSource, parser, new Digester());
  +    }
  +
  +    /**
  +     * @param inputSource load the xml rules from this InputSource
  +     * @param parser an instance of DigesterRuleParser, for parsing the rules from 
XML
  +     * @param rulesDigester the digester used to load the Xml rules.
  +     */
  +    public FromXmlRuleSet(InputSource inputSource, DigesterRuleParser parser, 
Digester rulesDigester) {
  +        init(new InputSourceXMLRulesLoader(inputSource), parser, rulesDigester);
  +    }
  +    
  +    /**
  +     * Base constructor
  +     */
  +    private void init(XMLRulesLoader rulesLoader, DigesterRuleParser parser, 
Digester rulesDigester) {
  +        this.rulesLoader = rulesLoader;
           this.parser = parser;
           this.rulesDigester = rulesDigester;
       }
  -
  +    
       /**
        * Adds to the digester the set of Rule instances defined in the
        * XML file for this rule set.
  @@ -149,12 +194,48 @@
           rulesDigester.addRuleSet(parser);
           rulesDigester.push(parser);
   
  -        try {
  -            rulesDigester.parse(xmlRules.openStream());
  -        } catch (Exception ex) {
  -            throw new XmlLoadException(ex);
  +        rulesLoader.loadRules();
  +    }
  +    
  +    /** 
  +     * Worker class encapsulates loading mechanisms.
  +     * Private until some reason is found to make it public.
  +     */
  +    private abstract static class XMLRulesLoader {
  +        /** Load rules now */
  +        public abstract void loadRules()  throws XmlLoadException;
  +    }
  +    
  +    /** Loads XMLRules from an URL */
  +    private class URLXMLRulesLoader extends XMLRulesLoader {
  +        private URL url;
  +        public URLXMLRulesLoader(URL url) {
  +            this.url = url;
  +        }
  +        
  +        public void loadRules() throws XmlLoadException {
  +            try {
  +                rulesDigester.parse(url.openStream());
  +            } catch (Exception ex) {
  +                throw new XmlLoadException(ex);
  +            }
           }
       }
   
  +    /** Loads XMLRules from an InputSource */
  +    private class InputSourceXMLRulesLoader extends XMLRulesLoader {
  +        private InputSource inputSource;
  +        public InputSourceXMLRulesLoader(InputSource inputSource) {
  +            this.inputSource = inputSource;
  +        }
  +        
  +        public void loadRules() throws XmlLoadException {
  +            try {
  +                rulesDigester.parse(inputSource);
  +            } catch (Exception ex) {
  +                throw new XmlLoadException(ex);
  +            }
  +        }
  +    }
   }
   
  
  
  
  1.17      +39 -3     
jakarta-commons/digester/src/test/org/apache/commons/digester/xmlrules/DigesterLoaderTest.java
  
  Index: DigesterLoaderTest.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/digester/src/test/org/apache/commons/digester/xmlrules/DigesterLoaderTest.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- DigesterLoaderTest.java   18 Oct 2003 13:30:22 -0000      1.16
  +++ DigesterLoaderTest.java   22 Oct 2003 18:28:57 -0000      1.17
  @@ -75,6 +75,7 @@
   import org.apache.commons.digester.Digester;
   import org.apache.commons.digester.TestObjectCreationFactory;
   
  +import org.xml.sax.InputSource;
   
   /**
    * Tests loading Digester rules from an XML file.
  @@ -313,6 +314,41 @@
                                       getClass().getClassLoader(), 
                                       new StringReader(xml),
                                       testObject);        
  +                                                                        
  +        assertEquals("Incorrect left value", "long", testObject.getLeft());
  +        assertEquals("Incorrect middle value", "short", testObject.getMiddle());
  +        assertEquals("Incorrect right value", "", testObject.getRight());
  +    }
  +    
  +    public void testInputSourceLoader() throws Exception {
  +        String rulesXml = "<?xml version='1.0'?>"
  +                + "<digester-rules>"
  +                + " <pattern value='root'>"
  +             + "   <pattern value='foo'>"
  +             + "     <call-method-rule methodname='triple' paramcount='3'"
  +                + "            
paramtypes='java.lang.String,java.lang.String,java.lang.String'/>"
  +                + "     <call-param-rule paramnumber='0' attrname='attr'/>"
  +                + "        <pattern value='bar'>"
  +                + "            <call-param-rule paramnumber='1' 
from-stack='false'/>"
  +                + "        </pattern>"
  +                + "        <pattern value='foobar'>"
  +                + "            <object-create-rule classname='java.lang.String'/>"
  +                + "            <pattern value='ping'>"
  +                + "                <call-param-rule paramnumber='2' 
from-stack='true'/>"
  +                + "            </pattern>"
  +                + "         </pattern>"
  +                + "   </pattern>"
  +                + " </pattern>"
  +                + "</digester-rules>";
  +                
  +        String xml = "<?xml version='1.0' ?>"
  +                     + "<root><foo 
attr='long'><bar>short</bar><foobar><ping>tosh</ping></foobar></foo></root>";
  +        
  +        CallParamTestObject testObject = new CallParamTestObject();
  +        
  +        Digester digester = DigesterLoader.createDigester(new InputSource(new 
StringReader(rulesXml)));
  +        digester.push(testObject);
  +        digester.parse(new StringReader(xml));        
                                                                           
           assertEquals("Incorrect left value", "long", testObject.getLeft());
           assertEquals("Incorrect middle value", "short", testObject.getMiddle());
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to