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">


Reply via email to