[infinispan-commits] Infinispan SVN: r1776 - in trunk/core/src: main/java/org/infinispan/config/parsing and 3 other directories.
infinispan-commits at lists.jboss.org
infinispan-commits at lists.jboss.org
Tue May 11 08:53:30 EDT 2010
Author: manik.surtani at jboss.com
Date: 2010-05-11 08:53:28 -0400 (Tue, 11 May 2010)
New Revision: 1776
Added:
trunk/core/src/main/java/org/infinispan/config/parsing/NamespaceFilter.java
trunk/core/src/test/java/org/infinispan/config/parsing/MinimalConfigurationParsingTest.java
Removed:
trunk/core/src/test/java/org/infinispan/config/MinimalConfigurationParsingTest.java
Modified:
trunk/core/src/main/java/org/infinispan/config/InfinispanConfiguration.java
trunk/core/src/test/java/org/infinispan/config/parsing/XmlFileParsingTest.java
trunk/core/src/test/java/org/infinispan/test/TestingUtil.java
Log:
[ISPN-431] (Config files should not require XML namespaces, as defaults could be assumed)
Modified: trunk/core/src/main/java/org/infinispan/config/InfinispanConfiguration.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/config/InfinispanConfiguration.java 2010-05-11 12:50:11 UTC (rev 1775)
+++ trunk/core/src/main/java/org/infinispan/config/InfinispanConfiguration.java 2010-05-11 12:53:28 UTC (rev 1776)
@@ -22,11 +22,17 @@
package org.infinispan.config;
import org.infinispan.Version;
+import org.infinispan.config.parsing.NamespaceFilter;
import org.infinispan.config.parsing.XmlConfigurationParser;
import org.infinispan.util.FileLookup;
import org.infinispan.util.logging.Log;
import org.infinispan.util.logging.LogFactory;
import org.jboss.util.StringPropertyReplacer;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLFilter;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLFilterImpl;
+import org.xml.sax.helpers.XMLReaderFactory;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
@@ -36,6 +42,7 @@
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.SchemaFactory;
@@ -59,10 +66,9 @@
* files are read into instances of configuration class hierarchy as well as they provide meta data for configuration
* file XML schema generation. Please modify these annotations and Java element types they annotate with utmost
* understanding and care.
- *
- * @configRef name="infinispan",desc="The root element of an Infinispan configuration. This element can be empty for sensible defaults throughout, however that would only give you the most basic of local, non-clustered caches."
*
* @author Vladimir Blagojevic
+ * @configRef name="infinispan",desc="The root element of an Infinispan configuration. This element can be empty for sensible defaults throughout, however that would only give you the most basic of local, non-clustered caches."
* @since 4.0
*/
@XmlRootElement(name = "infinispan")
@@ -107,10 +113,10 @@
* @throws IOException if there are any issues creating InfinispanConfiguration object
*/
public static InfinispanConfiguration newInfinispanConfiguration(String configFileName,
- String schemaFileName) throws IOException {
+ String schemaFileName) throws IOException {
return newInfinispanConfiguration(configFileName, schemaFileName, null);
}
-
+
/**
* Factory method to create an instance of Infinispan configuration. If users want to verify configuration file
* correctness against Infinispan schema then appropriate schema file name should be provided as well.
@@ -122,13 +128,12 @@
*
* @param configFileName configuration file name
* @param schemaFileName schema file name
- * @param cbv configuration bean visitor passed to constructed InfinispanConfiguration
- *
+ * @param cbv configuration bean visitor passed to constructed InfinispanConfiguration
* @return infinispan configuration
* @throws IOException if there are any issues creating InfinispanConfiguration object
*/
public static InfinispanConfiguration newInfinispanConfiguration(String configFileName,
- String schemaFileName, ConfigurationBeanVisitor cbv) throws IOException {
+ String schemaFileName, ConfigurationBeanVisitor cbv) throws IOException {
InputStream inputStream = configFileName != null ? findInputStream(configFileName) : null;
InputStream schemaIS = schemaFileName != null ? findInputStream(schemaFileName) : null;
@@ -148,7 +153,7 @@
* @throws IOException if there are any issues creating InfinispanConfiguration object
*/
public static InfinispanConfiguration newInfinispanConfiguration(String configFileName)
- throws IOException {
+ throws IOException {
return newInfinispanConfiguration(configFileName, null);
}
@@ -160,7 +165,7 @@
* @throws IOException if there are any issues creating InfinispanConfiguration object
*/
public static InfinispanConfiguration newInfinispanConfiguration(InputStream config)
- throws IOException {
+ throws IOException {
return newInfinispanConfiguration(config, null);
}
@@ -170,51 +175,53 @@
*
* @param config configuration input stream
* @param schema schema inputstream
- *
* @return infinispan configuration
* @throws IOException if there are any issues creating InfinispanConfiguration object
*/
public static InfinispanConfiguration newInfinispanConfiguration(InputStream config,
InputStream schema) throws IOException {
- return newInfinispanConfiguration(config,schema,null);
+ return newInfinispanConfiguration(config, schema, null);
}
-
+
/**
* Factory method to create an instance of Infinispan configuration. If users want to verify configuration file
* correctness against Infinispan schema then appropriate schema input stream should be provided as well.
*
* @param config configuration input stream
* @param schema schema inputstream
- * @param cbv configuration bean visitor passed to constructed InfinispanConfiguration
- *
+ * @param cbv configuration bean visitor passed to constructed InfinispanConfiguration
* @return infinispan configuration
* @throws IOException if there are any issues creating InfinispanConfiguration object
*/
public static InfinispanConfiguration newInfinispanConfiguration(InputStream config,
- InputStream schema, ConfigurationBeanVisitor cbv) throws IOException {
+ InputStream schema, ConfigurationBeanVisitor cbv) throws IOException {
try {
JAXBContext jc = JAXBContext.newInstance(InfinispanConfiguration.class);
- Unmarshaller u = jc.createUnmarshaller();
+ Unmarshaller u = jc.createUnmarshaller();
+ NamespaceFilter nf = new NamespaceFilter();
+ XMLReader reader = XMLReaderFactory.createXMLReader();
+ nf.setParent(reader);
if (schema != null) {
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
u.setSchema(factory.newSchema(new StreamSource(schema)));
u.setEventHandler(new ValidationEventHandler() {
@Override
- public boolean handleEvent(ValidationEvent event) {
+ public boolean handleEvent(ValidationEvent event) {
int severity = event.getSeverity();
return (severity != ValidationEvent.FATAL_ERROR && severity != ValidationEvent.ERROR);
}
});
}
-
- StreamSource source = null;
+
+ SAXSource source = null;
if (skipTokenReplacement()) {
- source = new StreamSource(config);
+ source = new SAXSource(nf, new InputSource(config));
} else {
- source = replaceProperties(config);
+ source = replaceProperties(config, nf);
}
- InfinispanConfiguration ic = (InfinispanConfiguration) u.unmarshal(source);
+
+ InfinispanConfiguration ic = (InfinispanConfiguration) u.unmarshal(source);
ic.accept(cbv);
return ic;
} catch (ConfigurationException cex) {
@@ -228,30 +235,31 @@
}
}
- private static StreamSource replaceProperties(InputStream config) throws Exception{
- BufferedReader br = new BufferedReader ( new InputStreamReader(config));
+ private static SAXSource replaceProperties(InputStream config, XMLFilter filter) throws Exception {
+ BufferedReader br = new BufferedReader(new InputStreamReader(config));
StringBuilder w = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
int dollar = line.indexOf('$');
- if(dollar >0 && line.indexOf('{',dollar) > 0 && line.indexOf('}',dollar)>0) {
+ if (dollar > 0 && line.indexOf('{', dollar) > 0 && line.indexOf('}', dollar) > 0) {
String replacedLine = StringPropertyReplacer.replaceProperties(line);
if (line.equals(replacedLine)) {
- log.warn("Property " +line.substring(line.indexOf('{')+1,line.indexOf('}')) + " could not be replaced as intended!");
+ log.warn("Property " + line.substring(line.indexOf('{') + 1, line.indexOf('}')) + " could not be replaced as intended!");
}
w.append(replacedLine);
} else {
w.append(line);
- }
+ }
}
- return new StreamSource(new StringReader(w.toString()));
+
+ return new SAXSource(filter, new InputSource(new StringReader(w.toString())));
}
private static boolean skipSchemaValidation() {
String s = System.getProperty(VALIDATING_SYSTEM_PROPERTY);
return s != null && !Boolean.parseBoolean(s);
}
-
+
private static boolean skipTokenReplacement() {
String s = System.getProperty(SKIP_TOKEN_REPLACEMENT, "false");
return s != null && Boolean.parseBoolean(s);
@@ -297,18 +305,18 @@
public InfinispanConfiguration() {
super();
}
-
- public void accept(ConfigurationBeanVisitor v) {
- if (v != null) {
- global.accept(v);
- defaultConfiguration.accept(v);
- for (Configuration c : namedCaches) {
- c.accept(v);
- }
- v.visitInfinispanConfiguration(this);
- }
- }
+ public void accept(ConfigurationBeanVisitor v) {
+ if (v != null) {
+ global.accept(v);
+ defaultConfiguration.accept(v);
+ for (Configuration c : namedCaches) {
+ c.accept(v);
+ }
+ v.visitInfinispanConfiguration(this);
+ }
+ }
+
private static InputStream findInputStream(String fileName) throws FileNotFoundException {
if (fileName == null)
throw new NullPointerException("File name cannot be null!");
@@ -316,7 +324,7 @@
InputStream is = fileLookup.lookupFile(fileName);
if (is == null)
throw new FileNotFoundException("File " + fileName
- + " could not be found, either on the classpath or on the file system!");
+ + " could not be found, either on the classpath or on the file system!");
return is;
}
@@ -328,7 +336,7 @@
return global;
}
- public Map<String, Configuration> parseNamedConfigurations() throws ConfigurationException {
+ public Map<String, Configuration> parseNamedConfigurations() throws ConfigurationException {
Map<String, Configuration> map = new HashMap<String, Configuration>(7);
for (Configuration conf : namedCaches) {
map.put(conf.getName(), conf);
Added: trunk/core/src/main/java/org/infinispan/config/parsing/NamespaceFilter.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/config/parsing/NamespaceFilter.java (rev 0)
+++ trunk/core/src/main/java/org/infinispan/config/parsing/NamespaceFilter.java 2010-05-11 12:53:28 UTC (rev 1776)
@@ -0,0 +1,55 @@
+package org.infinispan.config.parsing;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.XMLFilterImpl;
+
+/**
+ * Adds namespace where needed when parsing an XML document
+ */
+public class NamespaceFilter extends XMLFilterImpl {
+
+ private static final String NAMESPACE = "urn:infinispan:config:4.0";
+
+ //State variable
+ private boolean addedNamespace = false;
+
+ @Override
+ public void startDocument() throws SAXException {
+ super.startDocument();
+ startControlledPrefixMapping();
+ }
+
+
+ @Override
+ public void startElement(String arg0, String arg1, String arg2,
+ Attributes arg3) throws SAXException {
+
+ super.startElement(this.NAMESPACE, arg1, arg2, arg3);
+ }
+
+ @Override
+ public void endElement(String arg0, String arg1, String arg2)
+ throws SAXException {
+
+ super.endElement(this.NAMESPACE, arg1, arg2);
+ }
+
+ @Override
+ public void startPrefixMapping(String prefix, String url)
+ throws SAXException {
+ this.startControlledPrefixMapping();
+ }
+
+ private void startControlledPrefixMapping() throws SAXException {
+
+ if (!this.addedNamespace) {
+ //We should add namespace since it is set and has not yet been done.
+ super.startPrefixMapping("", this.NAMESPACE);
+
+ //Make sure we dont do it twice
+ this.addedNamespace = true;
+ }
+ }
+
+}
\ No newline at end of file
Property changes on: trunk/core/src/main/java/org/infinispan/config/parsing/NamespaceFilter.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Deleted: trunk/core/src/test/java/org/infinispan/config/MinimalConfigurationParsingTest.java
===================================================================
--- trunk/core/src/test/java/org/infinispan/config/MinimalConfigurationParsingTest.java 2010-05-11 12:50:11 UTC (rev 1775)
+++ trunk/core/src/test/java/org/infinispan/config/MinimalConfigurationParsingTest.java 2010-05-11 12:53:28 UTC (rev 1776)
@@ -1,51 +0,0 @@
-package org.infinispan.config;
-
-import org.infinispan.test.TestingUtil;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-import static org.infinispan.test.TestingUtil.INFINISPAN_END_TAG;
-import static org.infinispan.test.TestingUtil.INFINISPAN_START_TAG;
-
- at Test(groups = "unit", testName = "config.MinimalConfigurationParsingTest")
-public class MinimalConfigurationParsingTest {
- public void testGlobalAndDefaultSection() throws IOException {
- String xml = INFINISPAN_START_TAG +
- " <global />\n" +
- " <default>\n" +
- " <locking concurrencyLevel=\"10000\" isolationLevel=\"READ_COMMITTED\" />\n" +
- " </default>\n" +
- INFINISPAN_END_TAG;
- testXml(xml);
- }
-
- public void testNoGlobalSection() throws IOException {
- String xml = INFINISPAN_START_TAG +
- " <default>\n" +
- " <locking concurrencyLevel=\"10000\" isolationLevel=\"READ_COMMITTED\" />\n" +
- " </default>\n" +
- INFINISPAN_END_TAG;
- testXml(xml);
- }
-
- public void testNoDefaultSection() throws IOException {
- String xml = INFINISPAN_START_TAG +
- " <global />\n" +
- INFINISPAN_END_TAG;
- testXml(xml);
- }
-
- public void testNoSections() throws IOException {
- String xml = INFINISPAN_START_TAG + INFINISPAN_END_TAG;
- testXml(xml);
- }
-
- private void testXml(String xml) throws IOException {
- InputStream stream = new ByteArrayInputStream(xml.getBytes());
- InfinispanConfiguration ic = InfinispanConfiguration.newInfinispanConfiguration(stream);
- assert ic != null;
- }
-}
Copied: trunk/core/src/test/java/org/infinispan/config/parsing/MinimalConfigurationParsingTest.java (from rev 1773, trunk/core/src/test/java/org/infinispan/config/MinimalConfigurationParsingTest.java)
===================================================================
--- trunk/core/src/test/java/org/infinispan/config/parsing/MinimalConfigurationParsingTest.java (rev 0)
+++ trunk/core/src/test/java/org/infinispan/config/parsing/MinimalConfigurationParsingTest.java 2010-05-11 12:53:28 UTC (rev 1776)
@@ -0,0 +1,58 @@
+package org.infinispan.config.parsing;
+
+import org.infinispan.config.InfinispanConfiguration;
+import org.infinispan.test.TestingUtil;
+import org.testng.annotations.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import static org.infinispan.test.TestingUtil.INFINISPAN_END_TAG;
+import static org.infinispan.test.TestingUtil.INFINISPAN_START_TAG;
+import static org.infinispan.test.TestingUtil.INFINISPAN_START_TAG_NO_SCHEMA;
+
+ at Test(groups = "unit", testName = "config.MinimalConfigurationParsingTest")
+public class MinimalConfigurationParsingTest {
+ public void testGlobalAndDefaultSection() throws IOException {
+ String xml = INFINISPAN_START_TAG +
+ " <global />\n" +
+ " <default>\n" +
+ " <locking concurrencyLevel=\"10000\" isolationLevel=\"READ_COMMITTED\" />\n" +
+ " </default>\n" +
+ INFINISPAN_END_TAG;
+ testXml(xml);
+ }
+
+ public void testNoGlobalSection() throws IOException {
+ String xml = INFINISPAN_START_TAG +
+ " <default>\n" +
+ " <locking concurrencyLevel=\"10000\" isolationLevel=\"READ_COMMITTED\" />\n" +
+ " </default>\n" +
+ INFINISPAN_END_TAG;
+ testXml(xml);
+ }
+
+ public void testNoDefaultSection() throws IOException {
+ String xml = INFINISPAN_START_TAG +
+ " <global />\n" +
+ INFINISPAN_END_TAG;
+ testXml(xml);
+ }
+
+ public void testNoSections() throws IOException {
+ String xml = INFINISPAN_START_TAG + INFINISPAN_END_TAG;
+ testXml(xml);
+ }
+
+ public void testNoSchema() throws IOException {
+ String xml = INFINISPAN_START_TAG_NO_SCHEMA + INFINISPAN_END_TAG;
+ testXml(xml);
+ }
+
+ private void testXml(String xml) throws IOException {
+ InputStream stream = new ByteArrayInputStream(xml.getBytes());
+ InfinispanConfiguration ic = InfinispanConfiguration.newInfinispanConfiguration(stream);
+ assert ic != null;
+ }
+}
Property changes on: trunk/core/src/test/java/org/infinispan/config/parsing/MinimalConfigurationParsingTest.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Modified: trunk/core/src/test/java/org/infinispan/config/parsing/XmlFileParsingTest.java
===================================================================
--- trunk/core/src/test/java/org/infinispan/config/parsing/XmlFileParsingTest.java 2010-05-11 12:50:11 UTC (rev 1775)
+++ trunk/core/src/test/java/org/infinispan/config/parsing/XmlFileParsingTest.java 2010-05-11 12:53:28 UTC (rev 1776)
@@ -22,6 +22,10 @@
import java.io.InputStream;
import java.util.Map;
+import static org.infinispan.test.TestingUtil.INFINISPAN_END_TAG;
+import static org.infinispan.test.TestingUtil.INFINISPAN_START_TAG;
+import static org.infinispan.test.TestingUtil.INFINISPAN_START_TAG_NO_SCHEMA;
+
@Test(groups = "unit", testName = "config.parsing.XmlFileParsingTest")
public class XmlFileParsingTest extends AbstractInfinispanTest {
@@ -42,7 +46,7 @@
}
public void testNoNamedCaches() throws Exception {
- String config = TestingUtil.INFINISPAN_START_TAG +
+ String config = INFINISPAN_START_TAG +
" <global>\n" +
" <transport clusterName=\"demoCluster\"/>\n" +
" </global>\n" +
@@ -68,6 +72,21 @@
}
+ public void testNoSchemaWithStuff() throws IOException {
+ String xml = INFINISPAN_START_TAG_NO_SCHEMA +
+ " <default>\n" +
+ " <locking concurrencyLevel=\"10000\" isolationLevel=\"REPEATABLE_READ\" />\n" +
+ " </default>\n" +
+ INFINISPAN_END_TAG;
+ InputStream is = new ByteArrayInputStream(xml.getBytes());
+ InfinispanConfiguration c = InfinispanConfiguration.newInfinispanConfiguration(is);
+ GlobalConfiguration gc = c.parseGlobalConfiguration();
+ Configuration def = c.parseDefaultConfiguration();
+ assert def.getConcurrencyLevel() == 10000;
+ assert def.getIsolationLevel() == IsolationLevel.REPEATABLE_READ;
+ }
+
+
private void testNamedCacheFile(XmlConfigurationParser parser) throws IOException {
GlobalConfiguration gc = parser.parseGlobalConfiguration();
Modified: trunk/core/src/test/java/org/infinispan/test/TestingUtil.java
===================================================================
--- trunk/core/src/test/java/org/infinispan/test/TestingUtil.java 2010-05-11 12:50:11 UTC (rev 1775)
+++ trunk/core/src/test/java/org/infinispan/test/TestingUtil.java 2010-05-11 12:53:28 UTC (rev 1776)
@@ -58,6 +58,7 @@
" xsi:schemaLocation=\"urn:infinispan:config:4.0 http://www.infinispan.org/schemas/infinispan-config-4.0.xsd\"\n" +
" xmlns=\"urn:infinispan:config:4.0\">";
public static final String INFINISPAN_END_TAG="</infinispan>";
+ public static final String INFINISPAN_START_TAG_NO_SCHEMA="<infinispan>";
/**
More information about the infinispan-commits
mailing list