You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by rg...@apache.org on 2008/12/27 03:27:50 UTC

svn commit: r729581 - in /commons/proper/configuration/trunk: ./ conf/ src/java/org/apache/commons/configuration/ src/java/org/apache/commons/configuration/resolver/ src/site/ src/test/org/apache/commons/configuration/ xdocs/ xdocs/userguide/

Author: rgoers
Date: Fri Dec 26 18:27:49 2008
New Revision: 729581

URL: http://svn.apache.org/viewvc?rev=729581&view=rev
Log:
CONFIGURATION-257 and CONFIGURATION-355 Add support for enhanced EntityResolvers and Schema validation

Added:
    commons/proper/configuration/trunk/conf/catalog.xml   (with props)
    commons/proper/configuration/trunk/conf/resolver.dtd   (with props)
    commons/proper/configuration/trunk/conf/sample.xml   (with props)
    commons/proper/configuration/trunk/conf/sample.xsd   (with props)
    commons/proper/configuration/trunk/conf/testResolver.xml   (with props)
    commons/proper/configuration/trunk/conf/testValidation.xml   (with props)
    commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/
    commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/CatalogResolver.java   (with props)
    commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/DefaultEntityResolver.java   (with props)
    commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/EntityRegistry.java   (with props)
    commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/package.html
    commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestCatalogResolver.java   (with props)
Modified:
    commons/proper/configuration/trunk/conf/testGlobalLookup.xml   (props changed)
    commons/proper/configuration/trunk/conf/testMultiConfiguration_1001.xml   (contents, props changed)
    commons/proper/configuration/trunk/conf/testMultiConfiguration_1002.xml   (contents, props changed)
    commons/proper/configuration/trunk/conf/testMultiConfiguration_1003.xml   (contents, props changed)
    commons/proper/configuration/trunk/conf/testMultiConfiguration_1004.xml   (props changed)
    commons/proper/configuration/trunk/conf/testMultiConfiguration_default.xml   (props changed)
    commons/proper/configuration/trunk/conf/testPatternSubtreeConfig.xml   (props changed)
    commons/proper/configuration/trunk/pom.xml
    commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/DefaultConfigurationBuilder.java
    commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/XMLConfiguration.java
    commons/proper/configuration/trunk/src/site/site.xml
    commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestDefaultConfigurationBuilder.java
    commons/proper/configuration/trunk/xdocs/changes.xml
    commons/proper/configuration/trunk/xdocs/dependencies.xml
    commons/proper/configuration/trunk/xdocs/index.xml
    commons/proper/configuration/trunk/xdocs/userguide/howto_xml.xml

Added: commons/proper/configuration/trunk/conf/catalog.xml
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/conf/catalog.xml?rev=729581&view=auto
==============================================================================
--- commons/proper/configuration/trunk/conf/catalog.xml (added)
+++ commons/proper/configuration/trunk/conf/catalog.xml Fri Dec 26 18:27:49 2008
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
+
+  <public publicId="-//Apache//DTD Resolver Test V1.0//EN"
+          uri="resolver.dtd"/>
+  <rewriteSystem systemIdStartString="http://java.sun.com/dtd/"
+                 rewritePrefix="./"/>
+  <rewriteSystem systemIdStartString="http://commons.apache.org/" rewritePrefix="./"/>
+</catalog>
\ No newline at end of file

Propchange: commons/proper/configuration/trunk/conf/catalog.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/configuration/trunk/conf/catalog.xml
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/proper/configuration/trunk/conf/catalog.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Added: commons/proper/configuration/trunk/conf/resolver.dtd
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/conf/resolver.dtd?rev=729581&view=auto
==============================================================================
--- commons/proper/configuration/trunk/conf/resolver.dtd (added)
+++ commons/proper/configuration/trunk/conf/resolver.dtd Fri Dec 26 18:27:49 2008
@@ -0,0 +1,19 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!ELEMENT test (foo|bar)+>
+<!ELEMENT foo EMPTY>
+<!ELEMENT bar EMPTY>
\ No newline at end of file

Propchange: commons/proper/configuration/trunk/conf/resolver.dtd
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/configuration/trunk/conf/sample.xml
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/conf/sample.xml?rev=729581&view=auto
==============================================================================
--- commons/proper/configuration/trunk/conf/sample.xml (added)
+++ commons/proper/configuration/trunk/conf/sample.xml Fri Dec 26 18:27:49 2008
@@ -0,0 +1,12 @@
+<?xml version="1.0" ?>
+<Employees xmlns="http://commons.apache.org/employee"
+           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+           xsi:schemaLocation="http://commons.apache.org/employee http://commons.apache.org/sample.xsd">
+  <Employee>
+    <SSN>555121211</SSN>
+    <Name>John Doe</Name>
+    <DateOfBirth>1975-05-15</DateOfBirth>
+    <EmployeeType>Exempt</EmployeeType>
+    <Salary>100000</Salary>
+  </Employee>
+</Employees>
\ No newline at end of file

Propchange: commons/proper/configuration/trunk/conf/sample.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/configuration/trunk/conf/sample.xml
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/proper/configuration/trunk/conf/sample.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Added: commons/proper/configuration/trunk/conf/sample.xsd
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/conf/sample.xsd?rev=729581&view=auto
==============================================================================
--- commons/proper/configuration/trunk/conf/sample.xsd (added)
+++ commons/proper/configuration/trunk/conf/sample.xsd Fri Dec 26 18:27:49 2008
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://commons.apache.org/employee" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xs:element name="Employees" type="emp:EmployeesType" xmlns:emp="http://commons.apache.org/employee"/>
+  <xs:complexType name="EmployeeType">
+    <xs:sequence>
+      <xs:element type="xs:string" name="SSN"/>
+      <xs:element type="xs:string" name="Name"/>
+      <xs:element type="xs:string" name="DateOfBirth"/>
+      <xs:element type="xs:string" name="EmployeeType"/>
+      <xs:element type="xs:string" name="Salary"/>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:complexType name="EmployeesType">
+    <xs:sequence>
+      <xs:element type="emp:EmployeeType" name="Employee" xmlns:emp="http://commons.apache.org/employee"/>
+    </xs:sequence>
+  </xs:complexType>
+</xs:schema>
\ No newline at end of file

