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]