You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by si...@apache.org on 2011/05/25 10:25:39 UTC

svn commit: r1127425 - in /commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/xmlrules: FromXmlRulesModule.java metaparser/IncludeRule.java metaparser/XmlRulesModule.java

Author: simonetripodi
Date: Wed May 25 08:25:39 2011
New Revision: 1127425

URL: http://svn.apache.org/viewvc?rev=1127425&view=rev
Log:
allowed users load more than one XML configuration file inside the same module

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

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=1127425&r1=1127424&r2=1127425&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 May 25 08:25:39 2011
@@ -17,6 +17,7 @@
  */
 package org.apache.commons.digester3.xmlrules;
 
+import static java.util.Collections.unmodifiableSet;
 import static org.apache.commons.digester3.binder.DigesterLoader.newLoader;
 
 import java.io.File;
@@ -26,7 +27,12 @@ import java.io.StringReader;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLConnection;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 
+import org.apache.commons.digester3.Digester;
 import org.apache.commons.digester3.binder.AbstractRulesModule;
 import org.apache.commons.digester3.binder.RulesModule;
 import org.apache.commons.digester3.xmlrules.metaparser.XmlRulesModule;
@@ -48,7 +54,9 @@ public abstract class FromXmlRulesModule
 
     private final URL xmlRulesDtdUrl = this.getClass().getResource(DIGESTER_DTD_PATH);
 
-    private InputSource inputSource;
+    private final List<InputSource> inputSource = new ArrayList<InputSource>();
+
+    private final Set<String> systemIds = new HashSet<String>();
 
     private String rootPath;
 
@@ -58,7 +66,7 @@ public abstract class FromXmlRulesModule
     @Override
     protected void configure()
     {
-        if ( inputSource != null )
+        if ( !inputSource.isEmpty() )
         {
             throw new IllegalStateException( "Re-entry is not allowed." );
         }
@@ -67,24 +75,27 @@ public abstract class FromXmlRulesModule
         {
             loadRules();
 
-            XmlRulesModule xmlRulesModule = new XmlRulesModule( rulesBinder(), getSystemId(), rootPath );
-
-            try
-            {
-                newLoader( xmlRulesModule )
+            XmlRulesModule xmlRulesModule = new XmlRulesModule( rulesBinder(), getSystemIds(), rootPath );
+            Digester digester = newLoader( xmlRulesModule )
                     .register( DIGESTER_PUBLIC_ID, xmlRulesDtdUrl.toString() )
                     .setXIncludeAware( true )
-                    .newDigester()
-                    .parse( inputSource );
-            }
-            catch ( Exception e )
+                    .newDigester();
+
+            for ( InputSource source : inputSource )
             {
-                addError( "Impossible to load XML defined in the URL '%s': %s", getSystemId(), e.getMessage() );
+                try
+                {
+                    digester.parse( source );
+                }
+                catch ( Exception e )
+                {
+                    addError( "Impossible to load XML defined in the InputSource '%s': %s", inputSource, e.getMessage() );
+                }
             }
         }
         finally
         {
-            inputSource = null;
+            inputSource.clear();
         }
     }
 
@@ -105,7 +116,16 @@ public abstract class FromXmlRulesModule
             throw new IllegalArgumentException( "Argument 'inputSource' must be not null" );
         }
 
-        this.inputSource = inputSource;
+        this.inputSource.add( inputSource );
+
+        String systemId = inputSource.getSystemId();
+        if ( systemId != null )
+        {
+            if ( !systemIds.add( systemId ) )
+            {
+                addError( "XML rules file '%s' already bound", systemId );
+            }
+        }
     }
 
     /**
@@ -235,18 +255,13 @@ public abstract class FromXmlRulesModule
     }
 
     /**
-     * Returns the XML source SystemId load by this module.
+     * Returns the XML source SystemIds load by this module.
      *
-     * @return The XML source SystemId load by this module
+     * @return The XML source SystemIds load by this module
      */
-    public final String getSystemId()
+    public final Set<String> getSystemIds()
     {
-        if ( inputSource == null )
-        {
-            return null;
-        }
-
-        return inputSource.getSystemId();
+        return unmodifiableSet( systemIds );
     }
 
 }

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=1127425&r1=1127424&r2=1127425&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 May 25 08:25:39 2011
@@ -112,12 +112,17 @@ final class IncludeRule
 
             if ( fromXmlRulesModule != null )
             {
-                if ( !memoryRulesBinder.getIncludedFiles().add( fromXmlRulesModule.getSystemId() ) )
+                boolean circularFileInclusionDetected = false;
+                for ( String systemId : fromXmlRulesModule.getSystemIds() )
                 {
-                    targetRulesBinder.addError( "Circular file inclusion detected for XML rules: %s",
-                                                fromXmlRulesModule.getSystemId() );
+                    if ( !memoryRulesBinder.getIncludedFiles().add( systemId ) )
+                    {
+                        targetRulesBinder.addError( "Circular file inclusion detected for XML rules: %s", systemId );
+                        circularFileInclusionDetected = true;
+                    }
                 }
-                else
+
+                if ( !circularFileInclusionDetected )
                 {
                     install( fromXmlRulesModule );
                 }

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=1127425&r1=1127424&r2=1127425&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 May 25 08:25:39 2011
@@ -17,6 +17,8 @@
  */
 package org.apache.commons.digester3.xmlrules.metaparser;
 
+import java.util.Set;
+
 import org.apache.commons.digester3.binder.LinkedRuleBuilder;
 import org.apache.commons.digester3.binder.RulesBinder;
 import org.apache.commons.digester3.binder.RulesModule;
@@ -30,17 +32,17 @@ public final class XmlRulesModule
 
     private final RulesBinder targetRulesBinder;
 
-    private final String rootSystemId;
+    private final Set<String> rootSystemIds;
 
     private final String rootPath;
 
     private WithMemoryRulesBinder memoryRulesBinder;
 
-    public XmlRulesModule( final RulesBinder targetRulesBinder, String rootSystemId,
+    public XmlRulesModule( final RulesBinder targetRulesBinder, Set<String> rootSystemIds,
     /* @Nullable */String rootPath )
     {
         this.targetRulesBinder = targetRulesBinder;
-        this.rootSystemId = rootSystemId;
+        this.rootSystemIds = rootSystemIds;
         this.rootPath = rootPath;
     }
 
@@ -56,9 +58,9 @@ public final class XmlRulesModule
         else
         {
             memoryRulesBinder = new WithMemoryRulesBinder( rulesBinder );
-            if ( rootSystemId != null )
+            if ( !rootSystemIds.isEmpty() )
             {
-                memoryRulesBinder.getIncludedFiles().add( rootSystemId );
+                memoryRulesBinder.getIncludedFiles().addAll( rootSystemIds );
             }
         }