Propchange: commons/proper/configuration/trunk/conf/sample.xsd
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/configuration/trunk/conf/sample.xsd
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/proper/configuration/trunk/conf/sample.xsd
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Propchange: commons/proper/configuration/trunk/conf/testGlobalLookup.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/configuration/trunk/conf/testGlobalLookup.xml
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/proper/configuration/trunk/conf/testGlobalLookup.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Modified: commons/proper/configuration/trunk/conf/testMultiConfiguration_1001.xml
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/conf/testMultiConfiguration_1001.xml?rev=729581&r1=729580&r2=729581&view=diff
==============================================================================
--- commons/proper/configuration/trunk/conf/testMultiConfiguration_1001.xml (original)
+++ commons/proper/configuration/trunk/conf/testMultiConfiguration_1001.xml Fri Dec 26 18:27:49 2008
@@ -1,15 +1,15 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<configuration>
-  <colors>
-    <background>#808080</background>
-    <text>#000000</text>
-    <header>#008000</header>
-    <link normal="#000080" visited="#800080"/>
-    <default>${colors.header}</default>
-  </colors>
-  <rowsPerPage>15</rowsPerPage>
-  <buttons>
-    <name>OK,Cancel,Help</name>
-  </buttons>
-  <numberFormat pattern="###\,###.##"/>
-</configuration>
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<configuration>
+  <colors>
+    <background>#808080</background>
+    <text>#000000</text>
+    <header>#008000</header>
+    <link normal="#000080" visited="#800080"/>
+    <default>${colors.header}</default>
+  </colors>
+  <rowsPerPage>15</rowsPerPage>
+  <buttons>
+    <name>OK,Cancel,Help</name>
+  </buttons>
+  <numberFormat pattern="###\,###.##"/>
+</configuration>

Propchange: commons/proper/configuration/trunk/conf/testMultiConfiguration_1001.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/configuration/trunk/conf/testMultiConfiguration_1001.xml
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/proper/configuration/trunk/conf/testMultiConfiguration_1001.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Modified: commons/proper/configuration/trunk/conf/testMultiConfiguration_1002.xml
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/conf/testMultiConfiguration_1002.xml?rev=729581&r1=729580&r2=729581&view=diff
==============================================================================
--- commons/proper/configuration/trunk/conf/testMultiConfiguration_1002.xml (original)
+++ commons/proper/configuration/trunk/conf/testMultiConfiguration_1002.xml Fri Dec 26 18:27:49 2008
@@ -1,15 +1,15 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<configuration>
-  <colors>
-    <background>#2222222</background>
-    <text>#000000</text>
-    <header>#222222</header>
-    <link normal="#020202" visited="#202020"/>
-    <default>${colors.header3}</default>
-  </colors>
-  <rowsPerPage>25</rowsPerPage>
-  <buttons>
-    <name>OK-2,Cancel-2,Help-2</name>
-  </buttons>
-  <numberFormat pattern="###\,###.##"/>
-</configuration>
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<configuration>
+  <colors>
+    <background>#2222222</background>
+    <text>#000000</text>
+    <header>#222222</header>
+    <link normal="#020202" visited="#202020"/>
+    <default>${colors.header3}</default>
+  </colors>
+  <rowsPerPage>25</rowsPerPage>
+  <buttons>
+    <name>OK-2,Cancel-2,Help-2</name>
+  </buttons>
+  <numberFormat pattern="###\,###.##"/>
+</configuration>

Propchange: commons/proper/configuration/trunk/conf/testMultiConfiguration_1002.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/configuration/trunk/conf/testMultiConfiguration_1002.xml
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/proper/configuration/trunk/conf/testMultiConfiguration_1002.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Modified: commons/proper/configuration/trunk/conf/testMultiConfiguration_1003.xml
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/conf/testMultiConfiguration_1003.xml?rev=729581&r1=729580&r2=729581&view=diff
==============================================================================
--- commons/proper/configuration/trunk/conf/testMultiConfiguration_1003.xml (original)
+++ commons/proper/configuration/trunk/conf/testMultiConfiguration_1003.xml Fri Dec 26 18:27:49 2008
@@ -1,15 +1,15 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<configuration>
-  <colors>
-    <background>#333333</background>
-    <text>#FFFFFF</text>
-    <header>#333333</header>
-    <link normal="#030303" visited="#303030"/>
-    <default>${colors.header3}</default>
-  </colors>
-  <rowsPerPage>35</rowsPerPage>
-  <buttons>
-    <name>OK-3,Cancel-3,Help-3</name>
-  </buttons>
-  <numberFormat pattern="###\,###.##"/>
-</configuration>
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<configuration>
+  <colors>
+    <background>#333333</background>
+    <text>#FFFFFF</text>
+    <header>#333333</header>
+    <link normal="#030303" visited="#303030"/>
+    <default>${colors.header3}</default>
+  </colors>
+  <rowsPerPage>35</rowsPerPage>
+  <buttons>
+    <name>OK-3,Cancel-3,Help-3</name>
+  </buttons>
+  <numberFormat pattern="###\,###.##"/>
+</configuration>

Propchange: commons/proper/configuration/trunk/conf/testMultiConfiguration_1003.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/configuration/trunk/conf/testMultiConfiguration_1003.xml
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/proper/configuration/trunk/conf/testMultiConfiguration_1003.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Propchange: commons/proper/configuration/trunk/conf/testMultiConfiguration_1004.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/configuration/trunk/conf/testMultiConfiguration_1004.xml
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/proper/configuration/trunk/conf/testMultiConfiguration_1004.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Propchange: commons/proper/configuration/trunk/conf/testMultiConfiguration_default.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/configuration/trunk/conf/testMultiConfiguration_default.xml
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/proper/configuration/trunk/conf/testMultiConfiguration_default.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Propchange: commons/proper/configuration/trunk/conf/testPatternSubtreeConfig.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/configuration/trunk/conf/testPatternSubtreeConfig.xml
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/proper/configuration/trunk/conf/testPatternSubtreeConfig.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Added: commons/proper/configuration/trunk/conf/testResolver.xml
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/conf/testResolver.xml?rev=729581&view=auto
==============================================================================
--- commons/proper/configuration/trunk/conf/testResolver.xml (added)
+++ commons/proper/configuration/trunk/conf/testResolver.xml Fri Dec 26 18:27:49 2008
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!DOCTYPE test PUBLIC "-//Apache//DTD Resolver Test V1.0//EN"
+                      "http://example.com/does-not-exist">
+<test>
+<foo/>
+</test>
\ No newline at end of file

