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]