Author: simonetripodi
Date: Wed Feb 16 21:35:20 2011
New Revision: 1071409
URL: http://svn.apache.org/viewvc?rev=1071409&view=rev
Log:
added fix for circular includes + testcase; include rule is now able to include
from different URLs, not just a classpath resource
Modified:
commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/xmlrules/FromXmlRulesModule.java
commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/xmlrules/metaparser/IncludeRule.java
commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/xmlrules/metaparser/XmlRulesModule.java
commons/sandbox/digester3/trunk/src/main/resources/org/apache/commons/digester3/xmlrules/digester-rules.dtd
commons/sandbox/digester3/trunk/src/test/java/org/apache/commons/digester3/xmlrules/IncludeTestCase.java
commons/sandbox/digester3/trunk/src/test/resources/org/apache/commons/digester3/xmlrules/testCircularRules.xml
commons/sandbox/digester3/trunk/src/test/resources/org/apache/commons/digester3/xmlrules/testrules.xml
Modified:
commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/xmlrules/FromXmlRulesModule.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/xmlrules/FromXmlRulesModule.java?rev=1071409&r1=1071408&r2=1071409&view=diff
==============================================================================
---
commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/xmlrules/FromXmlRulesModule.java
(original)
+++
commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/xmlrules/FromXmlRulesModule.java
Wed Feb 16 21:35:20 2011
@@ -133,8 +133,10 @@ public final class FromXmlRulesModule im
* {@inheritDoc}
*/
public void configure(RulesBinder rulesBinder) {
+ XmlRulesModule xmlRulesModule = new XmlRulesModule(rulesBinder,
this.getSystemId());
+
try {
- newLoader(new XmlRulesModule(rulesBinder))
+ newLoader(xmlRulesModule)
.register(DIGESTER_PUBLIC_ID, this.xmlRulesDtdUrl.toString())
.setXIncludeAware(true)
.newDigester()
@@ -144,13 +146,17 @@ public final class FromXmlRulesModule im
}
}
+ public String getSystemId() {
+ return this.xmlRules.getSystemId();
+ }
+
/**
* {@inheritDoc}
*/
@Override
public String toString() {
return String.format("FromXmlRulesModule[%s]",
- this.xmlRules.getSystemId() != null ?
this.xmlRules.getSystemId() : this.xmlRules.toString());
+ this.getSystemId() != null ? this.getSystemId() :
this.xmlRules.toString());
}
}
Modified:
commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/xmlrules/metaparser/IncludeRule.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/xmlrules/metaparser/IncludeRule.java?rev=1071409&r1=1071408&r2=1071409&view=diff
==============================================================================
---
commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/xmlrules/metaparser/IncludeRule.java
(original)
+++
commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/xmlrules/metaparser/IncludeRule.java
Wed Feb 16 21:35:20 2011
@@ -17,7 +17,8 @@
*/
package org.apache.commons.digester3.xmlrules.metaparser;
-import org.apache.commons.digester3.DigesterLoadingException;
+import java.net.URL;
+
import org.apache.commons.digester3.Rule;
import org.apache.commons.digester3.RulesBinder;
import org.apache.commons.digester3.RulesModule;
@@ -35,6 +36,8 @@ import org.xml.sax.Attributes;
*/
final class IncludeRule extends Rule {
+ private static final String CLASSPATH_URL_PREFIX = "classpath:";
+
private final WithMemoryRulesBinder memoryRulesBinder;
private final RulesBinder targetRulesBinder;
@@ -50,12 +53,34 @@ final class IncludeRule extends Rule {
@Override
public void begin(String namespace, String name, Attributes attributes)
throws Exception {
// The path attribute gives the URI to another digester rules xml file
- String fileName = attributes.getValue("path");
+ String fileName = attributes.getValue("url");
if (fileName != null && fileName.length() > 0) {
- if (!this.memoryRulesBinder.getIncludedFiles().add(fileName)) {
- throw new DigesterLoadingException("Circular file inclusion
detected for file: " + fileName);
+ FromXmlRulesModule fromXmlRulesModule = null;
+
+ if (fileName.startsWith(CLASSPATH_URL_PREFIX)) {
+ String path =
fileName.substring(CLASSPATH_URL_PREFIX.length());
+ if ('/' == path.charAt(0)) {
+ path = path.substring(1);
+ }
+ fromXmlRulesModule = new FromXmlRulesModule(path);
+ } else {
+ try {
+ fromXmlRulesModule = new FromXmlRulesModule(new
URL(fileName));
+ } catch (Exception e) {
+ this.targetRulesBinder.addError("An error occurred while
inculing file from '%s': %s",
+ fileName,
+ e.getMessage());
+ }
+ }
+
+ if (fromXmlRulesModule != null) {
+ if
(!this.memoryRulesBinder.getIncludedFiles().add(fromXmlRulesModule.getSystemId()))
{
+ this.targetRulesBinder.addError("Circular file inclusion
detected for XML rules: %s",
+ fromXmlRulesModule.getSystemId());
+ } else {
+ this.install(fromXmlRulesModule);
+ }
}
- this.install(new FromXmlRulesModule(fileName));
}
// The class attribute gives the name of a class that implements
Modified:
commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/xmlrules/metaparser/XmlRulesModule.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/xmlrules/metaparser/XmlRulesModule.java?rev=1071409&r1=1071408&r2=1071409&view=diff
==============================================================================
---
commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/xmlrules/metaparser/XmlRulesModule.java
(original)
+++
commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/xmlrules/metaparser/XmlRulesModule.java
Wed Feb 16 21:35:20 2011
@@ -28,10 +28,13 @@ public final class XmlRulesModule implem
private final RulesBinder targetRulesBinder;
+ private final String rootSystemId;
+
private WithMemoryRulesBinder memoryRulesBinder;
- public XmlRulesModule(final RulesBinder targetRulesBinder) {
+ public XmlRulesModule(final RulesBinder targetRulesBinder, String
rootSystemId) {
this.targetRulesBinder = targetRulesBinder;
+ this.rootSystemId = rootSystemId;
}
/**
@@ -42,6 +45,9 @@ public final class XmlRulesModule implem
this.memoryRulesBinder = (WithMemoryRulesBinder) rulesBinder;
} else {
this.memoryRulesBinder = new WithMemoryRulesBinder(rulesBinder);
+ if (this.rootSystemId != null) {
+
this.memoryRulesBinder.getIncludedFiles().add(this.rootSystemId);
+ }
}
PatternStack patternStack = this.memoryRulesBinder.getPatternStack();
Modified:
commons/sandbox/digester3/trunk/src/main/resources/org/apache/commons/digester3/xmlrules/digester-rules.dtd
URL:
http://svn.apache.org/viewvc/commons/sandbox/digester3/trunk/src/main/resources/org/apache/commons/digester3/xmlrules/digester-rules.dtd?rev=1071409&r1=1071408&r2=1071409&view=diff
==============================================================================
---
commons/sandbox/digester3/trunk/src/main/resources/org/apache/commons/digester3/xmlrules/digester-rules.dtd
(original)
+++
commons/sandbox/digester3/trunk/src/main/resources/org/apache/commons/digester3/xmlrules/digester-rules.dtd
Wed Feb 16 21:35:20 2011
@@ -75,7 +75,7 @@
-->
<!ELEMENT include EMPTY>
<!ATTLIST include
- path CDATA #IMPLIED
+ url CDATA #IMPLIED
class CDATA #IMPLIED>
<!-- Each 'rule' element below corresponds to a concrete subclass
Modified:
commons/sandbox/digester3/trunk/src/test/java/org/apache/commons/digester3/xmlrules/IncludeTestCase.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/digester3/trunk/src/test/java/org/apache/commons/digester3/xmlrules/IncludeTestCase.java?rev=1071409&r1=1071408&r2=1071409&view=diff
==============================================================================
---
commons/sandbox/digester3/trunk/src/test/java/org/apache/commons/digester3/xmlrules/IncludeTestCase.java
(original)
+++
commons/sandbox/digester3/trunk/src/test/java/org/apache/commons/digester3/xmlrules/IncludeTestCase.java
Wed Feb 16 21:35:20 2011
@@ -17,15 +17,17 @@
*/
package org.apache.commons.digester3.xmlrules;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
import java.io.StringReader;
+import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.digester3.AbstractRulesModule;
import org.apache.commons.digester3.AbstractTestCase;
import org.apache.commons.digester3.Digester;
+import org.apache.commons.digester3.DigesterLoadingException;
import org.apache.commons.digester3.Rule;
import org.junit.Test;
@@ -55,7 +57,7 @@ public final class IncludeTestCase exten
String rulesXml = "<?xml version='1.0'?>"
+ "<digester-rules>"
+ " <pattern value='root/foo'>"
- + " <include
class='org.apache.commons.digester3.xmlrules.IncludeTestCase$TestDigesterRulesModule'/>"
+ + " <include
class='org.apache.commons.digester3.xmlrules.IncludeTestCase$TestDigesterRulesModule'
/>"
+ " </pattern>"
+ "</digester-rules>";
@@ -70,4 +72,13 @@ public final class IncludeTestCase exten
assertEquals("Entry value", "short", list.get(0));
}
+ /**
+ * Validates that circular includes are detected and result in an exception
+ */
+ @Test(expected = DigesterLoadingException.class)
+ public void testCircularInclude() throws Exception {
+ URL rules =
ClassLoader.getSystemResource("org/apache/commons/digester3/xmlrules/testCircularRules.xml");
+ newBasicDigester(new FromXmlRulesModule(rules));
+ }
+
}
Modified:
commons/sandbox/digester3/trunk/src/test/resources/org/apache/commons/digester3/xmlrules/testCircularRules.xml
URL:
http://svn.apache.org/viewvc/commons/sandbox/digester3/trunk/src/test/resources/org/apache/commons/digester3/xmlrules/testCircularRules.xml?rev=1071409&r1=1071408&r2=1071409&view=diff
==============================================================================
---
commons/sandbox/digester3/trunk/src/test/resources/org/apache/commons/digester3/xmlrules/testCircularRules.xml
(original)
+++
commons/sandbox/digester3/trunk/src/test/resources/org/apache/commons/digester3/xmlrules/testCircularRules.xml
Wed Feb 16 21:35:20 2011
@@ -20,9 +20,9 @@
in an exception. -->
<digester-rules>
<pattern value="root/foo">
- <object-create-rule
classname="org.apache.commons.digester.xmlrules.ObjectTestImpl" />
+ <object-create-rule
classname="org.apache.commons.digester3.xmlrules.ObjectTestImpl" />
<set-next-rule methodname="add" paramtype="java.lang.Object" />
<set-properties-rule/>
- <include
path="org/apache/commons/digester3/xmlrules/testCircularRules.xml" />
+ <include
url="classpath:/org/apache/commons/digester3/xmlrules/testCircularRules.xml" />
</pattern>
</digester-rules>
Modified:
commons/sandbox/digester3/trunk/src/test/resources/org/apache/commons/digester3/xmlrules/testrules.xml
URL:
http://svn.apache.org/viewvc/commons/sandbox/digester3/trunk/src/test/resources/org/apache/commons/digester3/xmlrules/testrules.xml?rev=1071409&r1=1071408&r2=1071409&view=diff
==============================================================================
---
commons/sandbox/digester3/trunk/src/test/resources/org/apache/commons/digester3/xmlrules/testrules.xml
(original)
+++
commons/sandbox/digester3/trunk/src/test/resources/org/apache/commons/digester3/xmlrules/testrules.xml
Wed Feb 16 21:35:20 2011
@@ -22,7 +22,7 @@
<set-next-rule methodname="add" paramtype="java.lang.Object" />
<set-properties-rule />
- <include
path="org/apache/commons/digester3/xmlrules/testrulesinclude.xml" />
+ <include
url="classpath:/org/apache/commons/digester3/xmlrules/testrulesinclude.xml" />
<include
class="org.apache.commons.digester3.xmlrules.DigesterRulesSourceTestImpl" />
<pattern value="call-method-rule-tests">