[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