[infinispan-commits] Infinispan SVN: r1104 - in trunk: core/src/main/java/org/infinispan/util and 6 other directories.

infinispan-commits at lists.jboss.org infinispan-commits at lists.jboss.org
Thu Nov 5 11:08:34 EST 2009


Author: vblagojevic at jboss.com
Date: 2009-11-05 11:08:33 -0500 (Thu, 05 Nov 2009)
New Revision: 1104

Added:
   trunk/core/src/main/java/org/infinispan/config/ModuleConfigurationResolverVisitor.java
   trunk/core/src/main/java/org/infinispan/util/ModuleProperties.java
   trunk/query/src/main/java/org/infinispan/query/config/
   trunk/query/src/main/java/org/infinispan/query/config/QueryConfigurationBean.java
   trunk/query/src/main/java/org/infinispan/query/config/package-info.java
   trunk/query/src/main/resources/
   trunk/query/src/main/resources/infinispan-module.properties
   trunk/query/src/test/java/org/infinispan/query/config/
   trunk/query/src/test/java/org/infinispan/query/config/QueryParsingTest.java
Modified:
   trunk/core/src/main/java/org/infinispan/config/AbstractConfigurationBeanVisitor.java
   trunk/core/src/main/java/org/infinispan/config/Configuration.java
   trunk/core/src/main/java/org/infinispan/config/ConfigurationBeanVisitor.java
   trunk/core/src/main/java/org/infinispan/config/InfinispanConfiguration.java
Log:
[ISPN-193] - Provide a mechanism for the configuration XML parser to pass XML attributes to other modules for handling

Modified: trunk/core/src/main/java/org/infinispan/config/AbstractConfigurationBeanVisitor.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/config/AbstractConfigurationBeanVisitor.java	2009-11-04 22:30:20 UTC (rev 1103)
+++ trunk/core/src/main/java/org/infinispan/config/AbstractConfigurationBeanVisitor.java	2009-11-05 16:08:33 UTC (rev 1104)
@@ -31,6 +31,7 @@
 import org.infinispan.config.Configuration.HashType;
 import org.infinispan.config.Configuration.L1Type;
 import org.infinispan.config.Configuration.LockingType;
+import org.infinispan.config.Configuration.ModulesExtensionType;
 import org.infinispan.config.Configuration.StateRetrievalType;
 import org.infinispan.config.Configuration.SyncType;
 import org.infinispan.config.Configuration.TransactionType;
@@ -141,6 +142,10 @@
    public void visitLockingType(LockingType bean) {
       defaultVisit(bean);
    }
+   
+   public void visitModulesExtentionsType(ModulesExtensionType bean) {
+       defaultVisit(bean);
+   }
 
    public void visitSerializationType(SerializationType bean) {
       defaultVisit(bean);

Modified: trunk/core/src/main/java/org/infinispan/config/Configuration.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/config/Configuration.java	2009-11-04 22:30:20 UTC (rev 1103)
+++ trunk/core/src/main/java/org/infinispan/config/Configuration.java	2009-11-05 16:08:33 UTC (rev 1104)
@@ -29,11 +29,14 @@
 import org.infinispan.factories.annotations.Start;
 import org.infinispan.transaction.lookup.GenericTransactionManagerLookup;
 import org.infinispan.transaction.lookup.TransactionManagerLookup;
+import org.infinispan.util.Util;
 import org.infinispan.util.concurrent.IsolationLevel;
 import org.infinispan.CacheException;
+import org.w3c.dom.Element;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyElement;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlTransient;
@@ -68,7 +71,11 @@
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(propOrder={})
 public class Configuration extends AbstractNamedCacheConfigurationBean {  
+    
+   public static final String ELEMENT_MODULE_NAME = "module";
 
+   public static final String MODULE_IDENTIFIER = "name";
+
    private static final long serialVersionUID = 5553791890144997466L;
 
    // reference to a global configuration
@@ -121,6 +128,9 @@
 
    @XmlElement
    private DeadlockDetectionType deadlockDetection = new DeadlockDetectionType();
+   
+   @XmlElement
+   private ModulesExtensionType modules = new ModulesExtensionType();
 
    @SuppressWarnings("unused")
    @Start(priority = 1)
@@ -179,6 +189,14 @@
    public void setDeadlockDetectionSpinDuration(long eagerDeadlockSpinDuration) {
       this.deadlockDetection.setSpinDuration(eagerDeadlockSpinDuration);
    }
+   
+   public ModuleConfigurationBean getModuleConfigurationBean(String moduleName) {
+       return modules.getModuleConfigBean(moduleName);
+   }
+   
+   public List<ModuleConfigurationBean> getModuleConfigurationBeans() {
+       return modules.moduleList;
+   }
 
    public boolean isEnableDeadlockDetection() {
       return deadlockDetection.enabled;
@@ -591,6 +609,7 @@
       locking.accept(v);
       transaction.accept(v);
       unsafe.accept(v);
+      modules.accept(v);
       v.visitConfiguration(this);
    }
 
@@ -1789,7 +1808,120 @@
          return customInterceptors != null ? customInterceptors.hashCode() : 0;
       }
    }
