Author: orudyy
Date: Mon May 11 16:09:03 2015
New Revision: 1678772

URL: http://svn.apache.org/r1678772
Log:
QPID-6539: Fix ConcurrentModificationException sporadically thrown on creation 
of StandardEnvironmentFacadeFactory

Added:
    
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacadeFactoryTest.java
Modified:
    
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBUtils.java
    
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacadeFactory.java
    
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacadeFactory.java
    
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeFactory.java

Modified: 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBUtils.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBUtils.java?rev=1678772&r1=1678771&r2=1678772&view=diff
==============================================================================
--- 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBUtils.java
 (original)
+++ 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBUtils.java
 Mon May 11 16:09:03 2015
@@ -19,12 +19,18 @@
 
 package org.apache.qpid.server.store.berkeleydb;
 
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Pattern;
+
 import com.sleepycat.je.CheckpointConfig;
 import com.sleepycat.je.Cursor;
 import com.sleepycat.je.DatabaseConfig;
 import com.sleepycat.je.Environment;
 import com.sleepycat.je.EnvironmentConfig;
 import com.sleepycat.je.Transaction;
+import org.apache.qpid.server.model.ConfiguredObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -109,4 +115,19 @@ public class BDBUtils
         }
 
     }
+
+    public static Map<String, String> 
getContextSettingsWithNameMatchingRegExpPattern(ConfiguredObject<?> object, 
Pattern pattern)
+    {
+        Map<String, String> targetMap = new HashMap<>();
+        for (String name : object.getContextKeys(false))
+        {
+            if (pattern.matcher(name).matches())
+            {
+                String contextValue = 
object.getContextValue(String.class,name);
+                targetMap.put(name, contextValue);
+            }
+        }
+
+        return Collections.unmodifiableMap(targetMap);
+    }
 }

Modified: 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacadeFactory.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacadeFactory.java?rev=1678772&r1=1678771&r2=1678772&view=diff
==============================================================================
--- 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacadeFactory.java
 (original)
+++ 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacadeFactory.java
 Mon May 11 16:09:03 2015
@@ -21,11 +21,14 @@
 package org.apache.qpid.server.store.berkeleydb;
 
 import java.util.Map;
+import java.util.regex.Pattern;
 
 import org.apache.qpid.server.model.ConfiguredObject;
 
 public interface EnvironmentFacadeFactory
 {
+    Pattern NON_REP_JE_PARAM_PATTERN = Pattern.compile("^je\\.(?!rep\\.).*");
+
     EnvironmentFacade createEnvironmentFacade(final ConfiguredObject<?> 
parent);
 
 }

Modified: 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacadeFactory.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacadeFactory.java?rev=1678772&r1=1678771&r2=1678772&view=diff
==============================================================================
--- 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacadeFactory.java
 (original)
+++ 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacadeFactory.java
 Mon May 11 16:09:03 2015
@@ -20,13 +20,7 @@
  */
 package org.apache.qpid.server.store.berkeleydb;
 
-import java.util.Collections;
-import java.util.HashMap;
 import java.util.Map;
-import java.util.Set;
-
-import com.sleepycat.je.config.ConfigParam;
-import com.sleepycat.je.config.EnvironmentParams;
 
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.store.FileBasedSettings;
@@ -57,26 +51,10 @@ public class StandardEnvironmentFacadeFa
             @Override
             public Map<String, String> getParameters()
             {
-                return buildEnvironmentConfiguration(parent);
+                return 
BDBUtils.getContextSettingsWithNameMatchingRegExpPattern(parent, 
NON_REP_JE_PARAM_PATTERN);
             }
         };
 
         return new StandardEnvironmentFacade(sec);
     }
-
-    private Map<String, String> 
buildEnvironmentConfiguration(ConfiguredObject<?> parent)
-    {
-        Map<String, String> envConfigMap = new HashMap<>();
-
-        for (ConfigParam cp : EnvironmentParams.SUPPORTED_PARAMS.values())
-        {
-            final String parameterName = cp.getName();
-            Set<String> contextKeys = parent.getContextKeys(false);
-            if (!cp.isForReplication() && contextKeys.contains(parameterName))
-            {
-                envConfigMap.put(parameterName, 
parent.getContextValue(String.class, parameterName));
-            }
-        }
-        return Collections.unmodifiableMap(envConfigMap);
-    }
 }

Modified: 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeFactory.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeFactory.java?rev=1678772&r1=1678771&r2=1678772&view=diff
==============================================================================
--- 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeFactory.java
 (original)
+++ 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeFactory.java
 Mon May 11 16:09:03 2015
@@ -20,19 +20,17 @@
  */
 package org.apache.qpid.server.store.berkeleydb.replication;
 
