[jbosscache-commits] JBoss Cache SVN: r5330 - in core/trunk/src/main/java/org/jboss/cache: config and 1 other directory.

jbosscache-commits at lists.jboss.org jbosscache-commits at lists.jboss.org
Thu Feb 7 15:21:24 EST 2008


Author: bstansberry at jboss.com
Date: 2008-02-07 15:21:24 -0500 (Thu, 07 Feb 2008)
New Revision: 5330

Modified:
   core/trunk/src/main/java/org/jboss/cache/RegionManager.java
   core/trunk/src/main/java/org/jboss/cache/config/EvictionConfig.java
Log:
[JBAS-1288] Avoid duplicate default region configs

Modified: core/trunk/src/main/java/org/jboss/cache/RegionManager.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/RegionManager.java	2008-02-07 20:19:51 UTC (rev 5329)
+++ core/trunk/src/main/java/org/jboss/cache/RegionManager.java	2008-02-07 20:21:24 UTC (rev 5330)
@@ -809,9 +809,45 @@
    public void setEvictionConfig(EvictionConfig evictionConfig)
    {
       this.evictionConfig = evictionConfig;
+      
+      // JBAS-1288
+      // Try to establish a default region if there isn't one already
+      boolean needDefault = true;
+      List<EvictionRegionConfig> ercs = evictionConfig.getEvictionRegionConfigs();
+      
+      // APPROACH 1: Scan for a default region, try to add if not there.
+      // This will try to add the region if it is missing but seems to break 
+      // some unit tests that configure one or more non-default regions and
+      // no default region (e.g. the eviction.minttl tests). So, doing this 
+      // seems to add a new semantic. For now comment this out and use APPROACH 2
+//      for (EvictionRegionConfig erc : ercs)
+//      {
+//         if (DEFAULT_REGION.equals(erc.getRegionFqn()))
+//         {
+//            needDefault = false;
+//            break;
+//         }
+//      }
+      // APPROACH 2: Only add a default region if there are no regions. This is
+      // contrary to the idea that there *must* be a default region, but some
+      // unit tests fail w/ APPROACH 1, so for now we go with this approach.
+      needDefault = ercs.size() == 0;
+      
+      if (needDefault)
+      {         
+         // This may throw ConfigurationException if there is no default
+         // eviction policy class
+         EvictionRegionConfig dflt = evictionConfig.createDefaultEvictionRegionConfig();
+         ercs.add(0, dflt); // put it first
+         // Need to pass this back into the evictionConfig so it knows
+         // about the new region
+         evictionConfig.setEvictionRegionConfigs(ercs);
+      }
+      
+      // create regions for the regions defined in the evictionConfig.
+      // scan to be sure the _default_ region isn't added twice
       boolean setDefault = false;
-      // create regions for the regions defined in the evictionConfig.
-      for (EvictionRegionConfig erc : evictionConfig.getEvictionRegionConfigs())
+      for (EvictionRegionConfig erc : ercs)
       {
          Fqn fqn = erc.getRegionFqn();
          if (log.isTraceEnabled()) log.trace("Creating eviction region " + fqn);

Modified: core/trunk/src/main/java/org/jboss/cache/config/EvictionConfig.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/config/EvictionConfig.java	2008-02-07 20:19:51 UTC (rev 5329)
+++ core/trunk/src/main/java/org/jboss/cache/config/EvictionConfig.java	2008-02-07 20:21:24 UTC (rev 5330)
@@ -21,12 +21,14 @@
  */
 package org.jboss.cache.config;
 
+import org.jboss.cache.Fqn;
 import org.jboss.cache.RegionManager;
 import org.jboss.cache.eviction.EvictionPolicy;
 
 import java.util.ArrayList;
-import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 public class EvictionConfig extends ConfigurationComponent
 {
@@ -80,28 +82,55 @@
       testImmutability("defaultEvictionPolicyClass");
       this.defaultEvictionPolicyClass = defaultEvictionPolicyClass;
    }
-
-   public List<EvictionRegionConfig> getEvictionRegionConfigs()
+   
+   /**
+    * Creates an EvictionRegionConfig for the 
+    * {@link RegionManager.DEFAULT_REGION "_default_"} region using the 
+    * {@link #getDefaultEvictionPolicyClass(String) default eviction policy class}. Throws a 
+    * {@link ConfigurationException} if 
+    * {@link #setDefaultEvictionPolicyClass(String) a default eviction policy class} 
+    * has not been set.
+    * 
+    * @return an EvictionRegionConfig whose FQN is {@link RegionManager.DEFAULT_REGION}
+    *         and whose EvictionPolicyConfig is the default config for the
+    *         default eviction policy class.
+    * 
+    * @throws ConfigurationException if a 
+    * {@link #setDefaultEvictionPolicyClass(String) a default eviction policy class} 
+    * has not been set or there is a problem instantiating the configuration.
+    */
+   public EvictionRegionConfig createDefaultEvictionRegionConfig()
    {
-      if (evictionRegionConfigs == null && defaultEvictionPolicyClass != null)
+      if (defaultEvictionPolicyClass != null)
       {
-         // TODO this needs to be refactored obviously ...
          try
          {
             Class<?> cpolicy = Class.forName(defaultEvictionPolicyClass);
             EvictionPolicy policy = (EvictionPolicy) cpolicy.newInstance();
             EvictionRegionConfig erc = new EvictionRegionConfig();
             EvictionPolicyConfig epc = policy.getEvictionConfigurationClass().newInstance();
-            // epc.set
             erc.setEvictionPolicyConfig(epc);
             erc.setRegionFqn(RegionManager.DEFAULT_REGION);
-            return Collections.singletonList(erc);
+            return erc;
          }
          catch (Exception e)
          {
-            throw new ConfigurationException(e);
+            log.error("Unable to create EvictionRegionConfig for default region", e);
+            throw new ConfigurationException("Unable to create EvictionRegionConfig for default region", e);
          }
       }
+      else
+      {
+         throw new ConfigurationException("Cannot create EvictionRegionConfig for default region; no defaultEvictionPolicyClass configured");
+      }
+   }
+
+   public List<EvictionRegionConfig> getEvictionRegionConfigs()
+   {
+      if (evictionRegionConfigs == null)
+      {         
+         return new ArrayList<EvictionRegionConfig>(1);
+      }
       return evictionRegionConfigs;
    }
 




More information about the jbosscache-commits mailing list