Propchange: commons/proper/configuration/trunk/conf/testResolver.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/configuration/trunk/conf/testResolver.xml
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/proper/configuration/trunk/conf/testResolver.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Added: commons/proper/configuration/trunk/conf/testValidation.xml
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/conf/testValidation.xml?rev=729581&view=auto
==============================================================================
--- commons/proper/configuration/trunk/conf/testValidation.xml (added)
+++ commons/proper/configuration/trunk/conf/testValidation.xml Fri Dec 26 18:27:49 2008
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!-- Test configuration definition file that demonstrates complex initialization -->
+<configuration>
+  <header>
+    <result delimiterParsingDisabled="true">
+      <nodeCombiner config-class="org.apache.commons.configuration.tree.OverrideCombiner"/>
+      <expressionEngine config-class="org.apache.commons.configuration.tree.xpath.XPathExpressionEngine"/>
+    </result>
+    <entity-resolver catalogFiles="conf/catalog.xml"/>    
+  </header>
+  <system/>
+  <properties fileName="test.properties.xml" throwExceptionOnMissing="true"
+    config-name="properties">
+  </properties>
+  <xml fileName="sample.xml" config-name="xml" schemaValidation="true"/>
+</configuration>
\ No newline at end of file

Propchange: commons/proper/configuration/trunk/conf/testValidation.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/configuration/trunk/conf/testValidation.xml
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/proper/configuration/trunk/conf/testValidation.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Modified: commons/proper/configuration/trunk/pom.xml
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/pom.xml?rev=729581&r1=729580&r2=729581&view=diff
==============================================================================
--- commons/proper/configuration/trunk/pom.xml (original)
+++ commons/proper/configuration/trunk/pom.xml Fri Dec 26 18:27:49 2008
@@ -287,6 +287,13 @@
       <artifactId>xml-apis</artifactId>
       <version>1.0.b2</version>
       <scope>provided</scope>
+    </dependency>    
+
+    <dependency>
+      <groupId>xml-resolver</groupId>
+      <artifactId>xml-resolver</artifactId>
+      <version>1.2</version>
+      <optional>true</optional>
     </dependency>
 
     <dependency>
@@ -461,7 +468,25 @@
             <tarLongFileMode>gnu</tarLongFileMode>
           </configuration>
         </plugin>
+        <!-- Uncomment to instrument with Clover
+        <plugin>
+          <groupId>com.atlassian.maven.plugins</groupId>
+          <artifactId>maven-clover2-plugin</artifactId>
+          <version>2.4.2</version>
+          <configuration>
+            <jdk>1.4</jdk>
+          </configuration>
+          <executions>
+            <execution>
+              <phase>pre-site</phase>
+              <goals>
+                <goal>instrument</goal>
+              </goals>
+            </execution>
+          </executions>
+        </plugin>  -->
       </plugins>
+
     </build>
 
   <reporting>
@@ -522,6 +547,12 @@
           <excludeFilterFile>conf/findbugs-exclude-filter.xml</excludeFilterFile>
        </configuration>
       </plugin>
+      <!-- Uncomment to generate clover report
+      <plugin>
+        <groupId>com.atlassian.maven.plugins</groupId>
+        <artifactId>maven-clover2-plugin</artifactId>
+        <version>2.4.2</version>
+      </plugin> -->
     </plugins>
   </reporting>
 

Modified: commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/DefaultConfigurationBuilder.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/DefaultConfigurationBuilder.java?rev=729581&r1=729580&r2=729581&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/DefaultConfigurationBuilder.java (original)
+++ commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/DefaultConfigurationBuilder.java Fri Dec 26 18:27:49 2008
@@ -35,8 +35,11 @@
 import org.apache.commons.configuration.tree.DefaultExpressionEngine;
 import org.apache.commons.configuration.tree.OverrideCombiner;
 import org.apache.commons.configuration.tree.UnionCombiner;
+import org.apache.commons.configuration.resolver.EntityRegistry;
+import org.apache.commons.configuration.resolver.CatalogResolver;
 import org.apache.commons.lang.text.StrLookup;
 import org.apache.commons.logging.LogFactory;
+import org.xml.sax.EntityResolver;
 
 /**
  * <p>
@@ -159,6 +162,16 @@
  * attribute of the result element.
  * </p>
  * <p>
+ * A custom EntityResolver can be used for all XMLConfigurations by adding
+ * <pre>
+ * &lt;entity-resolver config-class="EntityResolver fully qualified class name"&gt;
+ * </pre>
+ * The CatalogResolver can be used for all XMLConfiguration by adding
+ * <pre>
+ * &lt;entity-resolver catalogFiles="comma separated list of catalog files"&gt;
+ * </pre>
+ * </p>
+ * <p>
  * Additional ConfigurationProviders can be added by configuring them in the <em>header</em>
  * section.
  * <pre>
@@ -319,6 +332,11 @@
             + ".lookups.lookup";
 
     /**
+     * Constant for the key for defining entity resolvers
+     */
+    static final String KEY_ENTITY_RESOLVER = SEC_HEADER + ".entity-resolver";
+
+    /**
      * Constant for the prefix attribute for lookups.
      */
     static final String KEY_LOOKUP_KEY = XMLBeanDeclaration.ATTR_PREFIX + "prefix]";
@@ -549,6 +567,7 @@
         }
 
         initSystemProperties();
+        configureEntityResolver();
         registerConfiguredProviders();
         registerConfiguredLookups();
 
@@ -703,6 +722,15 @@
         }
     }
 
+    protected void configureEntityResolver() throws ConfigurationException
+    {
+        if (getMaxIndex(KEY_ENTITY_RESOLVER) == 0)
+        {
+            XMLBeanDeclaration decl = new XMLBeanDeclaration(this, KEY_ENTITY_RESOLVER, true);
+            setEntityResolver((EntityResolver) BeanHelper.createBean(decl, CatalogResolver.class));
+        }
+    }
+
     /**
      * Performs interpolation. This method will not only take this configuration
      * instance into account (which is the one that loaded the configuration
@@ -1382,11 +1410,19 @@
             XMLConfiguration config = (XMLConfiguration) super
                     .getEmptyConfiguration(decl);
 
-            // copy the registered entities
             DefaultConfigurationBuilder builder = decl
                     .getConfigurationBuilder();
-            config.getRegisteredEntities().putAll(
+            EntityResolver resolver = builder.getEntityResolver();
+            if (resolver instanceof EntityRegistry)
+            {
+                // copy the registered entities
+                config.getRegisteredEntities().putAll(
                     builder.getRegisteredEntities());
+            }
+            else
+            {
+                config.setEntityResolver(resolver);
+            }
             return config;
         }
     }

Modified: commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/XMLConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/XMLConfiguration.java?rev=729581&r1=729580&r2=729581&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/XMLConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/XMLConfiguration.java Fri Dec 26 18:27:49 2008
@@ -23,7 +23,6 @@
 import java.io.Reader;
 import java.io.Writer;
 import java.net.URL;
-import java.net.URLConnection;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -46,6 +45,8 @@
 import javax.xml.transform.stream.StreamResult;
 
 import org.apache.commons.configuration.tree.ConfigurationNode;
+import org.apache.commons.configuration.resolver.EntityRegistry;
+import org.apache.commons.configuration.resolver.DefaultEntityResolver;
 import org.w3c.dom.Attr;
 import org.w3c.dom.CDATASection;
 import org.w3c.dom.DOMException;
@@ -163,7 +164,7 @@
  * @version $Revision$, $Date$
  */
 public class XMLConfiguration extends AbstractHierarchicalFileConfiguration
