[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