+   
+   /**
+    * 
+    * @configRef name="modules",desc="Configures custom modules"
+    */
+   @XmlAccessorType(XmlAccessType.FIELD)
+   public static class ModulesExtensionType extends AbstractNamedCacheConfigurationBean {
 
+       /** The serialVersionUID */
+       private static final long serialVersionUID = 7187545782011884661L;
+
+       @XmlElement(name = ELEMENT_MODULE_NAME)
+       private List<ModuleConfigurationBean> moduleList = new ArrayList<ModuleConfigurationBean>();
+
+       @Override
+       public ModulesExtensionType clone() throws CloneNotSupportedException {
+           ModulesExtensionType dolly = (ModulesExtensionType) super.clone();
+           if (moduleList != null) {
+               dolly.moduleList = new ArrayList<ModuleConfigurationBean>();
+               for (ModuleConfigurationBean config : moduleList) {
+                   ModuleConfigurationBean clone = config.clone();
+                   dolly.moduleList.add(clone);
+               }
+           }
+           return dolly;
+       }
+       
+       public ModuleConfigurationBean getModuleConfigBean(String moduleName) {
+           if(moduleName == null) throw new IllegalArgumentException("module name cannot be null");
+           
+           for (ModuleConfigurationBean c : moduleList) {
+               if(moduleName.equalsIgnoreCase(c.name))
+                   return c;
+           }
+           
+           return null;
+       }
+
+       public void accept(ConfigurationBeanVisitor v) {
+           v.visitModulesExtentionsType(this);
+       }
+
+       public List<ModuleConfigurationBean> getModuleConfigs() {
+           return moduleList;
+       }
+
+       @Override
+       public boolean equals(Object o) {
+           if (this == o)
+               return true;
+           if (!(o instanceof ModulesExtensionType))
+               return false;
+           ModulesExtensionType that = (ModulesExtensionType) o;
+           if (moduleList != null ? !moduleList.equals(that.moduleList) : that.moduleList != null)
+               return false;
+           return true;
+       }
+
+       @Override
+       public int hashCode() {
+           return moduleList != null ? moduleList.hashCode() : 0;
+       }
+   }
+
+   @XmlAccessorType(XmlAccessType.FIELD)
+   @XmlType(name = ELEMENT_MODULE_NAME)
+   public static class ModuleConfigurationBean extends AbstractNamedCacheConfigurationBean {
+       
+
+       /** The serialVersionUID */
+       private static final long serialVersionUID = -3590043692128929343L;
+
+       @XmlAttribute(name = MODULE_IDENTIFIER)
+       private String name;
+
+       @XmlAttribute
+       private String configClassName;
+
+       @XmlTransient
+       private AbstractConfigurationBean configBean;
+
+       @XmlAnyElement
+       private Element child;
+       
+       public String getName() {
+           return name;
+       }
+
+       @Override
+       public ModuleConfigurationBean clone() throws CloneNotSupportedException {
+           ModuleConfigurationBean dolly = (ModuleConfigurationBean) super.clone();
+           return dolly;
+       }
+
+       public Class<AbstractConfigurationBean> resolveConfigurationClass(String className)
+                       throws ClassNotFoundException {
+           if(className!= null) {
+               return Util.loadClass(className);
+           }
+           if(configClassName != null) {
+               return Util.loadClass(configClassName);
+           } 
+           throw new ClassNotFoundException("Class for module configuration bean is not specified");
+       }
+
+       void setConfigurationBean(AbstractConfigurationBean configBean) {
+           this.configBean = configBean;
+       }
+
+       public AbstractConfigurationBean getConfigurationBean() {
+           return configBean;
+       }
+   }
+
    /**
     * Cache replication mode.
     */

