[infinispan-commits] Infinispan SVN: r802 - in trunk/core/src: main/java/org/infinispan/manager and 1 other directories.
infinispan-commits at lists.jboss.org
infinispan-commits at lists.jboss.org
Wed Sep 9 18:46:21 EDT 2009
Author: vblagojevic at jboss.com
Date: 2009-09-09 18:46:21 -0400 (Wed, 09 Sep 2009)
New Revision: 802
Added:
trunk/core/src/main/java/org/infinispan/config/AbstractConfigurationBeanVisitor.java
trunk/core/src/main/java/org/infinispan/config/ConfigurationBeanVisitor.java
trunk/core/src/main/java/org/infinispan/config/ConfigurationValidatingVisitor.java
Modified:
trunk/core/src/main/java/org/infinispan/config/AbstractConfigurationBean.java
trunk/core/src/main/java/org/infinispan/config/CacheLoaderManagerConfig.java
trunk/core/src/main/java/org/infinispan/config/Configuration.java
trunk/core/src/main/java/org/infinispan/config/GlobalConfiguration.java
trunk/core/src/main/java/org/infinispan/config/InfinispanConfiguration.java
trunk/core/src/main/java/org/infinispan/manager/DefaultCacheManager.java
trunk/core/src/test/java/org/infinispan/config/parsing/XmlFileParsingTest.java
Log:
[ISPN-145] - No transport and singleton store enabled should not be allowed
visitor pattern for InfinispanConfiguration
Modified: trunk/core/src/main/java/org/infinispan/config/AbstractConfigurationBean.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/config/AbstractConfigurationBean.java 2009-09-09 15:12:27 UTC (rev 801)
+++ trunk/core/src/main/java/org/infinispan/config/AbstractConfigurationBean.java 2009-09-09 22:46:21 UTC (rev 802)
@@ -54,59 +54,17 @@
public abstract class AbstractConfigurationBean implements CloneableConfigurationComponent {
private static final long serialVersionUID = 4879873994727821938L;
protected static final TypedProperties EMPTY_PROPERTIES = new TypedProperties();
- protected transient Log log = LogFactory.getLog(getClass());
- // private transient CacheSPI cache; // back-reference to test whether the cache is running.
- // private transient ComponentRegistry cr;
- // a workaround to get over immutability checks
+ protected transient Log log = LogFactory.getLog(getClass());
private boolean accessible;
protected List<String> overriddenConfigurationElements = new LinkedList<String>();
protected AbstractConfigurationBean() {
}
+
+ public void accept(ConfigurationBeanVisitor v){
+ v.visit(this);
+ }
-// public void passCacheToChildConfig(AbstractConfigurationBean child) {
-// if (child != null) {
-// child.setCache(cache);
-// }
-// }
-
-// protected void addChildConfig(AbstractConfigurationBean child) {
-// if (child != null) children.add(child);
-// if (child != null && children.add(child))
-// child.setCache(cache);
-// }
-
-// protected void addChildConfigs(Collection<? extends AbstractConfigurationBean> toAdd) {
-// if (toAdd != null) {
-// for (AbstractConfigurationBean child : toAdd)
-// addChildConfig(child);
-// }
-// }
-//
-// protected void removeChildConfig(AbstractConfigurationBean child) {
-// children.remove(child);
-// }
-
-// protected void removeChildConfigs(Collection<? extends AbstractConfigurationBean> toRemove) {
-// if (toRemove != null) {
-// for (AbstractConfigurationBean child : toRemove)
-// removeChildConfig(child);
-// }
-// }
-//
-// protected void replaceChildConfig(AbstractConfigurationBean oldConfig, AbstractConfigurationBean newConfig) {
-// removeChildConfig(oldConfig);
-// addChildConfig(newConfig);
-// }
-
-// protected void replaceChildConfigs(Collection<? extends AbstractConfigurationBean> oldConfigs,
-// Collection<? extends AbstractConfigurationBean> newConfigs) {
-// synchronized (children) {
-// removeChildConfigs(oldConfigs);
-// addChildConfigs(newConfigs);
-// }
-// }
-
/**
* Safely converts a String to upper case.
*
@@ -246,21 +204,6 @@
}
}
-
-// public void setCache(CacheSPI cache) {
-// this.cache = cache;
-// synchronized (children) {
-// for (AbstractConfigurationBean child : children) {
-// child.setCache(cache);
-// }
-// }
-// }
-
-// @Start
-// private void start() {
-// setCache(cr.getComponent(CacheSPI.class));
-// }
-
@Override
public CloneableConfigurationComponent clone() throws CloneNotSupportedException {
AbstractConfigurationBean c = (AbstractConfigurationBean) super.clone();
Added: trunk/core/src/main/java/org/infinispan/config/AbstractConfigurationBeanVisitor.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/config/AbstractConfigurationBeanVisitor.java (rev 0)
+++ trunk/core/src/main/java/org/infinispan/config/AbstractConfigurationBeanVisitor.java 2009-09-09 22:46:21 UTC (rev 802)
@@ -0,0 +1,94 @@
+/*
+ * 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.lang.reflect.Method;
+
+import org.infinispan.util.logging.Log;
+import org.infinispan.util.logging.LogFactory;
+
+/**
+ * AbstractConfigurationBeanVisitor is a convenience super class for ConfigurationBeanVisitor
+ * classes.
+ *
+ * <p>
+ *
+ * Subclasses of AbstractConfigurationBeanVisitor should define the most parameter type specific
+ * definitions of <code>void visit(AbstractConfigurationBean bean); </code> method. These methods
+ * are going to be invoked by traverser as it comes across these types during traversal of
+ * <code>InfinispanConfiguration</code> tree.
+ *
+ * <p>
+ *
+ * For example, method <code>public void visit(SingletonStoreConfig ssc)</code> defined in a
+ * subclass of this class is going to be invoked as the traverser comes across instance(s) of
+ * SingletonStoreConfig.
+ *
+ * @author Vladimir Blagojevic
+ * @since 4.0
+ */
+public abstract class AbstractConfigurationBeanVisitor implements ConfigurationBeanVisitor {
+
+ protected transient Log log = LogFactory.getLog(getClass());
+
+ private Method findVisitMethod(AbstractConfigurationBean bean) throws Exception {
+ Class<?> cl = bean.getClass();
+ while (!cl.equals(AbstractConfigurationBean.class)) {
+ try {
+ return this.getClass().getDeclaredMethod("visit", new Class[] { cl });
+ } catch (NoSuchMethodException ex) {
+ cl = cl.getSuperclass();
+ }
+ }
+ // Check through interfaces for matching method
+ Class<?>[] interfaces = bean.getClass().getInterfaces();
+ for (int i = 0; i < interfaces.length; i++) {
+ try {
+ return this.getClass().getDeclaredMethod("visit", new Class[] { interfaces[i] });
+ } catch (NoSuchMethodException ex) {
+ }
+ }
+ return null;
+ }
+
+ public void visit(AbstractConfigurationBean bean) {
+ Method m = null;
+ try {
+ m = findVisitMethod(bean);
+ } catch (Exception e) {
+ log.warn("Could not reflect visit method for bean " + bean, e);
+ }
+ if (m == null) {
+ defaultVisit(bean);
+ } else {
+ try {
+ m.invoke(this, new Object[] { bean });
+ } catch (Exception e) {
+ log.warn("Invocation for visitor method " + m + " on bean " + bean
+ + " has thrown exception", e);
+ }
+ }
+ }
+
+ public void defaultVisit(AbstractConfigurationBean c) {}
+
+}
Modified: trunk/core/src/main/java/org/infinispan/config/CacheLoaderManagerConfig.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/config/CacheLoaderManagerConfig.java 2009-09-09 15:12:27 UTC (rev 801)
+++ trunk/core/src/main/java/org/infinispan/config/CacheLoaderManagerConfig.java 2009-09-09 22:46:21 UTC (rev 802)
@@ -148,6 +148,14 @@
}
return false;
}
+
+ @Override
+ public void accept(ConfigurationBeanVisitor v) {
+ super.accept(v);
+ for (CacheLoaderConfig clc : cacheLoaderConfigs) {
+ ((AbstractConfigurationBean) clc).accept(v);
+ }
+ }
@Override
public int hashCode() {
Modified: trunk/core/src/main/java/org/infinispan/config/Configuration.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/config/Configuration.java 2009-09-09 15:12:27 UTC (rev 801)
+++ trunk/core/src/main/java/org/infinispan/config/Configuration.java 2009-09-09 22:46:21 UTC (rev 802)
@@ -538,6 +538,22 @@
// OVERRIDDEN METHODS
// ------------------------------------------------------------------------------------------------------------
+ @Override
+ public void accept(ConfigurationBeanVisitor v) {
+ super.accept(v);
+ clustering.accept(v);
+ customInterceptors.accept(v);
+ deadlockDetection.accept(v);
+ eviction.accept(v);
+ expiration.accept(v);
+ invocationBatching.accept(v);
+ jmxStatistics.accept(v);
+ lazyDeserialization.accept(v);
+ loaders.accept(v);
+ locking.accept(v);
+ transaction.accept(v);
+ unsafe.accept(v);
+ }
@Override
public boolean equals(Object o) {
@@ -650,7 +666,7 @@
* @configRef name="transaction",desc="Defines transactional (JTA) characteristics of the cache."
*/
@XmlAccessorType(XmlAccessType.PROPERTY)
- private static class TransactionType extends AbstractNamedCacheConfigurationBean{
+ public static class TransactionType extends AbstractNamedCacheConfigurationBean{
/** The serialVersionUID */
private static final long serialVersionUID = -3867090839830874603L;
@@ -749,7 +765,7 @@
* @configRef name="locking",desc="Defines locking characteristics of the cache."
*/
@XmlAccessorType(XmlAccessType.PROPERTY)
- private static class LockingType extends AbstractNamedCacheConfigurationBean{
+ public static class LockingType extends AbstractNamedCacheConfigurationBean{
/** The serialVersionUID */
@@ -844,7 +860,7 @@
@XmlJavaTypeAdapter(ClusteringTypeAdapter.class)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={})
- private static class ClusteringType extends AbstractNamedCacheConfigurationBean {
+ public static class ClusteringType extends AbstractNamedCacheConfigurationBean {
/** The serialVersionUID */
private static final long serialVersionUID = 4048135465543498430L;
@@ -893,6 +909,16 @@
dolly.hash = (HashType) hash.clone();
return dolly;
}
+
+ @Override
+ public void accept(ConfigurationBeanVisitor v) {
+ super.accept(v);
+ async.accept(v);
+ hash.accept(v);
+ l1.accept(v);
+ stateRetrieval.accept(v);
+ sync.accept(v);
+ }
@Override
public boolean equals(Object o) {
@@ -925,7 +951,7 @@
}
}
- private static class ClusteringTypeAdapter extends XmlAdapter<ClusteringType, ClusteringType> {
+ public static class ClusteringTypeAdapter extends XmlAdapter<ClusteringType, ClusteringType> {
@Override
public ClusteringType marshal(ClusteringType ct) throws Exception {
@@ -966,7 +992,7 @@
* Characteristics of this can be tuned here.
*/
@XmlAccessorType(XmlAccessType.PROPERTY)
- private static class AsyncType extends AbstractNamedCacheConfigurationBean {
+ public static class AsyncType extends AbstractNamedCacheConfigurationBean {
@XmlTransient
private boolean readFromXml = false;
@@ -1056,7 +1082,7 @@
* @configRef name="expiration",desc="Enables or disables expiration, and configures characteristics accordingly."
*/
@XmlAccessorType(XmlAccessType.PROPERTY)
- private static class ExpirationType extends AbstractNamedCacheConfigurationBean{
+ public static class ExpirationType extends AbstractNamedCacheConfigurationBean{
/** The serialVersionUID */
private static final long serialVersionUID = 5757161438110848530L;
@@ -1105,7 +1131,7 @@
* @configRef name="eviction",desc="Enables or disables eviction, and configures characteristics accordingly."
*/
@XmlAccessorType(XmlAccessType.PROPERTY)
- private static class EvictionType extends AbstractNamedCacheConfigurationBean {
+ public static class EvictionType extends AbstractNamedCacheConfigurationBean {
/** The serialVersionUID */
private static final long serialVersionUID = -1248563712058858791L;
@@ -1167,7 +1193,7 @@
*
*/
@XmlAccessorType(XmlAccessType.PROPERTY)
- private static class StateRetrievalType extends AbstractNamedCacheConfigurationBean {
+ public static class StateRetrievalType extends AbstractNamedCacheConfigurationBean {
/** The serialVersionUID */
private static final long serialVersionUID = 3709234918426217096L;
@@ -1221,7 +1247,7 @@
*
*/
@XmlAccessorType(XmlAccessType.PROPERTY)
- private static class SyncType extends AbstractNamedCacheConfigurationBean {
+ public static class SyncType extends AbstractNamedCacheConfigurationBean {
/** The serialVersionUID */
private static final long serialVersionUID = 8419216253674289524L;
@@ -1260,7 +1286,7 @@
* Only used with the 'distributed' cache mode, and otherwise ignored."
*/
@XmlAccessorType(XmlAccessType.PROPERTY)
- private static class HashType extends AbstractNamedCacheConfigurationBean {
+ public static class HashType extends AbstractNamedCacheConfigurationBean {
/** The serialVersionUID */
private static final long serialVersionUID = 752218766840948822L;
@@ -1338,7 +1364,7 @@
* Only used with the 'distributed' cache mode, and otherwise ignored."
*/
@XmlAccessorType(XmlAccessType.PROPERTY)
- private static class L1Type extends AbstractNamedCacheConfigurationBean {
+ public static class L1Type extends AbstractNamedCacheConfigurationBean {
/** The serialVersionUID */
private static final long serialVersionUID = -4703587764861110638L;
@@ -1401,7 +1427,7 @@
* @configElementDoc any documentation here
*/
@XmlAccessorType(XmlAccessType.PROPERTY)
- private static class BooleanAttributeType extends AbstractNamedCacheConfigurationBean {
+ public static class BooleanAttributeType extends AbstractNamedCacheConfigurationBean {
/** The serialVersionUID */
private static final long serialVersionUID = 2296863404153834686L;
@@ -1438,7 +1464,7 @@
* @configRef name="deadlockDetection",desc="Enables or disables, and tunes, deadlock detection."
*/
@XmlAccessorType(XmlAccessType.PROPERTY)
- private static class DeadlockDetectionType extends AbstractNamedCacheConfigurationBean{
+ public static class DeadlockDetectionType extends AbstractNamedCacheConfigurationBean{
/** The serialVersionUID */
private static final long serialVersionUID = -7178286048602531152L;
@@ -1492,7 +1518,7 @@
* See details at http://www.jboss.org/community/wiki/infinispantechnicalfaqs"
*/
@XmlAccessorType(XmlAccessType.PROPERTY)
- private static class UnsafeType extends AbstractNamedCacheConfigurationBean{
+ public static class UnsafeType extends AbstractNamedCacheConfigurationBean{
/** The serialVersionUID */
private static final long serialVersionUID = -9200921443651234163L;
@@ -1530,7 +1556,7 @@
* @configRef name="customInterceptors",desc="Configures custom interceptors to be added to the cache."
*/
@XmlAccessorType(XmlAccessType.FIELD)
- private static class CustomInterceptorsType extends AbstractNamedCacheConfigurationBean {
+ public static class CustomInterceptorsType extends AbstractNamedCacheConfigurationBean {
/** The serialVersionUID */
private static final long serialVersionUID = 7187545782011884661L;
@@ -1550,6 +1576,14 @@
}
return dolly;
}
+
+ @Override
+ public void accept(ConfigurationBeanVisitor v) {
+ super.accept(v);
+ for (CustomInterceptorConfig cic : customInterceptors) {
+ cic.accept(v);
+ }
+ }
@Override
public boolean equals(Object o) {
Added: trunk/core/src/main/java/org/infinispan/config/ConfigurationBeanVisitor.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/config/ConfigurationBeanVisitor.java (rev 0)
+++ trunk/core/src/main/java/org/infinispan/config/ConfigurationBeanVisitor.java 2009-09-09 22:46:21 UTC (rev 802)
@@ -0,0 +1,50 @@
+/*
+ * 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;
+
+/**
+ * ConfigurationBeanVisitor implementations are passed through InfinispanConfiguration object tree
+ * visiting each configuration element of InfinispanConfiguration instance.
+ * <p>
+ *
+ * AbstractConfigurationBeanVisitor is a convenience super class for all implementations of
+ * ConfigurationBeanVisitor. Most of the time, custom visitors should extend
+ * AbstractConfigurationBeanVisitor rather than implement ConfigurationBeanVisitor
+ *
+ *
+ *
+ * @author Vladimir Blagojevic
+ * @see AbstractConfigurationBeanVisitor
+ * @since 4.0
+ */
+public interface ConfigurationBeanVisitor {
+
+ void visit(AbstractConfigurationBean bean);
+
+ /**
+ * Signals end of traversal over InfinispanConfiguration instance
+ *
+ * @param infinispanConfiguration
+ */
+ void traversalCompleted(InfinispanConfiguration infinispanConfiguration);
+
+}
Added: trunk/core/src/main/java/org/infinispan/config/ConfigurationValidatingVisitor.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/config/ConfigurationValidatingVisitor.java (rev 0)
+++ trunk/core/src/main/java/org/infinispan/config/ConfigurationValidatingVisitor.java 2009-09-09 22:46:21 UTC (rev 802)
@@ -0,0 +1,52 @@
+/*
+ * 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 org.infinispan.config.GlobalConfiguration.TransportType;
+import org.infinispan.loaders.decorators.SingletonStoreConfig;
+
+/**
+ * ConfigurationValidatingVisitor checks semantic validity of InfinispanConfiguration instance.
+ *
+ *
+ * @author Vladimir Blagojevic
+ * @since 4.0
+ */
+public class ConfigurationValidatingVisitor extends AbstractConfigurationBeanVisitor {
+ private SingletonStoreConfig ssc = null;
+ private TransportType tt = null;
+
+ public void visit(SingletonStoreConfig ssc) {
+ this.ssc = ssc;
+ }
+
+ public void visit(TransportType tt) {
+ this.tt = tt;
+ }
+
+ public void traversalCompleted(InfinispanConfiguration infinispanConfiguration) {
+ if (ssc != null && tt == null) {
+ throw new ConfigurationException("Singleton store configured without transport being configured for "
+ + infinispanConfiguration);
+ }
+ }
+}
Modified: trunk/core/src/main/java/org/infinispan/config/GlobalConfiguration.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/config/GlobalConfiguration.java 2009-09-09 15:12:27 UTC (rev 801)
+++ trunk/core/src/main/java/org/infinispan/config/GlobalConfiguration.java 2009-09-09 22:46:21 UTC (rev 802)
@@ -329,8 +329,21 @@
public void setDistributedSyncTimeout(long distributedSyncTimeout) {
transport.distributedSyncTimeout = distributedSyncTimeout;
}
+
+ @Override
+ public void accept(ConfigurationBeanVisitor v) {
+ super.accept(v);
+ asyncListenerExecutor.accept(v);
+ asyncTransportExecutor.accept(v);
+ evictionScheduledExecutor.accept(v);
+ globalJmxStatistics.accept(v);
+ replicationQueueScheduledExecutor.accept(v);
+ serialization.accept(v);
+ shutdown.accept(v);
+ transport.accept(v);
+ }
- @Override
+ at Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
@@ -435,7 +448,7 @@
* @configRef name="replicationQueueScheduledExecutor",desc="Executor for replication."
*/
@XmlAccessorType(XmlAccessType.PROPERTY)
- private static class FactoryClassWithPropertiesType extends AbstractConfigurationBeanWithGCR {
+ public static class FactoryClassWithPropertiesType extends AbstractConfigurationBeanWithGCR {
/** @configRef desc="Executor fully qualified class name" */
@XmlAttribute
@@ -481,7 +494,7 @@
* @configRef name="transport",desc="Determines Infinispan transport type and accompanying properties."
*/
@XmlAccessorType(XmlAccessType.PROPERTY)
- private static class TransportType extends AbstractConfigurationBeanWithGCR {
+ public static class TransportType extends AbstractConfigurationBeanWithGCR {
/** @configRef desc="Cluster name where all cache instances defined are connected" */
protected String clusterName = "Infinispan-Cluster";
@@ -542,7 +555,7 @@
* @configRef name="serialization",desc="Serialization and marshalling settings."
*/
@XmlAccessorType(XmlAccessType.PROPERTY)
- private static class SerializationType extends AbstractConfigurationBeanWithGCR {
+ public static class SerializationType extends AbstractConfigurationBeanWithGCR {
/** @configRef desc="Fully qualified name of a class that marshalls objects between cache nodes"*/
protected String marshallerClass = VersionAwareMarshaller.class.getName(); // the default
@@ -572,7 +585,7 @@
* @configRef name="globalJmxStatistics",desc="Determines global JMX settings for all cache instances."
*/
@XmlAccessorType(XmlAccessType.PROPERTY)
- private static class GlobalJmxStatisticsType extends AbstractConfigurationBeanWithGCR {
+ public static class GlobalJmxStatisticsType extends AbstractConfigurationBeanWithGCR {
/** @configRef desc="Toggle to enable/disable exposing Infinispan objects to JMX" */
protected Boolean enabled = false;
@@ -617,7 +630,7 @@
* By default a shutdown hook is registered even if no MBean server (apart from the JDK default) is detected."
*/
@XmlAccessorType(XmlAccessType.PROPERTY)
- private static class ShutdownType extends AbstractConfigurationBeanWithGCR {
+ public static class ShutdownType extends AbstractConfigurationBeanWithGCR {
/** @configRef desc="Behavior of the JVM shutdown hook registered by the cache" */
protected ShutdownHookBehavior hookBehavior = ShutdownHookBehavior.DEFAULT;
Modified: trunk/core/src/main/java/org/infinispan/config/InfinispanConfiguration.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/config/InfinispanConfiguration.java 2009-09-09 15:12:27 UTC (rev 801)
+++ trunk/core/src/main/java/org/infinispan/config/InfinispanConfiguration.java 2009-09-09 22:46:21 UTC (rev 802)
@@ -97,11 +97,32 @@
* @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.
+ * <p/>
+ * Both configuration file and schema file are looked up in following order:
+ * <p/>
+ * <ol> <li> using current thread's context ClassLoader</li> <li> if fails, the system ClassLoader</li> <li> if
+ * fails, attempt is made to load it as a file from the disk </li> </ol>
+ *
+ * @param configFileName configuration file name
+ * @param schemaFileName schema file name
+ * @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 {
InputStream inputStream = configFileName != null ? findInputStream(configFileName) : null;
InputStream schemaIS = schemaFileName != null ? findInputStream(schemaFileName) : null;
- return newInfinispanConfiguration(inputStream, schemaIS);
+ return newInfinispanConfiguration(inputStream, schemaIS, cbv);
}
/**
@@ -139,11 +160,28 @@
*
* @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);
+ }
+
+ /**
+ * 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
+ *
+ * @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 {
try {
JAXBContext jc = JAXBContext.newInstance(InfinispanConfiguration.class);
Unmarshaller u = jc.createUnmarshaller();
@@ -152,10 +190,13 @@
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
u.setSchema(factory.newSchema(new StreamSource(schema)));
}
- InfinispanConfiguration doc = (InfinispanConfiguration) u.unmarshal(config);
- //legacy, don't ask
- doc.parseGlobalConfiguration().setDefaultConfiguration(doc.parseDefaultConfiguration());
- return doc;
+ InfinispanConfiguration ic = (InfinispanConfiguration) u.unmarshal(config);
+ // legacy, don't ask
+ ic.parseGlobalConfiguration().setDefaultConfiguration(ic.parseDefaultConfiguration());
+ if (cbv != null) {
+ ic.accept(cbv);
+ }
+ return ic;
} catch (Exception e) {
IOException ioe = new IOException(e.getLocalizedMessage());
ioe.initCause(e);
@@ -208,6 +249,15 @@
public InfinispanConfiguration() {
super();
}
+
+ public void accept(ConfigurationBeanVisitor v){
+ global.accept(v);
+ defaultConfiguration.accept(v);
+ for (Configuration c : namedCaches) {
+ c.accept(v);
+ }
+ v.traversalCompleted(this);
+ }
private static InputStream findInputStream(String fileName) throws FileNotFoundException {
if (fileName == null)
Modified: trunk/core/src/main/java/org/infinispan/manager/DefaultCacheManager.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/manager/DefaultCacheManager.java 2009-09-09 15:12:27 UTC (rev 801)
+++ trunk/core/src/main/java/org/infinispan/manager/DefaultCacheManager.java 2009-09-09 22:46:21 UTC (rev 802)
@@ -25,6 +25,7 @@
import org.infinispan.Version;
import org.infinispan.config.Configuration;
import org.infinispan.config.ConfigurationException;
+import org.infinispan.config.ConfigurationValidatingVisitor;
import org.infinispan.config.GlobalConfiguration;
import org.infinispan.config.InfinispanConfiguration;
import org.infinispan.config.parsing.XmlConfigurationParser;
@@ -207,12 +208,17 @@
*/
public DefaultCacheManager(String configurationFile, boolean start) throws IOException {
try {
- initialize(InfinispanConfiguration.newInfinispanConfiguration(configurationFile, InfinispanConfiguration.resolveSchemaPath()));
- }
- catch (RuntimeException re) {
+ InfinispanConfiguration configuration = InfinispanConfiguration.newInfinispanConfiguration(
+ configurationFile,
+ InfinispanConfiguration.resolveSchemaPath(),
+ new ConfigurationValidatingVisitor());
+
+ initialize(configuration);
+ } catch (RuntimeException re) {
throw new ConfigurationException(re);
}
- if (start) start();
+ if (start)
+ start();
}
/**
@@ -238,7 +244,10 @@
*/
public DefaultCacheManager(InputStream configurationStream, boolean start) throws IOException {
try {
- initialize(InfinispanConfiguration.newInfinispanConfiguration(configurationStream, InfinispanConfiguration.findSchemaInputStream()));
+ InfinispanConfiguration configuration = InfinispanConfiguration.newInfinispanConfiguration(configurationStream,
+ InfinispanConfiguration.findSchemaInputStream(),
+ new ConfigurationValidatingVisitor());
+ initialize(configuration);
} catch (ConfigurationException ce) {
throw ce;
} catch (RuntimeException re) {
Modified: trunk/core/src/test/java/org/infinispan/config/parsing/XmlFileParsingTest.java
===================================================================
--- trunk/core/src/test/java/org/infinispan/config/parsing/XmlFileParsingTest.java 2009-09-09 15:12:27 UTC (rev 801)
+++ trunk/core/src/test/java/org/infinispan/config/parsing/XmlFileParsingTest.java 2009-09-09 22:46:21 UTC (rev 802)
@@ -1,11 +1,17 @@
package org.infinispan.config.parsing;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+
import org.infinispan.Version;
import org.infinispan.config.CacheLoaderManagerConfig;
import org.infinispan.config.Configuration;
+import org.infinispan.config.ConfigurationValidatingVisitor;
import org.infinispan.config.GlobalConfiguration;
+import org.infinispan.config.InfinispanConfiguration;
import org.infinispan.config.GlobalConfiguration.ShutdownHookBehavior;
-import org.infinispan.config.InfinispanConfiguration;
import org.infinispan.distribution.DefaultConsistentHash;
import org.infinispan.eviction.EvictionStrategy;
import org.infinispan.loaders.file.FileCacheStoreConfig;
@@ -13,18 +19,13 @@
import org.infinispan.util.concurrent.IsolationLevel;
import org.testng.annotations.Test;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Map;
-
@Test(groups = "unit", testName = "config.parsing.XmlFileParsingTest")
public class XmlFileParsingTest {
public void testNamedCacheFileJaxb() throws Exception {
String schemaFileName = "infinispan-config-" + Version.getMajorVersion() + ".xsd";
testNamedCacheFile(InfinispanConfiguration.newInfinispanConfiguration(
- "configs/named-cache-test.xml", "schema/" + schemaFileName));
+ "configs/named-cache-test.xml", "schema/" + schemaFileName, new ConfigurationValidatingVisitor()));
}
public void testConfigurationMergingJaxb() throws Exception {
More information about the infinispan-commits
mailing list