You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by rd...@apache.org on 2002/08/20 23:15:14 UTC
cvs commit: jakarta-commons/digester/src/java/org/apache/commons/digester/xmlrules DigesterLoader.java DigesterRuleParser.java FromXmlRuleSet.java
rdonkin 2002/08/20 14:15:14
Modified: digester/src/java/org/apache/commons/digester/xmlrules
DigesterLoader.java DigesterRuleParser.java
FromXmlRuleSet.java
Log:
Applied patch enabling more sophisticated classloader management for xmlrules digestion. This allows xml files packed in a ear file to be found by an xmlrules digester in j2ee server. Submitted by Henri Chen.
Revision Changes Path
1.3 +19 -0 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.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- DigesterLoader.java 9 Jan 2002 20:22:50 -0000 1.2
+++ DigesterLoader.java 20 Aug 2002 21:15:14 -0000 1.3
@@ -74,6 +74,7 @@
*
* @author David H. Martin - Initial Contribution
* @author Scott Sanders - Added ASL, removed external dependencies
+ * @author Henri Chen - Added rulesDigester
*/
public class DigesterLoader {
@@ -85,6 +86,24 @@
*/
public static Digester createDigester(URL rulesXml) {
RuleSet ruleSet = new FromXmlRuleSet(rulesXml);
+ Digester digester = new Digester();
+ digester.addRuleSet(ruleSet);
+ return digester;
+ }
+
+ /**
+ * Creates a new digester and initializes it from the specified XML file.
+ * This constructor allows specifing a rulesDigester to do the XML file
+ * loading; thus no matter the XML files is packed into a jar, a war, or a
+ * ear, the rulesDigester can always find the XML files with properly set
+ * ClassLoader.
+ *
+ * @param rulesXml URL to the XML file defining the digester rules
+ * @param rulesDigester digester to load the specified XML file.
+ * @return a new Digester initialized with the rules
+ */
+ public static Digester createDigester(URL rulesXml, Digester rulesDigester) {
+ RuleSet ruleSet = new FromXmlRuleSet(rulesXml, rulesDigester);
Digester digester = new Digester();
digester.addRuleSet(ruleSet);
return digester;
1.8 +10 -6 jakarta-commons/digester/src/java/org/apache/commons/digester/xmlrules/DigesterRuleParser.java
Index: DigesterRuleParser.java
===================================================================
RCS file: /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/xmlrules/DigesterRuleParser.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- DigesterRuleParser.java 8 Aug 2002 20:00:23 -0000 1.7
+++ DigesterRuleParser.java 20 Aug 2002 21:15:14 -0000 1.8
@@ -238,7 +238,7 @@
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());
@@ -341,7 +341,7 @@
*/
private void includeXMLRules(String fileName)
throws IOException, SAXException, CircularIncludeException {
- URL fileURL = DigesterRuleParser.this.getClass().getClassLoader().getResource(fileName);
+ URL fileURL = getDigester().getClassLoader().getResource(fileName);
if (fileURL == null) {
throw new FileNotFoundException("File \"" + fileName + "\" not found.");
}
@@ -354,7 +354,11 @@
DigesterRuleParser includedSet =
new DigesterRuleParser(targetDigester, patternStack, includedFiles);
includedSet.setDigesterRulesDTD(getDigesterRulesDTD());
+
Digester digester = new Digester();
+ digester.setUseContextClassLoader(getDigester().getUseContextClassLoader());
+ digester.setClassLoader(getDigester().getClassLoader());
+ digester.setErrorHandler(getDigester().getErrorHandler());
digester.addRuleSet(includedSet);
digester.push(DigesterRuleParser.this);
digester.parse(fileName);
@@ -373,7 +377,7 @@
throws ClassNotFoundException, ClassCastException,
InstantiationException, IllegalAccessException {
- Class cls = Class.forName(className);
+ Class cls = Class.forName(className, true, digester.getClassLoader());
DigesterRulesSource rulesSource = (DigesterRulesSource) cls.newInstance();
// wrap the digester's Rules object, to prepend pattern
@@ -495,10 +499,10 @@
if (attributes.getValue("paramcount") == null) {
// call against empty method
callMethodRule = new CallMethodRule(methodName);
-
+
} else {
int paramCount = Integer.parseInt(attributes.getValue("paramcount"));
-
+
String paramTypesAttr = attributes.getValue("paramtypes");
if (paramTypesAttr == null || paramTypesAttr.length() == 0) {
callMethodRule = new CallMethodRule(targetDigester, methodName,
@@ -618,7 +622,7 @@
* the containing SetPropertiesRule rule.
*/
protected class SetPropertiesAliasRule extends Rule {
-
+
/**
* <p>Base constructor.
*
1.4 +29 -3 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.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- FromXmlRuleSet.java 9 Jan 2002 20:22:50 -0000 1.3
+++ FromXmlRuleSet.java 20 Aug 2002 21:15:14 -0000 1.4
@@ -83,6 +83,7 @@
*
* @author David H. Martin - Initial Contribution
* @author Scott Sanders - Added ASL, removed external dependencies
+ * @author Henri Chen - Added rulesDigester
*/
public class FromXmlRuleSet extends RuleSetBase {
@@ -98,12 +99,28 @@
*/
private DigesterRuleParser parser;
+ /**
+ * The digester for loading the rules xml.
+ */
+ private Digester rulesDigester;
+
/**
- * Constructs a FromXmlRuleSet using the default DigesterRuleParser
+ * Constructs a FromXmlRuleSet using the default DigesterRuleParser and
+ * rulesDigester.
* @param rulesXml the path to the XML document defining the Digester rules
*/
public FromXmlRuleSet(URL rulesXml) {
- this(rulesXml, new DigesterRuleParser());
+ this(rulesXml, new DigesterRuleParser(), new Digester());
+ }
+
+ /**
+ * Constructs a FromXmlRuleSet using the default DigesterRuleParser and
+ * a ruleDigester for loading the rules xml.
+ * @param rulesXml the path to the XML document defining the Digester rules
+ * @param ruleDigester the digester to read the rules xml.
+ */
+ public FromXmlRuleSet(URL rulesXml, Digester rulesDigester) {
+ this(rulesXml, new DigesterRuleParser(), rulesDigester);
}
/**
@@ -111,8 +128,18 @@
* @param parser an instance of DigesterRuleParser, for parsing the rules from XML
*/
public FromXmlRuleSet(URL rulesXml, DigesterRuleParser parser) {
+ this(rulesXml, parser, new Digester());
+ }
+
+ /**
+ * @param rulesXml the path to the XML document defining the Digester rules
+ * @param parser an instance of DigesterRuleParser, for parsing the rules from XML
+ * @param rulesDigester the digester used to load the Xml rules.
+ */
+ public FromXmlRuleSet(URL rulesXml, DigesterRuleParser parser, Digester rulesDigester) {
xmlRules = rulesXml;
this.parser = parser;
+ this.rulesDigester = rulesDigester;
}
/**
@@ -129,7 +156,6 @@
parser.setDigesterRulesDTD(dtdURL.toString());
parser.setTarget(digester);
- Digester rulesDigester = new Digester();
rulesDigester.addRuleSet(parser);
rulesDigester.push(parser);
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>