Modified: trunk/core/src/main/java/org/infinispan/config/ConfigurationBeanVisitor.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/config/ConfigurationBeanVisitor.java	2009-11-04 22:30:20 UTC (rev 1103)
+++ trunk/core/src/main/java/org/infinispan/config/ConfigurationBeanVisitor.java	2009-11-05 16:08:33 UTC (rev 1104)
@@ -31,6 +31,7 @@
 import org.infinispan.config.Configuration.HashType;
 import org.infinispan.config.Configuration.L1Type;
 import org.infinispan.config.Configuration.LockingType;
+import org.infinispan.config.Configuration.ModulesExtensionType;
 import org.infinispan.config.Configuration.StateRetrievalType;
 import org.infinispan.config.Configuration.SyncType;
 import org.infinispan.config.Configuration.TransactionType;
@@ -97,6 +98,8 @@
    
    void visitLockingType(LockingType bean);
    
+   void visitModulesExtentionsType(ModulesExtensionType bean);
+   
    void visitStateRetrievalType(StateRetrievalType bean);
    
    void visitSyncType(SyncType bean);

Modified: trunk/core/src/main/java/org/infinispan/config/InfinispanConfiguration.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/config/InfinispanConfiguration.java	2009-11-04 22:30:20 UTC (rev 1103)
+++ trunk/core/src/main/java/org/infinispan/config/InfinispanConfiguration.java	2009-11-05 16:08:33 UTC (rev 1104)
@@ -27,6 +27,8 @@
 import org.infinispan.util.logging.Log;
 import org.infinispan.util.logging.LogFactory;
 import org.jboss.util.StringPropertyReplacer;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
 
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.Unmarshaller;
@@ -36,6 +38,8 @@
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.transform.stream.StreamSource;
 import javax.xml.validation.SchemaFactory;
 
@@ -208,20 +212,25 @@
             });
          }
          
-         StreamSource source = null;
+         InputSource source = null;
          if (skipTokenReplacement()) {
-            source = new StreamSource(config);
+            source = new InputSource(config);
          } else {
             source = replaceProperties(config);
          }
-         InfinispanConfiguration ic = (InfinispanConfiguration) u.unmarshal(source);                    
-       
+         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+         dbf.setNamespaceAware(true);
+         DocumentBuilder db = dbf.newDocumentBuilder();
+         Document document = db.parse(source);
+         InfinispanConfiguration ic = (InfinispanConfiguration) u.unmarshal(document);     
+         
          // legacy, don't ask
          GlobalConfiguration gconf = ic.parseGlobalConfiguration();
          gconf.setDefaultConfiguration(ic.parseDefaultConfiguration());
          if (cbv != null) {
             ic.accept(cbv);
          }
+         ic.accept(new ModuleConfigurationResolverVisitor(document));
          return ic;
       } catch (ConfigurationException cex) {
          throw cex;
@@ -234,7 +243,7 @@
       }
    }
 
-   private static StreamSource replaceProperties(InputStream config) throws Exception{
+   private static InputSource replaceProperties(InputStream config) throws Exception{
       BufferedReader br = new BufferedReader ( new InputStreamReader(config));
       StringBuilder w = new StringBuilder();
       String line;
@@ -250,7 +259,7 @@
             w.append(line);
          }         
       }
