You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by io...@apache.org on 2011/11/20 15:21:58 UTC

svn commit: r1204173 - in /karaf/cellar/trunk/hazelcast/src: main/java/org/apache/karaf/cellar/hazelcast/factory/ main/resources/OSGI-INF/blueprint/ test/java/org/apache/karaf/cellar/hazelcast/factory/

Author: iocanel
Date: Sun Nov 20 14:21:57 2011
New Revision: 1204173

URL: http://svn.apache.org/viewvc?rev=1204173&view=rev
Log:
[KARAF-1011] Fixed a bug that prevented the cellar instance to be propely initialized after restarts.

Modified:
    karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactory.java
    karaf/cellar/trunk/hazelcast/src/main/resources/OSGI-INF/blueprint/blueprint.xml
    karaf/cellar/trunk/hazelcast/src/test/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactoryTest.java

Modified: karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactory.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactory.java?rev=1204173&r1=1204172&r2=1204173&view=diff
==============================================================================
--- karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactory.java (original)
+++ karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactory.java Sun Nov 20 14:21:57 2011
@@ -24,18 +24,22 @@ import org.apache.karaf.cellar.core.disc
 import org.apache.karaf.cellar.core.discovery.DiscoveryTask;
 import org.apache.karaf.cellar.core.utils.CombinedClassLoader;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.HashMap;
 import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -72,30 +76,25 @@ public class HazelcastServiceFactory  {
 
     private DiscoveryTask discoveryTask;
     private CombinedClassLoader combinedClassLoader;
+    private ConfigurationAdmin configurationAdmin;
 
     private BundleContext bundleContext;
 
     private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
 
-    private Semaphore semaphore = new Semaphore(1);
+    private HazelcastInstance instance;
 
-    /**
-     * Constructor
-     */
-    public HazelcastServiceFactory() {
-        try {
-            //Make sure that an the properties will be applied before an instance is created.
-            semaphore.acquire();
-        } catch (InterruptedException e) {
-            LOGGER.error("Failed to acquire initialization semaphore.", e);
-        }
-    }
 
     public void init() {
-        scheduler.scheduleAtFixedRate(discoveryTask, 0, 10, TimeUnit.SECONDS);
+        if (discoveryTask != null) {
+            scheduler.scheduleAtFixedRate(discoveryTask, 0, 10, TimeUnit.SECONDS);
+        }  else {
+            LOGGER.warn("Did not found a discovery task");
+        }
         if(combinedClassLoader != null) {
             combinedClassLoader.addBundle(bundleContext.getBundle());
         }
+        createInstance();
     }
 
     public void destroy() {
@@ -107,8 +106,7 @@ public class HazelcastServiceFactory  {
      *
      * @param properties
      */
-    public void createOrUpdate(Map properties) {
-        try {
+    public void update(Map properties) {
             Boolean updated = Boolean.FALSE;
             //We need it to properly instantiate Hazelcast.
             if(combinedClassLoader != null) {
@@ -194,17 +192,32 @@ public class HazelcastServiceFactory  {
             if (updated) {
                 updateMemberList();
             }
-        } finally {
-            //Release the semaphore so that an instance can be created.
-            // This is necessary becasue the execution order is random.
-            if (semaphore.availablePermits() == 0) {
-                semaphore.release(1);
+    }
+
+    public void createInstance() {
+        Configuration configuration = null;
+        Map configurationMap = new HashMap();
+        try {
+            configuration = configurationAdmin.getConfiguration("org.apache.karaf.cellar.instance");
+            Dictionary dictionary = configuration.getProperties();
+            if (dictionary != null && !dictionary.isEmpty()) {
+                Enumeration enumeration = dictionary.keys();
+
+                while (enumeration.hasMoreElements()) {
+                    String key = (String) enumeration.nextElement();
+                    String value = (String) dictionary.get(key);
+                    configurationMap.put(key, value);
+                }
             }
+            update(configurationMap);
+        } catch (IOException e) {
+           LOGGER.error("Could not read instnace configuration.",e);
         }
+
     }
 
     public void updateMemberList() {
-        HazelcastInstance instance = lookupInstance();
+        HazelcastInstance instance = getInstance();
         if (instance != null) {
             try {
                 instance.getConfig().setGroupConfig(buildGroupConfig());
@@ -222,16 +235,9 @@ public class HazelcastServiceFactory  {
      *
      * @return
      */
-    public HazelcastInstance lookupInstance() {
-        HazelcastInstance instance = null;
-        try {
-            if (bundleContext != null) {
-                ServiceReference reference = bundleContext.getServiceReference("com.hazelcast.core.HazelcastInstance");
-                instance = (HazelcastInstance) bundleContext.getService(reference);
-                bundleContext.ungetService(reference);
-            }
-        } catch (Exception ex) {
-            LOGGER.warn("No Hazelcast instance found in service registry.");
+    public HazelcastInstance getInstance() {
+        if (instance == null) {
+           this.instance = buildInstance();
         }
         return instance;
     }
@@ -241,15 +247,10 @@ public class HazelcastServiceFactory  {
      *
      * @return
      */
-    public HazelcastInstance buildInstance() {
+    private HazelcastInstance buildInstance() {
         if(combinedClassLoader != null) {
             Thread.currentThread().setContextClassLoader(combinedClassLoader);
         }
-        try {
-            semaphore.acquire();
-        } catch (InterruptedException e) {
-            LOGGER.error("Failed to acquire instance semaphore", e);
-        }
         return Hazelcast.newHazelcastInstance(buildConfig());
     }
 
@@ -445,4 +446,12 @@ public class HazelcastServiceFactory  {
     public void setCombinedClassLoader(CombinedClassLoader combinedClassLoader) {
         this.combinedClassLoader = combinedClassLoader;
     }
+
+    public ConfigurationAdmin getConfigurationAdmin() {
+        return configurationAdmin;
+    }
+
+    public void setConfigurationAdmin(ConfigurationAdmin configurationAdmin) {
+        this.configurationAdmin = configurationAdmin;
+    }
 }

Modified: karaf/cellar/trunk/hazelcast/src/main/resources/OSGI-INF/blueprint/blueprint.xml
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/hazelcast/src/main/resources/OSGI-INF/blueprint/blueprint.xml?rev=1204173&r1=1204172&r2=1204173&view=diff
==============================================================================
--- karaf/cellar/trunk/hazelcast/src/main/resources/OSGI-INF/blueprint/blueprint.xml (original)
+++ karaf/cellar/trunk/hazelcast/src/main/resources/OSGI-INF/blueprint/blueprint.xml Sun Nov 20 14:21:57 2011
@@ -20,7 +20,7 @@
 
     <!-- Hazelcast hazelcast -->
     <bean id="hazelcast" class="com.hazelcast.core.Hazelcast" factory-ref="instanceFactory"
-          factory-method="buildInstance" destroy-method="shutdown"/>
+          factory-method="getInstance" destroy-method="shutdown"/>
 
 
     <bean id="instanceFactory" class="org.apache.karaf.cellar.hazelcast.factory.HazelcastServiceFactory"
@@ -28,8 +28,9 @@
         <property name="discoveryTask" ref="discoveryTask"/>
         <property name="combinedClassLoader" ref="combinedClassLoader"/>
         <property name="bundleContext" ref="blueprintBundleContext"/>
+        <property name="configurationAdmin" ref="configurationAdmin"/>
         <cm:managed-properties persistent-id="org.apache.karaf.cellar.instance" update-strategy="component-managed"
-                                  update-method="createOrUpdate"/>
+                                  update-method="update"/>
     </bean>
 
     <!-- Discovery Task -->

Modified: karaf/cellar/trunk/hazelcast/src/test/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactoryTest.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/hazelcast/src/test/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactoryTest.java?rev=1204173&r1=1204172&r2=1204173&view=diff
==============================================================================
--- karaf/cellar/trunk/hazelcast/src/test/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactoryTest.java (original)
+++ karaf/cellar/trunk/hazelcast/src/test/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactoryTest.java Sun Nov 20 14:21:57 2011
@@ -40,9 +40,9 @@ public class HazelcastServiceFactoryTest
         HazelcastServiceFactory factory = new HazelcastServiceFactory();
         factory.setUsername(GroupConfig.DEFAULT_GROUP_NAME);
         factory.setPassword(GroupConfig.DEFAULT_GROUP_PASSWORD);
-        factory.createOrUpdate(null);
+        factory.update(null);
         HazelcastInstance defaultInstance = Hazelcast.newHazelcastInstance(null);
-        HazelcastInstance factoryInstance = factory.buildInstance();
+        HazelcastInstance factoryInstance = factory.getInstance();
         Assert.assertEquals(true, factoryInstance.getCluster().getMembers().size() >= 2);
     }