-    implements EntityResolver
+    implements EntityResolver, EntityRegistry
 {
     /**
      * The serial version UID.
@@ -182,12 +183,17 @@
     /** Constant for the delimiter for multiple attribute values.*/
     private static final char ATTR_VALUE_DELIMITER = '|';
 
+    /** Schema Langauge key for the parser */
+    private static final String JAXP_SCHEMA_LANGUAGE =
+        "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
+
+    /** Schema Language for the parser */
+    private static final String W3C_XML_SCHEMA =
+        "http://www.w3.org/2001/XMLSchema";
+
     /** The document from this configuration's data source. */
     private Document document;
 
-    /** Stores a map with the registered public IDs.*/
-    private Map registeredEntities = new HashMap();
-
     /** Stores the name of the root element. */
     private String rootElementName;
 
@@ -200,12 +206,18 @@
     /** Stores the document builder that should be used for loading.*/
     private DocumentBuilder documentBuilder;
 
-    /** Stores a flag whether DTD validation should be performed.*/
+    /** Stores a flag whether DTD or Schema validation should be performed.*/
     private boolean validating;
 
+    /** Stores a flag whether DTD or Schema validation is used */
+    private boolean schemaValidation;
+
     /** A flag whether attribute splitting is disabled.*/
     private boolean attributeSplittingDisabled;
 
+    /** The EntityResolver to use */
+    private EntityResolver entityResolver = new DefaultEntityResolver();
+
     /**
      * Creates a new instance of <code>XMLConfiguration</code>.
      */
@@ -403,7 +415,7 @@
 
     /**
      * Sets the value of the validating flag. This flag determines whether
-     * DTD validation should be performed when loading XML documents. This
+     * DTD/Schema validation should be performed when loading XML documents. This
      * flag is evaluated only if no custom <code>DocumentBuilder</code> was set.
      *
      * @param validating the validating flag
@@ -411,7 +423,62 @@
      */
     public void setValidating(boolean validating)
     {
-        this.validating = validating;
+        if (!schemaValidation)
+        {
+            this.validating = validating;
+        }
+    }
+
+
+    /**
+     * Returns the value of the schemaValidation flag.
+     *
+     * @return the schemaValidation flag
+     * @since 1.7
+     */
+    public boolean isSchemaValidation()
+    {
+        return schemaValidation;
+    }
+
+    /**
+     * Sets the value of the schemaValidation flag. This flag determines whether
+     * DTD or Schema validation should be used. This
+     * flag is evaluated only if no custom <code>DocumentBuilder</code> was set.
+     * If set to true the XML document must contain a schemaLocation definition
+     * that provides resolvable hints to the required schemas.
+     *
+     * @param schemaValidation the validating flag
+     * @since 1.7
+     */
+    public void setSchemaValidation(boolean schemaValidation)
+    {
+        this.schemaValidation = schemaValidation;
+        if (schemaValidation)
+        {
+            this.validating = true;
+        }
+    }
+
+    /**
+     * Sets a new EntityResolver. Setting this will cause RegisterEntityId to have no
+     * effect.
+     * @param resolver The EntityResolver to use.
+     * @since 1.7
+     */
+    public void setEntityResolver(EntityResolver resolver)
+    {
+        this.entityResolver = resolver;
+    }
+
+    /**
+     * Returns the EntityResolver.
+     * @return The EntityResolver.
+     * @since 1.7
+     */
+    public EntityResolver getEntityResolver()
+    {
+        return this.entityResolver;
     }
 
     /**
@@ -716,9 +783,18 @@
         {
             DocumentBuilderFactory factory = DocumentBuilderFactory
                     .newInstance();
-            factory.setValidating(isValidating());
+            if (isValidating())
+            {
+                factory.setValidating(true);
+                if (isSchemaValidation())
+                {
+                    factory.setNamespaceAware(true);
+                    factory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
+                }
+            }
+
             DocumentBuilder result = factory.newDocumentBuilder();
-            result.setEntityResolver(this);
+            result.setEntityResolver(this.entityResolver);
 
             if (isValidating())
             {
@@ -1054,11 +1130,10 @@
      */
     public void registerEntityId(String publicId, URL entityURL)
     {
-        if (publicId == null)
+        if (entityResolver instanceof EntityRegistry)
         {
-            throw new IllegalArgumentException("Public ID must not be null!");
+            ((EntityRegistry) entityResolver).registerEntityId(publicId, entityURL);
         }
-        getRegisteredEntities().put(publicId, entityURL);
     }
 
     /**
@@ -1072,39 +1147,18 @@
      * @return an input source for the specified entity
      * @throws SAXException if a parsing exception occurs
      * @since 1.5
+     * @deprecated Use getEntityResolver().resolveEntity()
      */
     public InputSource resolveEntity(String publicId, String systemId)
             throws SAXException
     {
-        // Has this system identifier been registered?
-        URL entityURL = null;
-        if (publicId != null)
-        {
-            entityURL = (URL) getRegisteredEntities().get(publicId);
-        }
-
-        if (entityURL != null)
+        try
         {
-            // Obtain an InputSource for this URL. This code is based on the
-            // createInputSourceFromURL() method of Commons Digester.
-            try
-            {
-                URLConnection connection = entityURL.openConnection();
-                connection.setUseCaches(false);
-                InputStream stream = connection.getInputStream();
-                InputSource source = new InputSource(stream);
-                source.setSystemId(entityURL.toExternalForm());
-                return source;
-            }
-            catch (IOException e)
-            {
-                throw new SAXException(e);
-            }
+            return entityResolver.resolveEntity(publicId, systemId);
         }
-        else
+        catch (IOException e)
         {
-            // default processing behavior
-            return null;
+            throw new SAXException(e);
         }
     }
 
@@ -1114,9 +1168,13 @@
      *
      * @return a map with the registered entity IDs
      */
-    Map getRegisteredEntities()
+    public Map getRegisteredEntities()
     {
-        return registeredEntities;
+        if (entityResolver instanceof EntityRegistry)
+        {
+            return ((EntityRegistry) entityResolver).getRegisteredEntities();
+        }
+        return new HashMap();
     }
 
     /**

Added: commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/CatalogResolver.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/CatalogResolver.java?rev=729581&view=auto
==============================================================================
--- commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/CatalogResolver.java (added)
+++ commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/CatalogResolver.java Fri Dec 26 18:27:49 2008
@@ -0,0 +1,200 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.configuration.resolver;
+
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.apache.xml.resolver.CatalogManager;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.impl.NoOpLog;
+
+import java.net.URL;
+import java.io.InputStream;
+
+/**
+ * Thin wrapper around xml commons CatalogResolver to allow list of catalogs
+ * to be provided.
+ * @author <a
+ * href="http://commons.apache.org/configuration/team-list.html">Commons
+ * Configuration team</a>
+ * @since 1.7
+ * @version $Id$
+ */
+public class CatalogResolver implements EntityResolver
+{
+    /**
+     * Debug everything.
+     */
+    private static final int DEBUG_ALL = 9;
+
+    /**
+     * Debug nothing.
+     */
+    private static final int DEBUG_NONE = 0;
+
+    /**
+     * The CatalogResolver
+     */
+    private org.apache.xml.resolver.tools.CatalogResolver resolver;
+
+    /**
+     * The CatalogManager
+     */
+    private CatalogManager manager = new CatalogManager();
+
+    /**
+     * Stores the logger.
+     */
+    private Log log;
+
+    /**
+     * Constructs the CatalogResolver
+     */
+    public CatalogResolver()
+    {
+        manager.setIgnoreMissingProperties(true);
+        setLogger(null);
+    }
+
+    /**
+     * Set the list of catalog file names
+     *
+     * @param catalogs The delimited list of catalog files.
+     */
+    public void setCatalogFiles(String catalogs)
+    {
+        manager.setCatalogFiles(catalogs);
+        resolver = new org.apache.xml.resolver.tools.CatalogResolver(manager);
+    }
+
+    /**
+     * Enables debug logging of xml-commons Catalog processing.
+     * @param debug True if debugging should be enabled, false otherwise.
+     */
+    public void setDebug(boolean debug)
+    {
+        if (debug)
+        {
+            manager.setVerbosity(DEBUG_ALL);
+        }
+        else
+        {
+            manager.setVerbosity(DEBUG_NONE);
+        }
+    }
+
+    /**
+     * Implements the <code>resolveEntity</code> method
+     * for the SAX interface.
+     * <p/>
+     * <p>Presented with an optional public identifier and a system
+     * identifier, this function attempts to locate a mapping in the
+     * catalogs.</p>
+     * <p/>
+     * <p>If such a mapping is found, the resolver attempts to open
+     * the mapped value as an InputSource and return it. Exceptions are
+     * ignored and null is returned if the mapped value cannot be opened
+     * as an input source.</p>
+     * <p/>
+     * <p>If no mapping is found (or an error occurs attempting to open
+     * the mapped value as an input source), null is returned and the system
+     * will use the specified system identifier as if no entityResolver
+     * was specified.</p>
+     *
+     * @param publicId The public identifier for the entity in question.
+     *                 This may be null.
+     * @param systemId The system identifier for the entity in question.
+     *                 XML requires a system identifier on all external entities, so this
+     *                 value is always specified.
+     * @return An InputSource for the mapped identifier, or null.
+     * @throws SAXException if an error occurs.
+     */
+    public InputSource resolveEntity(String publicId, String systemId)
+            throws SAXException
+    {
+        String resolved = resolver.getResolvedEntity(publicId, systemId);
+
+        if (resolved != null)
+        {
+            String badFilePrefix = "file://";
+            String correctFilePrefix = "file:///";
+
+            // Java 5 has a bug when constructing file URLS
+            if (resolved.startsWith(badFilePrefix) && !resolved.startsWith(correctFilePrefix))
+            {
+                resolved = correctFilePrefix + resolved.substring(badFilePrefix.length());
+            }
+
+            try
+            {
+                InputSource iSource = new InputSource(resolved);
+                iSource.setPublicId(publicId);
+
+                // Ideally this method would not attempt to open the
+                // InputStream, but there is a bug (in Xerces, at least)
+                // that causes the parser to mistakenly open the wrong
+                // system identifier if the returned InputSource does
+                // not have a byteStream.
+                //
+                // It could be argued that we still shouldn't do this here,
+                // but since the purpose of calling the entityResolver is
+                // almost certainly to open the input stream, it seems to
+                // do little harm.
+                //
+                URL url = new URL(resolved);
+                InputStream iStream = url.openStream();
+                iSource.setByteStream(iStream);
+
+                return iSource;
+            }
+            catch (Exception e)
+            {
+                log.debug("Failed to create InputSource for " + resolved + " ("
+                                + e.toString() + ")");
+                return null;
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Returns the logger used by this configuration object.
+     *
+     * @return the logger
+     */
+    public Log getLogger()
+    {
+        return log;
+    }
+
+    /**
+     * Allows to set the logger to be used by this configuration object. This
+     * method makes it possible for clients to exactly control logging behavior.
+     * Per default a logger is set that will ignore all log messages. Derived
+     * classes that want to enable logging should call this method during their
+     * initialization with the logger to be used.
+     *
+     * @param log the new logger
+     */
+    public void setLogger(Log log)
+    {
+        this.log = (log != null) ? log : new NoOpLog();
+    }
+
+}

Propchange: commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/CatalogResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/CatalogResolver.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/DefaultEntityResolver.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/DefaultEntityResolver.java?rev=729581&view=auto
==============================================================================
--- commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/DefaultEntityResolver.java (added)
+++ commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/DefaultEntityResolver.java Fri Dec 26 18:27:49 2008
@@ -0,0 +1,130 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.configuration.resolver;
+
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.EntityResolver;
+
+import java.net.URL;
+import java.net.URLConnection;
+import java.io.InputStream;
+import java.io.IOException;
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * The DefaultEntityResolver used by XML Configurations.
+ * @author <a
+ * href="http://commons.apache.org/configuration/team-list.html">Commons
+ * Configuration team</a>
+ * @since 1.7
+ * @version $Id$
+ */
+public class DefaultEntityResolver implements EntityResolver, EntityRegistry
+{
+    /** Stores a map with the registered public IDs.*/
+    private Map registeredEntities = new HashMap();
+
+    /**
+     * <p>
+     * Registers the specified URL for the specified public identifier.
+     * </p>
+     * <p>
+     * This implementation maps <code>PUBLICID</code>'s to URLs (from which
+     * the resource will be loaded). A common use case for this method is to
+     * register local URLs (possibly computed at runtime by a class loader) for
+     * DTDs and Schemas. This allows the performance advantage of using a local
+     * version without having to ensure every <code>SYSTEM</code> URI on every
+     * processed XML document is local. This implementation provides only basic
+     * functionality. If more sophisticated features are required, either calling
+     * <code>XMLConfiguration.setDocumentBuilder(DocumentBuilder)<code> to set a custom
+     * <code>DocumentBuilder</code> (which also can be initialized with a
+     * custom <code>EntityResolver</code>) or creating a custom entity resolver
+     * and registering it with the XMLConfiguration is recommended.
+     * </p>
+     *
+     * @param publicId Public identifier of the Entity to be resolved
+     * @param entityURL The URL to use for reading this Entity
+     * @throws IllegalArgumentException if the public ID is undefined
+     */
+    public void registerEntityId(String publicId, URL entityURL)
+    {
+        if (publicId == null)
+        {
+            throw new IllegalArgumentException("Public ID must not be null!");
+        }
+        getRegisteredEntities().put(publicId, entityURL);
+    }
+
+    /**
+     * Resolves the requested external entity. This is the default
+     * implementation of the <code>EntityResolver</code> interface. It checks
+     * the passed in public ID against the registered entity IDs and uses a
+     * local URL if possible.
+     *
+     * @param publicId the public identifier of the entity being referenced
+     * @param systemId the system identifier of the entity being referenced
+     * @return an input source for the specified entity
+     * @throws org.xml.sax.SAXException if a parsing exception occurs
+     */
+    public InputSource resolveEntity(String publicId, String systemId)
+            throws SAXException
+    {
+        // Has this system identifier been registered?
+        URL entityURL = null;
+        if (publicId != null)
+        {
+            entityURL = (URL) getRegisteredEntities().get(publicId);
+        }
+
+        if (entityURL != null)
+        {
+            // Obtain an InputSource for this URL. This code is based on the
+            // createInputSourceFromURL() method of Commons Digester.
+            try
+            {
+                URLConnection connection = entityURL.openConnection();
+                connection.setUseCaches(false);
+                InputStream stream = connection.getInputStream();
+                InputSource source = new InputSource(stream);
+                source.setSystemId(entityURL.toExternalForm());
+                return source;
+            }
+            catch (IOException e)
+            {
+                throw new SAXException(e);
+            }
+        }
+        else
+        {
+            // default processing behavior
+            return null;
+        }
+    }
+
+    /**
+     * Returns a map with the entity IDs that have been registered using the
+     * <code>registerEntityId()</code> method.
+     *
+     * @return a map with the registered entity IDs
+     */
+    public Map getRegisteredEntities()
+    {
+        return registeredEntities;
+    }
+}

Propchange: commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/DefaultEntityResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/DefaultEntityResolver.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/EntityRegistry.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/EntityRegistry.java?rev=729581&view=auto
==============================================================================
--- commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/EntityRegistry.java (added)
+++ commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/EntityRegistry.java Fri Dec 26 18:27:49 2008
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.configuration.resolver;
+
+import java.net.URL;
+import java.util.Map;
+
+/**
+ * Interface used for registering and retrieving PUBLICID to URL mappings.
+ * @author <a
+ * href="http://commons.apache.org/configuration/team-list.html">Commons
+ * Configuration team</a>
+ * @since 1.7
+ * @version $Id$
+ */
+public interface EntityRegistry
+{
+    /**
+     * <p>
+     * Registers the specified URL for the specified public identifier.
+     * </p>
+     * <p>
+     * This implementation maps <code>PUBLICID</code>'s to URLs (from which
+     * the resource will be loaded). A common use case for this method is to
+     * register local URLs (possibly computed at runtime by a class loader) for
+     * DTDs and Schemas. This allows the performance advantage of using a local
+     * version without having to ensure every <code>SYSTEM</code> URI on every
+     * processed XML document is local. This implementation provides only basic
+     * functionality. If more sophisticated features are required, either calling
+     * <code>XMLConfiguration.setDocumentBuilder(DocumentBuilder)<code> to set a custom
+     * <code>DocumentBuilder</code> (which also can be initialized with a
+     * custom <code>EntityResolver</code>) or creating a custom entity resolver
+     * and registering it with the XMLConfiguration is recommended.
+     * </p>
+     *
+     * @param publicId Public identifier of the Entity to be resolved
+     * @param entityURL The URL to use for reading this Entity
+     * @throws IllegalArgumentException if the public ID is undefined
+     */
+    void registerEntityId(String publicId, URL entityURL);
+
+    /**
+     * Returns a map with the entity IDs that have been registered using the
+     * <code>registerEntityId()</code> method.
+     *
+     * @return a map with the registered entity IDs
+     */
+    Map getRegisteredEntities();
+}

Propchange: commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/EntityRegistry.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/EntityRegistry.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/package.html
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/package.html?rev=729581&view=auto
==============================================================================
--- commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/package.html (added)
+++ commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/package.html Fri Dec 26 18:27:49 2008
@@ -0,0 +1,31 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<html>
+<head>
+</head>
+<body>
+
+<p>
+A package containing EntityResolvers.
+</p>
+<p>
+<font size="-2">$Id:  $</font>
+</p>
+
+</body>
+</html>
\ No newline at end of file

Modified: commons/proper/configuration/trunk/src/site/site.xml
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/site/site.xml?rev=729581&r1=729580&r2=729581&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/site/site.xml (original)
+++ commons/proper/configuration/trunk/src/site/site.xml Fri Dec 26 18:27:49 2008
@@ -30,7 +30,7 @@
       <item name="User's Guide"                 href="/userguide/user_guide.html"/>
       <item name="Howtos (1.2 release)"         href="/userguide-1.2/index.html"/>
       <item name="Runtime Dependencies"         href="/dependencies.html"/>
-      <item name="Javadoc (1.4 release)"        href="/apidocs/index.html"/>
+      <item name="Javadoc (current)"            href="/apidocs/index.html"/>
       <item name="Javadoc (old releases)"       href="/javadoc.html"/>
     </menu>
 

Added: commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestCatalogResolver.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestCatalogResolver.java?rev=729581&view=auto
==============================================================================
--- commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestCatalogResolver.java (added)
+++ commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestCatalogResolver.java Fri Dec 26 18:27:49 2008
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.configuration;
+
+import junit.framework.TestCase;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import org.apache.commons.configuration.resolver.CatalogResolver;
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.logging.Log;
+
+/**
+ *
+ */
+public class TestCatalogResolver extends TestCase
+{
+    private static final String CATALOG_FILES = "conf/catalog.xml";
+    private static final String PUBLIC_FILE = "conf/testResolver.xml";
+    private static final String REWRITE_SYSTEM_FILE = "conf/test.properties.xml";
+    private static final String REWRITE_SCHEMA_FILE = "conf/sample.xml";
+
+    private CatalogResolver resolver;
+    private XMLConfiguration config;
+
+    /**
+     * Create the test case
+     *
+     * @param testName name of the test case
+     */
+    public TestCatalogResolver(String testName)
+    {
+        super(testName);
+    }
+
+    /**
+     * @return the suite of tests being tested
+     */
+    public static Test suite()
+    {
+        return new TestSuite(TestCatalogResolver.class);
+    }
+
+    protected void setUp() throws Exception
+    {
+        resolver = new CatalogResolver();
+        resolver.setCatalogFiles(CATALOG_FILES);
+        // resolver.setDebug(true);
+        config = new XMLConfiguration();
+        config.setEntityResolver(resolver);
+    }
+
+    protected void tearDown() throws Exception
+    {
+        resolver = null;
+        config = null;
+    }
+
+    public void testPublic() throws Exception
+    {
+        config.setFileName(PUBLIC_FILE);
+        config.load();
+    }
+
+    public void testRewriteSystem() throws Exception
+    {
+        config.setFileName(REWRITE_SYSTEM_FILE);
+        config.load();
+    }
+
+    /**
+     * Tests that the schema can be resolved and that XMLConfiguration will
+     * validate the file using the schema.
+     * @throws Exception
+     */
+    public void testSchemaResolver() throws Exception
+    {
+        config.setFileName(REWRITE_SCHEMA_FILE);
+        config.setSchemaValidation(true);
+        config.load();
+    }
+
+    public void testDebug() throws Exception
+    {
+        resolver.setDebug(true);
+        // There is no really good way to check this except to do something
+        // that causes debug output.
+    }
+
+    public void testLogger() throws Exception
+    {
+        Log log = LogFactory.getLog(this.getClass());
+        resolver.setLogger(log);
+        assertNotNull("No Logger returned", resolver.getLogger());
+        assertTrue("Incorrect Logger", log == resolver.getLogger());
+    }
+
+}

Propchange: commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestCatalogResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestCatalogResolver.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestCatalogResolver.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestDefaultConfigurationBuilder.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestDefaultConfigurationBuilder.java?rev=729581&r1=729580&r2=729581&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestDefaultConfigurationBuilder.java (original)
+++ commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestDefaultConfigurationBuilder.java Fri Dec 26 18:27:49 2008
@@ -73,6 +73,9 @@
     private static final File SYSTEM_PROPS_FILE = new File(
             "conf/testSystemProperties.xml");
 
+    private static final File VALIDATION_FILE = new File(
+            "conf/testValidation.xml");
+
     /** Constant for the name of an optional configuration.*/
     private static final String OPTIONAL_NAME = "optionalConfig";
 
@@ -822,6 +825,16 @@
     }
 
 
+    public void testValidation() throws Exception
+    {
+        factory.setFile(VALIDATION_FILE);
+        CombinedConfiguration cc = factory.getConfiguration(true);
+        String value = System.getProperty("key1");
+        assertNotNull("The test key was not located", value);
+        assertEquals("Incorrect value retrieved","value1",value);
+    }
+
+
     /**
      * A specialized combined configuration implementation used for testing
      * custom result classes.

Modified: commons/proper/configuration/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/xdocs/changes.xml?rev=729581&r1=729580&r2=729581&view=diff
==============================================================================
--- commons/proper/configuration/trunk/xdocs/changes.xml (original)
+++ commons/proper/configuration/trunk/xdocs/changes.xml Fri Dec 26 18:27:49 2008
@@ -23,6 +23,12 @@
 
   <body>
     <release version="1.7" date="in SVN" description="">
+      <action dev="rgoers" type="add" issue="CONFIGURATION-257">
+        Allow configurations to be validated using XML Schemas.
+      </action>
+      <action dev="rgoers" type="add" issue="CONFIGURATION-355">
+        Allow configurations to be validated using XML Schemas.
+      </action>
     </release>
 
     <release version="1.6" date="2008-12-25"

Modified: commons/proper/configuration/trunk/xdocs/dependencies.xml
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/xdocs/dependencies.xml?rev=729581&r1=729580&r2=729581&view=diff
==============================================================================
--- commons/proper/configuration/trunk/xdocs/dependencies.xml (original)
+++ commons/proper/configuration/trunk/xdocs/dependencies.xml Fri Dec 26 18:27:49 2008
@@ -80,6 +80,7 @@
                         <td>XMLPropertiesConfiguration</td>
                         <td>Java 1.4 or (xml-apis + xerces)</td>
                     </tr>
+
                     <tr>
                         <td>PropertyListConfiguration</td>
                         <td>commons-codec</td>
@@ -96,12 +97,16 @@
                         <td>commons-beanutils</td>
                     </tr>
                     <tr>
+                        <td>EnvironmentConfiguration</td>
+                        <td>Java 1.5 or ant 1.6.5</td>
+                    </tr>
+                    <tr>
                         <td>XPathExpressionEngine</td>
                         <td>commons-jxpath</td>
                     </tr>
                     <tr>
-                        <td>EnvironmentConfiguration</td>
-                        <td>Java 1.5 or ant 1.6.5</td>
+                        <td>CatalogResolver</td>
+                        <td>xml-resolver</td>
                     </tr>
                 </tbody>
             </table>
@@ -153,6 +158,10 @@
                       <td>commons-jxpath</td>
                       <td>1.2, 1.3</td>
                     </tr>
+                    <tr>
+                      <td>xml-resolver</td>
+                      <td>1.2</td>
+                    </tr>
                   </tbody>
                 </table>
                 </li>

Modified: commons/proper/configuration/trunk/xdocs/index.xml
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/xdocs/index.xml?rev=729581&r1=729580&r2=729581&view=diff
==============================================================================
--- commons/proper/configuration/trunk/xdocs/index.xml (original)
+++ commons/proper/configuration/trunk/xdocs/index.xml Fri Dec 26 18:27:49 2008
@@ -23,6 +23,7 @@
     <author email="jason@zenplex.com">Jason van Zyl</author>
     <author email="epugh@upstate.com">Eric Pugh</author>
     <author email="tobrien@discursive.com">Tim O'Brien</author>
+    <author email="rgoers@apache.org">Ralph Goers</author>
     <title>Java Configuration API</title>
   </properties>
 

Modified: commons/proper/configuration/trunk/xdocs/userguide/howto_xml.xml
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/xdocs/userguide/howto_xml.xml?rev=729581&r1=729580&r2=729581&view=diff
==============================================================================
--- commons/proper/configuration/trunk/xdocs/userguide/howto_xml.xml (original)
+++ commons/proper/configuration/trunk/xdocs/userguide/howto_xml.xml Fri Dec 26 18:27:49 2008
@@ -859,10 +859,11 @@
     <section name="Validation of XML configuration files">
         <p>
             XML parsers provide support for validation of XML documents to ensure that they
-            conform to a certain DTD. This feature can be useful for
-            configuration files, too. <code>XMLConfiguration</code> allows to enable
-            validation for the files to load.
+            conform to a certain DTD or XML Schema. This feature can be useful for
+            configuration files, too. <code>XMLConfiguration</code> allows this feature
+            to be enabled when files are loaded.
         </p>
+        <subsection name="Validation using a DTD">
         <p>
             The easiest way to turn on validation is to simply set the
             <code>validating</code> property to true as shown in the
@@ -883,6 +884,30 @@
             a custom <code>ErrorHandler</code> will be registered, which throws
             exceptions on simple and fatal parsing errors.
         </p>
+        </subsection>
+        <subsection name="Validation using a Schema">
+        <p>
+            XML Parsers also provide support for validating XML documents using an
+            XML Schema. XMLConfiguration provides a simple mechanism for enabling
+            this by setting the <code>schemaValidation</code> flag to true. This
+            will also set the <code>validating</code> flag to true so both do not
+            need to be set. The XML Parser will then use the schema defined in the
+            XML document to validate it. Enabling schema validation will also
+            enable the parser's namespace support.
+        </p>
+        <p>
+        <source><![CDATA[
+XMLConfiguration config = new XMLConfiguration();
+config.setFileName("myconfig.xml");
+config.setSchemaValidation(true);
+
+// This will throw a ConfigurationException if the XML document does not
+// conform to its Schema.
+config.load();
+]]></source>
+        </p>
+        </subsection>
+        <subsection name="Default Entity Resolution">
         <p>
             There is also some support for dealing with DTD files. Often the
             DTD of an XML document is stored locally so that it can be quickly
@@ -931,13 +956,71 @@
             configuration is loaded. So you cannot use one of the constructors
             that directly load the configuration.
         </p>
+        </subsection>
+        <subsection name="Enhanced Entity Resolution">
+        <p>
+            While the default entity resolver can be used under certain circumstances,
+            it does not work well when using the DefaultConfigurationBuilder.
+            Furthermore, in many circumstances the programmatic nature of
+            registering entities will tie the application tightly to the
+            XML content. In addition, because it only works with the public id it
+            cannot support XML documents using an XML Schema.
+        </p>
+        <p>
+            <a href="http://xml.apache.org/commons/components/resolver/resolver-article.html#s.whats.wrong">XML
+            Entity and URI Resolvers</a> describes using a set of catalog files to
+            resolve enitities. Commons Configuration provides support for
+            this Catalog Resolver through its own CatalogResolver class.
+        </p>
+         <source><![CDATA[
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<Employees xmlns="http://commons.apache.org/employee"
+           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+           xsi:schemaLocation="http://commons.apache.org/employee http://commons.apache.org/sample.xsd">
+  <Employee>
+    <SSN>555121211</SSN>
+    <Name>John Doe</Name>
+    <DateOfBirth>1975-05-15</DateOfBirth>
+    <EmployeeType>Exempt</EmployeeType>
+    <Salary>100000</Salary>
+  </Employee>
+</Employees>]]></source>
+        <p>
+            The XML sample above is an XML document using a default namespace of
+            http://commons.apache.org/employee. The schemaLocation allows a set
+            of namespaces and hints to the location of their corresponding
+            schemas. When processing the document the parser will pass the hint,
+            in this case http://commons.apache.org/sample.xsd, to the entity resolver
+            as the system id. More information on using schema locations can be found
+            at <a href="http://www.w3.org/TR/xmlschema-0/#schemaLocation">schemaLocation</a>.
+        </p>
+        <p>
+            The example that follows shows how to use the CatalogResolver when
+            processing an XMLConfiguration. It should be noted that by using the
+            setEntityResolver method any EntityResolver may be used, not just those
+            provided by Commons Configuration.
+        </p>
+        <source><![CDATA[
+CatalogResolver resolver = new CatalogResolver();
+resolver.setCatalogFiles("local/catalog.xml","http://test.org/catalogs/catalog1.xml");
+XMLConfiguration config = new XMLConfiguration();
+config.setEntityResolver(resolver);
+config.setSchemaValidation(true);  // enable schema validation
+config.setFileName("config.xml");
+config.load();
+]]></source>
+        </subsection>
+        <subsection name="Extending Validation and Entity Resolution">
         <p>
-            While using the <code>validating</code> flag is a simple means of
-            enabling validation it cannot fullfil more complex requirements,
-            e.g. schema validation. To be able to deal with such requirements
-            XMLConfiguration provides a generic way of setting up the XML
-            parser to use: A preconfigured <code>DocumentBuilder</code> object
-            can be passed to the <code>setDocumentBuilder()</code> method.
+            The mechanisms provided with Commons Configuration will hopefully be
+            sufficient in most cases, however there will certainly be circumstances
+            where they are not. XMLConfiguration provides two extension mechanisms
+            that should provide applications with all the flexibility they may
+            need. The first, registering a custom Entity Resolver has already been
+            discussed in the preceeding section. The second is that XMLConfiguration
+            provides a generic way of setting up the XML parser to use: A preconfigured
+            <code>DocumentBuilder</code> object can be passed to the
+            <code>setDocumentBuilder()</code> method.
         </p>
         <p>
             So an application can create a <code>DocumentBuilder</code> object
@@ -951,6 +1034,7 @@
             that the <code>registerEntityId()</code> method has no effect in
             this mode.
         </p>
+        </subsection>
     </section>
 </body>