-      return new StreamSource(new StringReader(w.toString()));
+      return new InputSource(new StringReader(w.toString()));
    }
 
    private static boolean skipSchemaValidation() {

Added: trunk/core/src/main/java/org/infinispan/config/ModuleConfigurationResolverVisitor.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/config/ModuleConfigurationResolverVisitor.java	                        (rev 0)
+++ trunk/core/src/main/java/org/infinispan/config/ModuleConfigurationResolverVisitor.java	2009-11-05 16:08:33 UTC (rev 1104)
@@ -0,0 +1,103 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.infinispan.config;
+
+import java.io.IOException;
+import java.util.List;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Unmarshaller;
+
+import org.infinispan.config.Configuration.ModuleConfigurationBean;
+import org.infinispan.config.Configuration.ModulesExtensionType;
+import org.infinispan.util.ModuleProperties;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * ModuleConfigurationResolverVisitor resolves module's configuration class and unmarshalls it from XML.
+ * 
+ * 
+ * @author Vladimir Blagojevic
+ * @since 4.0
+ */
+public class ModuleConfigurationResolverVisitor extends AbstractConfigurationBeanVisitor {
+
+    Document root;
+
+    public ModuleConfigurationResolverVisitor(Document d) {
+        if (d == null)
+            throw new IllegalArgumentException("Cannot use null document");
+        this.root = d;
+    }
+
+    @Override
+    public void visitModulesExtentionsType(ModulesExtensionType bean) {
+        List<ModuleConfigurationBean> list = bean.getModuleConfigs();
+        for (ModuleConfigurationBean module : list) {
+            try {
+                ModuleProperties props = ModuleProperties.loadModuleProperties(module.getName());
+                if (props != null) {
+                    Class<AbstractConfigurationBean> configurationClass = module.resolveConfigurationClass(props.getConfigurationClassName());
+                    NodeList nodeList = root.getElementsByTagName(Configuration.ELEMENT_MODULE_NAME);
+                    for (int i = nodeList.getLength() - 1; i >= 0; i--) {
+                        Element node = (Element) nodeList.item(i);
+                        String name = node.getAttribute(Configuration.MODULE_IDENTIFIER);
+                        if (name.equals(module.getName())) {
+                            NodeList childNodes = node.getChildNodes();
+                            for (int j = 0; j < childNodes.getLength(); j++) {
+                                Node item = childNodes.item(j);
+                                if (item.getNodeType() == Node.ELEMENT_NODE) {
+                                    AbstractConfigurationBean configBean = loadConfigurationBeanModule((Element) item, configurationClass);
+                                    module.setConfigurationBean(configBean);
+                                }
+                            }
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                throw new ConfigurationException("Could not load configuration bean for module "
+                                + module.getName(), e);
+            }
+        }
+    }  
+    
+    private AbstractConfigurationBean loadConfigurationBeanModule(Element node,
+                    Class<AbstractConfigurationBean> configurationClass) throws IOException {
+        try {
+            JAXBContext jc = JAXBContext.newInstance(configurationClass);
+            Unmarshaller u = jc.createUnmarshaller();
+            u.setSchema(null);
+            return (AbstractConfigurationBean) u.unmarshal(node);
+        } catch (ConfigurationException cex) {
+            throw cex;
+        } catch (NullPointerException npe) {
+            throw npe;
+        } catch (Exception e) {
+            IOException ioe = new IOException(e.getLocalizedMessage());
+            ioe.initCause(e);
+            throw ioe;
+        }
+    }
+}

Added: trunk/core/src/main/java/org/infinispan/util/ModuleProperties.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/util/ModuleProperties.java	                        (rev 0)
+++ trunk/core/src/main/java/org/infinispan/util/ModuleProperties.java	2009-11-05 16:08:33 UTC (rev 1104)
@@ -0,0 +1,108 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.infinispan.util;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.Properties;
+
+import org.infinispan.config.ConfigurationException;
+import org.infinispan.util.logging.Log;
+import org.infinispan.util.logging.LogFactory;
+
+/**
+ * The <code>ModuleProperties</code> class represents Infinispan's module configuration key value
+ * pairs. Each Infinispan module is required to provide accompanying infinispan-module.properties in
+ * module's jar. An instance of this class represents in-memory representation of
+ * infinispan-module.properties file.
+ * <p>
+ * 
+ * 
+ * @author Vladimir Blagojevic
+ * @since 4.0
+ */
+public class ModuleProperties extends Properties {
+    private static final Log log = LogFactory.getLog(ModuleProperties.class);
+    public static final String MODULE_PROPERTIES_FILENAME = "infinispan-module.properties";
+    public static final String MODULE_NAME_KEY = "infinispan.module.name";
+    public static final String MODULE_CONFIGURATION_CLASS = "infinispan.module.configurationClassName";
+    public static final String MODULE_LIFECYCLE = "infinispan.module.lifecycle";
+
+    protected static Enumeration<URL> getResources(String filename) throws IOException {
+        Enumeration<URL> result;
+        ClassLoader cl = Thread.currentThread().getContextClassLoader();
+        result = cl == null ? null : cl.getResources(filename);
+        if (result == null) {
+            // check system class 
+            result = ModuleProperties.class.getClassLoader().getResources(filename);
+        }
+        return result;
+    }
+
+    public static ModuleProperties loadModuleProperties(String moduleName) throws IOException {
+        Enumeration<URL> resources = getResources(MODULE_PROPERTIES_FILENAME);
+        if (resources == null)
+            throw new IOException("Could not find any " + MODULE_PROPERTIES_FILENAME
+                            + " files on classpath");
+
+        while (resources.hasMoreElements()) {
+            URL url = resources.nextElement();
+            ModuleProperties props = new ModuleProperties();
+            props.load(url.openStream());
+            props.verify();
+
+            if (props.getName().equalsIgnoreCase(moduleName)) {
+                return props;
+            }
+        }
+        return null;
+    }
+
+    public String getName() {
+        return super.getProperty(MODULE_NAME_KEY);
+    }
+
+    public String getConfigurationClassName() {
+        return super.getProperty(MODULE_CONFIGURATION_CLASS);
+    }
+    
+    public String getLifecycleClassName() {
+        return super.getProperty(MODULE_LIFECYCLE);
+    }
+
+    protected void verify() {
+        if (getName() == null)
+            throw new ConfigurationException(
+                            "Module propertes does not specify module name. Module name should be specified using key "
+                                            + MODULE_NAME_KEY);
+        if (getConfigurationClassName() == null)
+            throw new ConfigurationException(
+                            "Module propertes does not specify module configuration class name. Module configuration class name should be specified using key "
+                                            + MODULE_CONFIGURATION_CLASS);
+        
+        if (getLifecycleClassName() == null)
+            throw new ConfigurationException(
+                            "Module propertes does not specify module lifecycle class name. Module lifecycle class name should be specified using key "
+                                            + MODULE_LIFECYCLE);
+    }
+}

Added: trunk/query/src/main/java/org/infinispan/query/config/QueryConfigurationBean.java
===================================================================
--- trunk/query/src/main/java/org/infinispan/query/config/QueryConfigurationBean.java	                        (rev 0)
+++ trunk/query/src/main/java/org/infinispan/query/config/QueryConfigurationBean.java	2009-11-05 16:08:33 UTC (rev 1104)
@@ -0,0 +1,91 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.infinispan.query.config;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.infinispan.config.AbstractConfigurationBean;
+
+ at XmlRootElement(name = "indexing")
+ at XmlAccessorType(XmlAccessType.PROPERTY)
+public class QueryConfigurationBean extends AbstractConfigurationBean {
+
+    /** The serialVersionUID */
+    private static final long serialVersionUID = 2891683014353342549L;
+
+    protected Boolean enabled;
+
+    protected Boolean indexLocalOnly;
+
+    public Boolean isEnabled() {
+        return enabled;
+    }
+
+    @XmlAttribute
+    public void setEnabled(Boolean enabled) {
+        testImmutability("enabled");
+        this.enabled = enabled;
+    }
+
+    public Boolean isIndexLocalOnly() {
+        return indexLocalOnly;
+    }
+
+    @XmlAttribute
+    public void setIndexLocalOnly(Boolean indexLocalOnly) {
+        testImmutability("indexLocalOnly");
+        this.indexLocalOnly = indexLocalOnly;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (!(o instanceof QueryConfigurationBean))
+            return false;
+
+        QueryConfigurationBean that = (QueryConfigurationBean) o;
+
+        if (enabled != null ? !enabled.equals(that.enabled) : that.enabled != null)
+            return false;
+
+        if (indexLocalOnly != null ? !indexLocalOnly.equals(that.indexLocalOnly): that.indexLocalOnly != null)
+            return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = enabled != null ? enabled.hashCode() : 0;
+        result = 31 * result + (indexLocalOnly != null ? indexLocalOnly.hashCode() : 0);
+        return result;
+    }
+
+    @Override
+    protected boolean hasComponentStarted() {
+        return false;
+    }
+}

Added: trunk/query/src/main/java/org/infinispan/query/config/package-info.java
===================================================================
--- trunk/query/src/main/java/org/infinispan/query/config/package-info.java	                        (rev 0)
+++ trunk/query/src/main/java/org/infinispan/query/config/package-info.java	2009-11-05 16:08:33 UTC (rev 1104)
@@ -0,0 +1,12 @@
+/**
+ * Cache configuration beans and parsers.
+ * Need @XmlSchema annotation in order to classify all JAXB created schema elements in appropriate XML namespace
+ */
+ at XmlSchema(namespace = "urn:infinispan:config:query:4.0", elementFormDefault = XmlNsForm.QUALIFIED, attributeFormDefault = XmlNsForm.UNQUALIFIED, 
+         xmlns = {
+         @javax.xml.bind.annotation.XmlNs(prefix = "query", namespaceURI = "urn:infinispan:config:query:4.0"),
+         @javax.xml.bind.annotation.XmlNs(prefix = "xs", namespaceURI = "http://www.w3.org/2001/XMLSchema") })
+package org.infinispan.query.config;
+
+import javax.xml.bind.annotation.XmlNsForm;
+import javax.xml.bind.annotation.*;
\ No newline at end of file

Added: trunk/query/src/main/resources/infinispan-module.properties
===================================================================
--- trunk/query/src/main/resources/infinispan-module.properties	                        (rev 0)
+++ trunk/query/src/main/resources/infinispan-module.properties	2009-11-05 16:08:33 UTC (rev 1104)
@@ -0,0 +1,3 @@
+infinispan.module.name=query
+infinispan.module.configurationClassName=org.infinispan.query.config.QueryConfigurationBean
+infinispan.module.lifecycle=undefined
\ No newline at end of file

Added: trunk/query/src/test/java/org/infinispan/query/config/QueryParsingTest.java
===================================================================
--- trunk/query/src/test/java/org/infinispan/query/config/QueryParsingTest.java	                        (rev 0)
+++ trunk/query/src/test/java/org/infinispan/query/config/QueryParsingTest.java	2009-11-05 16:08:33 UTC (rev 1104)
@@ -0,0 +1,53 @@
+package org.infinispan.query.config;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
+import org.infinispan.config.Configuration;
+import org.infinispan.config.GlobalConfiguration;
+import org.infinispan.config.InfinispanConfiguration;
+import org.infinispan.config.Configuration.ModuleConfigurationBean;
+import org.infinispan.remoting.transport.jgroups.JGroupsTransport;
+import org.infinispan.test.AbstractInfinispanTest;
+import org.testng.annotations.Test;
+
+ at Test(groups = "unit", testName = "config.parsing.QueryParsingTest")
+public class QueryParsingTest extends AbstractInfinispanTest {
+
+
+   public void testQueryConfig() throws Exception {
+      String config = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+            "\n" +
+            "<infinispan xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"urn:infinispan:config:4.0\" xmlns:query=\"urn:infinispan:config:query:4.0\">\n" +
+            "   <global>\n" +
+            "      <transport clusterName=\"demoCluster\"/>\n" +
+            "   </global>\n" +
+            "\n" +
+            "   <default>\n" +
+            "      <clustering mode=\"replication\">\n" +
+            "      </clustering>\n" +
+            "   <modules>\n" +
+            "     <module name=\"query\" configClassName=\"org.infinispan.query.config.QueryConfigurationBean\">\n"+
+            "           <query:indexing enabled=\"true\" indexLocalOnly=\"true\"/>\n" +
+            "     </module>\n" +
+            "   </modules>\n" +
+            "   </default>\n" +
+            "</infinispan>";
+      
+      System.out.println(config);
+
+      InputStream is = new ByteArrayInputStream(config.getBytes());
+      InputStream schema = InfinispanConfiguration.findSchemaInputStream();
+      assert schema != null;
+      InfinispanConfiguration c = InfinispanConfiguration.newInfinispanConfiguration(is,schema);
+      GlobalConfiguration gc = c.parseGlobalConfiguration();
+      assert gc.getTransportClass().equals(JGroupsTransport.class.getName());
+      assert gc.getClusterName().equals("demoCluster");
+
+      Configuration def = c.parseDefaultConfiguration();
+      ModuleConfigurationBean extensionConfig = def.getModuleConfigurationBean("query");
+      QueryConfigurationBean bean = (QueryConfigurationBean) extensionConfig.getConfigurationBean();
+      assert bean.isEnabled();
+      assert bean.isIndexLocalOnly();
+   }
+  }
\ No newline at end of file



More information about the infinispan-commits mailing list