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 2009/05/05 02:04:18 UTC
svn commit: r771507 - in /commons/proper/configuration/trunk: conf/
src/java/org/apache/commons/configuration/
src/java/org/apache/commons/configuration/resolver/
src/test/org/apache/commons/configuration/
Author: rgoers
Date: Tue May 5 00:04:18 2009
New Revision: 771507
URL: http://svn.apache.org/viewvc?rev=771507&view=rev
Log:
Pass EntityResolver through MultiFileHierarchicalConfiguration. Allow CatalogResolver to load Catalog even if xml-resolver is in lib/endorsed.
Added:
commons/proper/configuration/trunk/conf/sample_1001.xml
- copied, changed from r763836, commons/proper/configuration/trunk/conf/sample.xml
commons/proper/configuration/trunk/conf/testValidation3.xml
- copied, changed from r768677, commons/proper/configuration/trunk/conf/testValidation2.xml
commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/EntityResolverSupport.java
Modified:
commons/proper/configuration/trunk/conf/sample.xsd
commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/DefaultConfigurationBuilder.java
commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/MultiFileHierarchicalConfiguration.java
commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/XMLConfiguration.java
commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/CatalogResolver.java
commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestDefaultConfigurationBuilder.java
Modified: commons/proper/configuration/trunk/conf/sample.xsd
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/conf/sample.xsd?rev=771507&r1=771506&r2=771507&view=diff
==============================================================================
--- commons/proper/configuration/trunk/conf/sample.xsd (original)
+++ commons/proper/configuration/trunk/conf/sample.xsd Tue May 5 00:04:18 2009
@@ -1,18 +1,22 @@
<?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 attributeFormDefault="unqualified" elementFormDefault="qualified"
+ targetNamespace="http://commons.apache.org/employee"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <xs:element name="Employees" xmlns="http://commons.apache.org/employee">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Employee">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element type="xs:string" name="SSN" minOccurs="0"/>
+ <xs:element type="xs:string" name="Name" minOccurs="0"/>
+ <xs:element type="xs:string" name="DateOfBirth" minOccurs="0"/>
+ <xs:element type="xs:string" name="EmployeeType" minOccurs="0"/>
+ <xs:element type="xs:string" name="Salary" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
</xs:schema>
\ No newline at end of file
Copied: commons/proper/configuration/trunk/conf/sample_1001.xml (from r763836, commons/proper/configuration/trunk/conf/sample.xml)
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/conf/sample_1001.xml?p2=commons/proper/configuration/trunk/conf/sample_1001.xml&p1=commons/proper/configuration/trunk/conf/sample.xml&r1=763836&r2=771507&rev=771507&view=diff
==============================================================================
--- commons/proper/configuration/trunk/conf/sample.xml (original)
+++ commons/proper/configuration/trunk/conf/sample_1001.xml Tue May 5 00:04:18 2009
@@ -3,10 +3,6 @@
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>
+ <Name>Jane Doe</Name>
</Employee>
</Employees>
\ No newline at end of file
Copied: commons/proper/configuration/trunk/conf/testValidation3.xml (from r768677, commons/proper/configuration/trunk/conf/testValidation2.xml)
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/conf/testValidation3.xml?p2=commons/proper/configuration/trunk/conf/testValidation3.xml&p1=commons/proper/configuration/trunk/conf/testValidation2.xml&r1=768677&r2=771507&rev=771507&view=diff
==============================================================================
--- commons/proper/configuration/trunk/conf/testValidation2.xml (original)
+++ commons/proper/configuration/trunk/conf/testValidation3.xml Tue May 5 00:04:18 2009
@@ -2,15 +2,24 @@
<!-- Test configuration definition file that demonstrates complex initialization -->
<configuration>
<header>
- <result delimiterParsingDisabled="true">
- <nodeCombiner config-class="org.apache.commons.configuration.tree.OverrideCombiner"/>
+ <result delimiterParsingDisabled="true" forceReloadCheck="true" loggerName="TestLogger"
+ config-class="org.apache.commons.configuration.DynamicCombinedConfiguration"
+ keyPattern="$${sys:Id}">
+ <nodeCombiner config-class="org.apache.commons.configuration.tree.MergeCombiner"/>
<expressionEngine config-class="org.apache.commons.configuration.tree.xpath.XPathExpressionEngine"/>
</result>
- <entity-resolver catalogFiles="file://${sys:user.dir}/conf/catalog2.xml"/>
+ <providers>
+ <provider config-tag="multifile"
+ config-class="org.apache.commons.configuration.DefaultConfigurationBuilder$FileConfigurationProvider"
+ configurationClass="org.apache.commons.configuration.MultiFileHierarchicalConfiguration"/>
+ </providers><entity-resolver catalogFiles="catalog.xml"/>
</header>
<system/>
<properties fileName="test.properties.xml" throwExceptionOnMissing="true"
config-name="properties">
</properties>
- <xml fileName="file://${sys:user.dir}/conf/sample.xml" config-name="xml" schemaValidation="true"/>
+ <multifile filePattern="sample_$$${sys:Id}.xml"
+ config-name="clientConfig" delimiterParsingDisabled="true" schemaValidation="true">
+ </multifile>
+ <xml fileName="sample.xml" config-name="xml" schemaValidation="true"/>
</configuration>
\ No newline at end of file
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=771507&r1=771506&r2=771507&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 Tue May 5 00:04:18 2009
@@ -37,6 +37,7 @@
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.configuration.resolver.EntityResolverSupport;
import org.apache.commons.lang.text.StrLookup;
import org.apache.commons.logging.LogFactory;
import org.xml.sax.EntityResolver;
@@ -1386,7 +1387,20 @@
public AbstractConfiguration getEmptyConfiguration(
ConfigurationDeclaration decl) throws Exception
{
- return super.getConfiguration(decl);
+ AbstractConfiguration config = super.getConfiguration(decl);
+
+ /**
+ * Some wrapper classes may need to pass the EntityResolver to XMLConfigurations
+ * they construct buy may not be an XMLConfiguration.
+ */
+ if (config instanceof EntityResolverSupport)
+ {
+ DefaultConfigurationBuilder builder = decl.getConfigurationBuilder();
+ EntityResolver resolver = builder.getEntityResolver();
+ ((EntityResolverSupport)config).setEntityResolver(resolver);
+ }
+
+ return config;
}
/**
Modified: commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/MultiFileHierarchicalConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/MultiFileHierarchicalConfiguration.java?rev=771507&r1=771506&r2=771507&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/MultiFileHierarchicalConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/MultiFileHierarchicalConfiguration.java Tue May 5 00:04:18 2009
@@ -38,9 +38,11 @@
import org.apache.commons.configuration.tree.ConfigurationNode;
import org.apache.commons.configuration.tree.ExpressionEngine;
import org.apache.commons.configuration.reloading.ReloadingStrategy;
+import org.apache.commons.configuration.resolver.EntityResolverSupport;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.xml.sax.EntityResolver;
/**
* This class provides access to multiple configuration files that reside in a location that
@@ -55,7 +57,7 @@
* @version $Id$
*/
public class MultiFileHierarchicalConfiguration extends AbstractHierarchicalFileConfiguration
- implements ConfigurationListener, ConfigurationErrorListener
+ implements ConfigurationListener, ConfigurationErrorListener, EntityResolverSupport
{
/**
* Prevent recursion while resolving unprefixed properties.
@@ -95,6 +97,9 @@
/** The Reloading strategy to use on created configurations */
private ReloadingStrategy fileStrategy;
+ /** The EntityResolver */
+ private EntityResolver entityResolver;
+
/**
* Default Constructor.
*/
@@ -169,6 +174,16 @@
this.fileStrategy = strategy;
}
+ public void setEntityResolver(EntityResolver entityResolver)
+ {
+ this.entityResolver = entityResolver;
+ }
+
+ public EntityResolver getEntityResolver()
+ {
+ return this.entityResolver;
+ }
+
/**
* Set to true if an empty Configuration should be returned when loading fails. If
* false an exception will be thrown.
@@ -703,6 +718,7 @@
configuration.setDelimiterParsingDisabled(isDelimiterParsingDisabled());
configuration.setValidating(validating);
configuration.setSchemaValidation(schemaValidation);
+ configuration.setEntityResolver(entityResolver);
configuration.setAttributeSplittingDisabled(attributeSplittingDisabled);
configuration.setListDelimiter(getListDelimiter());
configuration.addConfigurationListener(this);
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=771507&r1=771506&r2=771507&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 Tue May 5 00:04:18 2009
@@ -936,6 +936,11 @@
initProperties(newDocument, oldDocument == null);
document = (oldDocument == null) ? newDocument : oldDocument;
}
+ catch (SAXParseException spe)
+ {
+ this.getLogger().debug("Error parsing " + source.getSystemId(), spe);
+ throw new ConfigurationException("Error parsing " + source.getSystemId(), spe);
+ }
catch (Exception e)
{
throw new ConfigurationException("Unable to load the configuration", e);
Modified: 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=771507&r1=771506&r2=771507&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/CatalogResolver.java (original)
+++ commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/CatalogResolver.java Tue May 5 00:04:18 2009
@@ -20,6 +20,7 @@
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.apache.xml.resolver.CatalogException;
+import org.apache.xml.resolver.Catalog;
import org.apache.xml.resolver.readers.CatalogReader;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.impl.NoOpLog;
@@ -88,7 +89,6 @@
{
manager.setIgnoreMissingProperties(true);
manager.setUseStaticCatalog(false);
- manager.setCatalogClassName(Catalog.class.getName());
manager.setFileSystem(fs);
setLogger(null);
}
@@ -255,6 +255,9 @@
/** The String Substitutor */
private StrSubstitutor substitutor;
+ /** The static catalog used by this manager. */
+ private static org.apache.xml.resolver.Catalog staticCatalog = null;
+
/**
* Set the FileSystem
* @param fileSystem The FileSystem in use.
@@ -303,6 +306,52 @@
{
return this.substitutor;
}
+
+
+ /**
+ * Get a new catalog instance. This method is only overridden because xml-resolver
+ * might be in a parent ClassLoader and will be incapable of loading our Catalog
+ * implementation.
+ *
+ * This method always returns a new instance of the underlying catalog class.
+ */
+ public org.apache.xml.resolver.Catalog getPrivateCatalog()
+ {
+ org.apache.xml.resolver.Catalog catalog = staticCatalog;
+
+ if (catalog == null || !getUseStaticCatalog())
+ {
+ try
+ {
+ catalog = new Catalog();
+ catalog.setCatalogManager(this);
+ catalog.setupReaders();
+ catalog.loadSystemCatalogs();
+ }
+ catch (Exception ex)
+ {
+ ex.printStackTrace();
+ }
+
+ if (getUseStaticCatalog())
+ {
+ staticCatalog = catalog;
+ }
+ }
+
+ return catalog;
+ }
+
+ /**
+ * Get a catalog instance.
+ *
+ * If this manager uses static catalogs, the same static catalog will
+ * always be returned. Otherwise a new catalog will be returned.
+ */
+ public org.apache.xml.resolver.Catalog getCatalog()
+ {
+ return getPrivateCatalog();
+ }
}
/**
Added: commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/EntityResolverSupport.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/EntityResolverSupport.java?rev=771507&view=auto
==============================================================================
--- commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/EntityResolverSupport.java (added)
+++ commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/resolver/EntityResolverSupport.java Tue May 5 00:04:18 2009
@@ -0,0 +1,37 @@
+/*
+ * 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;
+
+/**
+ * Interface that identifies the class as using an EntityResolver
+ */
+public interface EntityResolverSupport
+{
+ /**
+ * Return the EntityResolver associated with the class.
+ * @return The EntityResolver.
+ */
+ EntityResolver getEntityResolver();
+
+ /**
+ * Set the EntityResolver to assoicate with this class.
+ * @param resolver The EntityResolver
+ */
+ void setEntityResolver(EntityResolver resolver);
+}
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=771507&r1=771506&r2=771507&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 Tue May 5 00:04:18 2009
@@ -87,6 +87,9 @@
private static final File VALIDATION_FILE = new File(
"conf/testValidation.xml");
+ private static final File VALIDATION3_FILE = new File(
+ "conf/testValidation3.xml");
+
private static final File MULTI_TENENT_FILE = new File(
"conf/testMultiTenentConfigurationBuilder.xml");
@@ -851,6 +854,21 @@
assertEquals("Incorrect value retrieved","value1",value);
}
+
+ public void testValidation3() throws Exception
+ {
+ System.getProperties().remove("Id");
+ factory.setFile(VALIDATION3_FILE);
+ CombinedConfiguration config = factory.getConfiguration(true);
+ String value = config.getString("Employee/Name");
+ assertNotNull("The test key was not located", value);
+ assertEquals("Incorrect value retrieved","John Doe",value);
+ System.setProperty("Id", "1001");
+ value = config.getString("Employee/Name");
+ assertNotNull("The test key was not located", value);
+ assertEquals("Incorrect value retrieved","Jane Doe",value);
+ }
+
public void testMultiTenentConfiguration() throws Exception
{
factory.setFile(MULTI_TENENT_FILE);