-import java.util.Collections;
-import java.util.HashMap;
 import java.util.Map;
 import java.util.regex.Pattern;
 
 import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.store.berkeleydb.BDBUtils;
 import org.apache.qpid.server.store.berkeleydb.EnvironmentFacade;
 import org.apache.qpid.server.store.berkeleydb.EnvironmentFacadeFactory;
 import org.apache.qpid.server.store.berkeleydb.HASettings;
 
 public class ReplicatedEnvironmentFacadeFactory implements 
EnvironmentFacadeFactory
 {
-    public static final Pattern NON_REP_JE_PARAM_PATTERN = 
Pattern.compile("^je\\.(?!rep\\.).*");
     public static final Pattern REP_JE_PARAM_PATTERN = 
Pattern.compile("^je\\.rep\\..*");
 
     @Override
@@ -128,28 +126,13 @@ public class ReplicatedEnvironmentFacade
 
     private Map<String, String> 
buildEnvironmentConfigParameters(ConfiguredObject<?> parent)
     {
-        return buildConfig(parent, NON_REP_JE_PARAM_PATTERN);
+        return 
BDBUtils.getContextSettingsWithNameMatchingRegExpPattern(parent, 
NON_REP_JE_PARAM_PATTERN);
     }
 
     private Map<String, String> 
buildReplicationConfigParameters(ConfiguredObject<?> parent)
     {
 
-        return buildConfig(parent, REP_JE_PARAM_PATTERN);
-    }
-
-    private Map<String, String> buildConfig(ConfiguredObject<?> parent, 
Pattern paramName)
-    {
-        Map<String, String> targetMap = new HashMap<>();
-        for (String name : parent.getContextKeys(false))
-        {
-            if (paramName.matcher(name).matches())
-            {
-                String contextValue = 
parent.getContextValue(String.class,name);
-                targetMap.put(name, contextValue);
-            }
-        }
-
-        return Collections.unmodifiableMap(targetMap);
+        return 
BDBUtils.getContextSettingsWithNameMatchingRegExpPattern(parent, 
REP_JE_PARAM_PATTERN);
     }
 
 

Added: 
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacadeFactoryTest.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacadeFactoryTest.java?rev=1678772&view=auto
==============================================================================
--- 
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacadeFactoryTest.java
 (added)
+++ 
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacadeFactoryTest.java
 Mon May 11 16:09:03 2015
@@ -0,0 +1,112 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+
+import java.io.File;
+import java.util.HashMap;
+
+
+import com.sleepycat.je.Environment;
+import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.store.FileBasedSettings;
+import org.apache.qpid.test.utils.QpidTestCase;
+import org.apache.qpid.test.utils.TestFileUtils;
+import org.apache.qpid.util.FileUtils;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+public class StandardEnvironmentFacadeFactoryTest extends QpidTestCase
+{
+    private HashMap<String, String> _jeProperties;
+    private File _path;
+    private ConfiguredObject<?> _parent;
+
+    @Override
+    public void setUp()throws Exception
+    {
+        super.setUp();
+        _jeProperties=  new HashMap<>();
+        _jeProperties.put("je.log.memOnly", "true");
+        _jeProperties.put("je.maxMemoryPercent", "5");
+        _path = TestFileUtils.createTestDirectory(".je.test", true);
+
+        // make mock object implementing FileBasedSettings
+        _parent = mock(ConfiguredObject.class, 
withSettings().extraInterfaces(FileBasedSettings.class).defaultAnswer(new 
Answer()
+        {
+            public Object answer(InvocationOnMock invocation)
+            {
+                if (invocation.getMethod().getName().equals("getStorePath"))
+                {
+                    return _path.getAbsolutePath();
+                }
+                return null;
+            }
+        }));
+
+    }
+    @Override
+    public void tearDown()throws Exception
+    {
+        try
+        {
+            EnvHomeRegistry.getInstance().deregisterHome(_path);
+            FileUtils.delete(_path, true);
+        }
+        finally
+        {
+            super.tearDown();
+        }
+    }
+
+    public void testCreateEnvironmentFacade()
+    {
+        when(_parent.getName()).thenReturn(getTestName());
+        
when(_parent.getContextKeys(any(boolean.class))).thenReturn(_jeProperties.keySet());
+        for (String key : _jeProperties.keySet())
+        {
+            when(_parent.getContextValue(String.class, 
key)).thenReturn(_jeProperties.get(key));
+        }
+
+        StandardEnvironmentFacadeFactory factory = new 
StandardEnvironmentFacadeFactory();
+        EnvironmentFacade facade = factory.createEnvironmentFacade(_parent);
+        try
+        {
+            assertNotNull("Facade should not be null", facade);
+            Environment environment = facade.getEnvironment();
+            for (String key : _jeProperties.keySet())
+            {
+                when(_parent.getContextValue(String.class, 
key)).thenReturn(_jeProperties.get(key));
+                assertEquals("Unexpected environment setting", 
_jeProperties.get(key), environment.getConfig().getConfigParam(key));
+            }
+        }
+        finally
+        {
+            facade.getEnvironment().close();
+        }
+    }
+
+
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to