You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by jb...@apache.org on 2013/04/19 10:09:13 UTC

svn commit: r1469733 - /karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastGroupManager.java

Author: jbonofre
Date: Fri Apr 19 08:09:13 2013
New Revision: 1469733

URL: http://svn.apache.org/r1469733
Log:
[KARAF-2274] Fix TCCL in HazelcastGroupManager

Modified:
    karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastGroupManager.java

Modified: karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastGroupManager.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastGroupManager.java?rev=1469733&r1=1469732&r2=1469733&view=diff
==============================================================================
--- karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastGroupManager.java (original)
+++ karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastGroupManager.java Fri Apr 19 08:09:13 2013
@@ -69,7 +69,7 @@ public class HazelcastGroupManager imple
     private CombinedClassLoader combinedClassLoader;
 
     public void init() {
-        //Create a listener for group configuration.
+        // create a listener for group configuration.
         IMap groupConfiguration = instance.getMap(GROUPS_CONFIG);
         groupConfiguration.addEntryListener(this, true);
         try {
@@ -113,51 +113,69 @@ public class HazelcastGroupManager imple
     }
 
     public void destroy() {
-        // update the group
-        Node local = this.getNode();
-        Set<Group> groups = this.listGroups(local);
-        for (Group group : groups) {
-            String groupName = group.getName();
-            group.getNodes().remove(local);
-            listGroups().put(groupName, group);
-        }
-        // shutdown the group consumer/producers
-        for (Map.Entry<String, EventConsumer> consumerEntry : groupConsumer.entrySet()) {
-            EventConsumer consumer = consumerEntry.getValue();
-            consumer.stop();
+        ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(combinedClassLoader);
+            // update the group
+            Node local = this.getNode();
+            Set<Group> groups = this.listGroups(local);
+            for (Group group : groups) {
+                String groupName = group.getName();
+                group.getNodes().remove(local);
+                listGroups().put(groupName, group);
+            }
+            // shutdown the group consumer/producers
+            for (Map.Entry<String, EventConsumer> consumerEntry : groupConsumer.entrySet()) {
+                EventConsumer consumer = consumerEntry.getValue();
+                consumer.stop();
+            }
+            groupConsumer.clear();
+            groupProducers.clear();
+        } finally {
+            Thread.currentThread().setContextClassLoader(originalClassLoader);
         }
-        groupConsumer.clear();
-        groupProducers.clear();
     }
 
     @Override
     public Node getNode() {
-        Node node = null;
-        Cluster cluster = instance.getCluster();
-        if (cluster != null) {
-            Member member = cluster.getLocalMember();
-            node = new HazelcastNode(member.getInetSocketAddress().getHostName(), member.getInetSocketAddress().getPort());
+        ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(combinedClassLoader);
+            Node node = null;
+            Cluster cluster = instance.getCluster();
+            if (cluster != null) {
+                Member member = cluster.getLocalMember();
+                node = new HazelcastNode(member.getInetSocketAddress().getHostName(), member.getInetSocketAddress().getPort());
+            }
+            return node;
+        } finally {
+            Thread.currentThread().setContextClassLoader(originalClassLoader);
         }
-        return node;
     }
 
     @Override
     public Group createGroup(String groupName) {
-        Group group = listGroups().get(groupName);
-        if (group == null) {
-            group = new Group(groupName);
-        }
-        if (!listGroups().containsKey(groupName)) {
-            copyGroupConfiguration(Configurations.DEFAULT_GROUP_NAME, groupName);
-            listGroups().put(groupName, group);
-            try {
-                // store the group list to configuration admin
-                persist(listGroups());
-            } catch (Exception e) {
-                LOGGER.warn("CELLAR HAZELCAST: can't store group list", e);
+        ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(combinedClassLoader);
+            Group group = listGroups().get(groupName);
+            if (group == null) {
+                group = new Group(groupName);
+            }
+            if (!listGroups().containsKey(groupName)) {
+                copyGroupConfiguration(Configurations.DEFAULT_GROUP_NAME, groupName);
+                listGroups().put(groupName, group);
+                try {
+                    // store the group list to configuration admin
+                    persist(listGroups());
+                } catch (Exception e) {
+                    LOGGER.warn("CELLAR HAZELCAST: can't store group list", e);
+                }
             }
+            return group;
+        } finally {
+            Thread.currentThread().setContextClassLoader(originalClassLoader);
         }
-        return group;
     }
 
     @Override
@@ -210,13 +228,19 @@ public class HazelcastGroupManager imple
 
     @Override
     public boolean isLocalGroup(String groupName) {
-        Set<Group> localGroups = this.listLocalGroups();
-        for (Group localGroup : localGroups) {
-            if (localGroup.getName().equals(groupName)) {
-                return true;
+        ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(combinedClassLoader);
+            Set<Group> localGroups = this.listLocalGroups();
+            for (Group localGroup : localGroups) {
+                if (localGroup.getName().equals(groupName)) {
+                    return true;
+                }
             }
+            return false;
+        } finally {
+            Thread.currentThread().setContextClassLoader(originalClassLoader);
         }
-        return false;
     }
 
     @Override
@@ -312,151 +336,169 @@ public class HazelcastGroupManager imple
      */
     @Override
     public void registerGroup(Group group) {
-        String groupName = group.getName();
-        createGroup(groupName);
-
-        LOGGER.info("Registering group {}.", groupName);
-        Properties serviceProperties = new Properties();
-        serviceProperties.put("type", "group");
-        serviceProperties.put("name", groupName);
+        ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(combinedClassLoader);
+            String groupName = group.getName();
+            createGroup(groupName);
 
-        if (!producerRegistrations.containsKey(groupName)) {
-            EventProducer producer = groupProducers.get(groupName);
-            if (producer == null) {
-                producer = eventTransportFactory.getEventProducer(groupName, Boolean.TRUE);
-                groupProducers.put(groupName, producer);
-            }
+            LOGGER.info("Registering group {}.", groupName);
+            Properties serviceProperties = new Properties();
+            serviceProperties.put("type", "group");
+            serviceProperties.put("name", groupName);
 
-            ServiceRegistration producerRegistration = bundleContext.registerService(EventProducer.class.getCanonicalName(), producer, (Dictionary) serviceProperties);
-            producerRegistrations.put(groupName, producerRegistration);
-        }
+            if (!producerRegistrations.containsKey(groupName)) {
+                EventProducer producer = groupProducers.get(groupName);
+                if (producer == null) {
+                    producer = eventTransportFactory.getEventProducer(groupName, Boolean.TRUE);
+                    groupProducers.put(groupName, producer);
+                }
 
-        if (!consumerRegistrations.containsKey(groupName)) {
-            EventConsumer consumer = groupConsumer.get(groupName);
-            if (consumer == null) {
-                consumer = eventTransportFactory.getEventConsumer(groupName, true);
-                groupConsumer.put(groupName, consumer);
-            } else if (!consumer.isConsuming()) {
-                consumer.start();
+                ServiceRegistration producerRegistration = bundleContext.registerService(EventProducer.class.getCanonicalName(), producer, (Dictionary) serviceProperties);
+                producerRegistrations.put(groupName, producerRegistration);
             }
-            ServiceRegistration consumerRegistration = bundleContext.registerService(EventConsumer.class.getCanonicalName(), consumer, (Dictionary) serviceProperties);
-            consumerRegistrations.put(groupName, consumerRegistration);
-        }
-
-        group.getNodes().add(getNode());
-        listGroups().put(groupName, group);
 
-        //Add group to configuration
-        try {
-            Configuration configuration = configurationAdmin.getConfiguration(Configurations.NODE);
-            if (configuration != null) {
-                Dictionary<String, Object> properties = configuration.getProperties();
-                if (properties != null) {
-                    String groups = (String) properties.get(Configurations.GROUPS_KEY);
-                    if (groups == null || groups.isEmpty()) {
-                        groups = groupName;
-                    } else {
-
-                Set<String> groupNamesSet = convertStringToSet(groups);
-                groupNamesSet.add(groupName);
-                groups = convertSetToString(groupNamesSet);
+            if (!consumerRegistrations.containsKey(groupName)) {
+                EventConsumer consumer = groupConsumer.get(groupName);
+                if (consumer == null) {
+                    consumer = eventTransportFactory.getEventConsumer(groupName, true);
+                    groupConsumer.put(groupName, consumer);
+                } else if (!consumer.isConsuming()) {
+                    consumer.start();
+                }
+                ServiceRegistration consumerRegistration = bundleContext.registerService(EventConsumer.class.getCanonicalName(), consumer, (Dictionary) serviceProperties);
+                consumerRegistrations.put(groupName, consumerRegistration);
             }
 
-                    if (groups == null || groups.isEmpty()) {
-                        groups = groupName;
+            group.getNodes().add(getNode());
+            listGroups().put(groupName, group);
+
+            // add group to configuration
+            try {
+                Configuration configuration = configurationAdmin.getConfiguration(Configurations.NODE);
+                if (configuration != null) {
+                    Dictionary<String, Object> properties = configuration.getProperties();
+                    if (properties != null) {
+                        String groups = (String) properties.get(Configurations.GROUPS_KEY);
+                        if (groups == null || groups.isEmpty()) {
+                            groups = groupName;
+                        } else {
+                            Set<String> groupNamesSet = convertStringToSet(groups);
+                            groupNamesSet.add(groupName);
+                            groups = convertSetToString(groupNamesSet);
+                        }
+
+                        if (groups == null || groups.isEmpty()) {
+                            groups = groupName;
+                        }
+                        properties.put(Configurations.GROUPS_KEY, groups);
+                        configuration.update(properties);
                     }
-                    properties.put(Configurations.GROUPS_KEY, groups);
-                    configuration.update(properties);
                 }
+            } catch (IOException e) {
+                LOGGER.error("Error reading group configuration {}", group);
             }
-        } catch (IOException e) {
-            LOGGER.error("Error reading group configuration {}", group);
-        }
 
-        //Sync
-        try {
-            ServiceReference[] serviceReferences = bundleContext.getAllServiceReferences("org.apache.karaf.cellar.core.Synchronizer", null);
-            if (serviceReferences != null && serviceReferences.length > 0) {
-                for (ServiceReference ref : serviceReferences) {
-                    Synchronizer synchronizer = (Synchronizer) bundleContext.getService(ref);
-                    if (synchronizer != null && synchronizer.isSyncEnabled(group)) {
-                        synchronizer.pull(group);
-                        synchronizer.push(group);
+            // launch the synchronization on the group
+            try {
+                ServiceReference[] serviceReferences = bundleContext.getAllServiceReferences("org.apache.karaf.cellar.core.Synchronizer", null);
+                if (serviceReferences != null && serviceReferences.length > 0) {
+                    for (ServiceReference ref : serviceReferences) {
+                        Synchronizer synchronizer = (Synchronizer) bundleContext.getService(ref);
+                        if (synchronizer != null && synchronizer.isSyncEnabled(group)) {
+                            synchronizer.pull(group);
+                            synchronizer.push(group);
+                        }
+                        bundleContext.ungetService(ref);
                     }
-                    bundleContext.ungetService(ref);
                 }
+            } catch (InvalidSyntaxException e) {
+                LOGGER.error("Error looking up for Synchronizers", e);
             }
-        } catch (InvalidSyntaxException e) {
-            LOGGER.error("Error looking up for Synchronizers", e);
+        } finally {
+            Thread.currentThread().setContextClassLoader(originalClassLoader);
         }
     }
 
     @Override
     public void registerGroup(String groupName) {
-        Group group = listGroups().get(groupName);
-        if (group == null) {
-            group = new Group(groupName);
+        ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(combinedClassLoader);
+            Group group = listGroups().get(groupName);
+            if (group == null) {
+                group = new Group(groupName);
+            }
+            registerGroup(group);
+        } finally {
+            Thread.currentThread().setContextClassLoader(originalClassLoader);
         }
-        registerGroup(group);
     }
 
     @Override
     public void unRegisterGroup(String groupName) {
-        unRegisterGroup(listGroups().get(groupName));
+        ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(combinedClassLoader);
+            unRegisterGroup(listGroups().get(groupName));
+        } finally {
+            Thread.currentThread().setContextClassLoader(originalClassLoader);
+        }
     }
 
     public void unRegisterGroup(Group group) {
-        String groupName = group.getName();
-        //1. Remove local node from group.
-        group.getNodes().remove(getNode());
-        listGroups().put(groupName, group);
+        ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(combinedClassLoader);
+            String groupName = group.getName();
+            // remove local node from group.
+            group.getNodes().remove(getNode());
+            listGroups().put(groupName, group);
 
-        //2. Unregister group consumers
-        if (consumerRegistrations != null && !consumerRegistrations.isEmpty()) {
-            ServiceRegistration consumerRegistration = consumerRegistrations.get(groupName);
-            if (consumerRegistration != null) {
-                consumerRegistration.unregister();
-                consumerRegistrations.remove(groupName);
+            // unregister group consumers
+            if (consumerRegistrations != null && !consumerRegistrations.isEmpty()) {
+                ServiceRegistration consumerRegistration = consumerRegistrations.get(groupName);
+                if (consumerRegistration != null) {
+                    consumerRegistration.unregister();
+                    consumerRegistrations.remove(groupName);
+                }
             }
 
-        }
-
-        //3. Unregister group producers
-        if (producerRegistrations != null && !producerRegistrations.isEmpty()) {
-            ServiceRegistration producerRegistration = producerRegistrations.get(groupName);
-            if (producerRegistration != null) {
-                producerRegistration.unregister();
-                producerRegistrations.remove(groupName);
+            // unregister group producers
+            if (producerRegistrations != null && !producerRegistrations.isEmpty()) {
+                ServiceRegistration producerRegistration = producerRegistrations.get(groupName);
+                if (producerRegistration != null) {
+                    producerRegistration.unregister();
+                    producerRegistrations.remove(groupName);
+                }
             }
-        }
-
-        //4. Remove Consumers & Producers
-        groupProducers.remove(groupName);
-        EventConsumer consumer = groupConsumer.remove(groupName);
-        if (consumer != null) {
-            consumer.stop();
-        }
-
-
 
-        //Remove group from configuration
-        try {
-            Configuration configuration = configurationAdmin.getConfiguration(Configurations.NODE);
-            Dictionary<String, Object> properties = configuration.getProperties();
-            String groups = (String) properties.get(Configurations.GROUPS_KEY);
-            if (groups == null || groups.isEmpty()) {
-                groups = "";
-            } else if (groups.contains(groupName)) {
-
-                Set<String> groupNamesSet = convertStringToSet(groups);
-                groupNamesSet.remove(groupName);
-                groups = convertSetToString(groupNamesSet);
+            // remove Consumers & Producers
+            groupProducers.remove(groupName);
+            EventConsumer consumer = groupConsumer.remove(groupName);
+            if (consumer != null) {
+                consumer.stop();
+            }
 
+            // remove group from configuration
+            try {
+                Configuration configuration = configurationAdmin.getConfiguration(Configurations.NODE);
+                Dictionary<String, Object> properties = configuration.getProperties();
+                String groups = (String) properties.get(Configurations.GROUPS_KEY);
+                if (groups == null || groups.isEmpty()) {
+                    groups = "";
+                } else if (groups.contains(groupName)) {
+                    Set<String> groupNamesSet = convertStringToSet(groups);
+                    groupNamesSet.remove(groupName);
+                    groups = convertSetToString(groupNamesSet);
+                }
+                properties.put(Configurations.GROUPS_KEY, groups);
+                configuration.update(properties);
+            } catch (IOException e) {
+                LOGGER.error("Error reading group configuration {}", group);
             }
-            properties.put(Configurations.GROUPS_KEY, groups);
-            configuration.update(properties);
-        } catch (IOException e) {
-            LOGGER.error("Error reading group configuration {}", group);
+        } finally {
+            Thread.currentThread().setContextClassLoader(originalClassLoader);
         }
     }