[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