Author: iocanel
Date: Tue Jul 26 19:53:02 2011
New Revision: 1151222

URL: http://svn.apache.org/viewvc?rev=1151222&view=rev
Log:
[KARAF-642] Merge cloud discovery module to cellar-2.2.x

Added:
    karaf/cellar/branches/cellar-2.2.x/cloud/
      - copied from r1149693, karaf/cellar/trunk/cloud/
    karaf/cellar/branches/cellar-2.2.x/cloud/pom.xml
      - copied, changed from r1149693, karaf/cellar/trunk/cloud/pom.xml
    karaf/cellar/branches/cellar-2.2.x/cloud/src/
      - copied from r1149693, karaf/cellar/trunk/cloud/src/
    karaf/cellar/branches/cellar-2.2.x/cloud/src/main/
      - copied from r1149693, karaf/cellar/trunk/cloud/src/main/
    karaf/cellar/branches/cellar-2.2.x/cloud/src/main/java/
      - copied from r1149693, karaf/cellar/trunk/cloud/src/main/java/
    karaf/cellar/branches/cellar-2.2.x/cloud/src/main/java/org/
      - copied from r1149693, karaf/cellar/trunk/cloud/src/main/java/org/
    karaf/cellar/branches/cellar-2.2.x/cloud/src/main/java/org/apache/
      - copied from r1149693, karaf/cellar/trunk/cloud/src/main/java/org/apache/
    karaf/cellar/branches/cellar-2.2.x/cloud/src/main/java/org/apache/karaf/
      - copied from r1149693, 
karaf/cellar/trunk/cloud/src/main/java/org/apache/karaf/
    
karaf/cellar/branches/cellar-2.2.x/cloud/src/main/java/org/apache/karaf/cellar/
      - copied from r1149693, 
karaf/cellar/trunk/cloud/src/main/java/org/apache/karaf/cellar/
    
karaf/cellar/branches/cellar-2.2.x/cloud/src/main/java/org/apache/karaf/cellar/cloud/
      - copied from r1149693, 
karaf/cellar/trunk/cloud/src/main/java/org/apache/karaf/cellar/cloud/
    
karaf/cellar/branches/cellar-2.2.x/cloud/src/main/java/org/apache/karaf/cellar/cloud/Activator.java
      - copied unchanged from r1149693, 
karaf/cellar/trunk/cloud/src/main/java/org/apache/karaf/cellar/cloud/Activator.java
    
karaf/cellar/branches/cellar-2.2.x/cloud/src/main/java/org/apache/karaf/cellar/cloud/BlobStoreDiscoveryService.java
      - copied unchanged from r1149693, 
karaf/cellar/trunk/cloud/src/main/java/org/apache/karaf/cellar/cloud/BlobStoreDiscoveryService.java
    
karaf/cellar/branches/cellar-2.2.x/cloud/src/main/java/org/apache/karaf/cellar/cloud/BlobStoreDiscoveryServiceFactory.java
      - copied unchanged from r1149693, 
karaf/cellar/trunk/cloud/src/main/java/org/apache/karaf/cellar/cloud/BlobStoreDiscoveryServiceFactory.java
    karaf/cellar/branches/cellar-2.2.x/cloud/src/main/resources/
      - copied from r1149693, karaf/cellar/trunk/cloud/src/main/resources/
    karaf/cellar/branches/cellar-2.2.x/cloud/src/test/
      - copied from r1149693, karaf/cellar/trunk/cloud/src/test/
    karaf/cellar/branches/cellar-2.2.x/cloud/src/test/java/
      - copied from r1149693, karaf/cellar/trunk/cloud/src/test/java/
    
karaf/cellar/branches/cellar-2.2.x/core/src/main/java/org/apache/karaf/cellar/core/discovery/
      - copied from r1149693, 
karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/discovery/
    
karaf/cellar/branches/cellar-2.2.x/core/src/main/java/org/apache/karaf/cellar/core/discovery/Discovery.java
      - copied unchanged from r1149693, 
karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/discovery/Discovery.java
    
karaf/cellar/branches/cellar-2.2.x/core/src/main/java/org/apache/karaf/cellar/core/discovery/DiscoveryService.java
      - copied unchanged from r1149693, 
karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/discovery/DiscoveryService.java
    
karaf/cellar/branches/cellar-2.2.x/core/src/main/java/org/apache/karaf/cellar/core/discovery/DiscoveryTask.java
      - copied unchanged from r1149693, 
karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/discovery/DiscoveryTask.java
    karaf/cellar/branches/cellar-2.2.x/core/src/test/
      - copied from r1149693, karaf/cellar/trunk/core/src/test/
    
karaf/cellar/branches/cellar-2.2.x/manual/src/main/webapp/user-guide/cloud.conf
      - copied unchanged from r1150108, 
karaf/cellar/trunk/manual/src/main/webapp/user-guide/cloud.conf
Removed:
    karaf/cellar/branches/cellar-2.2.x/core/src/main/test/
Modified:
    karaf/cellar/branches/cellar-2.2.x/   (props changed)
    karaf/cellar/branches/cellar-2.2.x/assembly/src/main/resources/features.xml
    karaf/cellar/branches/cellar-2.2.x/assembly/src/main/resources/instance.cfg
    
karaf/cellar/branches/cellar-2.2.x/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml
    karaf/cellar/branches/cellar-2.2.x/hazelcast/pom.xml
    
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/CellarMembershipListener.java
    
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastClusterManager.java
    
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastGroupManager.java
    
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastNode.java
    
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactory.java
    
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/resources/META-INF/spring/beans.xml
    
karaf/cellar/branches/cellar-2.2.x/manual/src/main/webapp/user-guide/index.conf
    karaf/cellar/branches/cellar-2.2.x/pom.xml

Propchange: karaf/cellar/branches/cellar-2.2.x/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jul 26 19:53:02 2011
@@ -1 +1 @@
-/karaf/cellar/trunk:1101991,1103447,1103456,1125012,1125040,1131478,1142446
+/karaf/cellar/trunk:1101991,1103447,1103456,1125012,1125040,1131478,1142446,1149693,1150108

Modified: 
karaf/cellar/branches/cellar-2.2.x/assembly/src/main/resources/features.xml
URL: 
http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/assembly/src/main/resources/features.xml?rev=1151222&r1=1151221&r2=1151222&view=diff
==============================================================================
--- karaf/cellar/branches/cellar-2.2.x/assembly/src/main/resources/features.xml 
(original)
+++ karaf/cellar/branches/cellar-2.2.x/assembly/src/main/resources/features.xml 
Tue Jul 26 19:53:02 2011
@@ -15,6 +15,8 @@
 -->
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.0.0";>
 
+    <repository>mvn:org.jclouds.karaf/feature/1.0.0/xml/features</repository>
+
     <feature name='hazelcast' description='In memory data grid' 
version='${hazelcast.version}' resolver='(obr)'>
         <bundle>mvn:com.hazelcast/hazelcast/${hazelcast.version}</bundle>
     </feature>
@@ -27,7 +29,11 @@
 
     <feature name='cellar' description='Karaf clustering' 
version='${project.version}' resolver='(obr)'>
         <feature version='${hazelcast.version}'>hazelcast</feature>
+        <feature version="${jclouds.version}">jclouds</feature>
         <feature>spring-dm</feature>
+
+        <bundle 
dependency='true'>mvn:joda-time/joda-time/${joda-time.version}</bundle>
+
         
<bundle>mvn:org.apache.karaf.cellar/org.apache.karaf.cellar.core/${project.version}</bundle>
         
<bundle>mvn:org.apache.karaf.cellar/org.apache.karaf.cellar.config/${project.version}</bundle>
         
<bundle>mvn:org.apache.karaf.cellar/org.apache.karaf.cellar.features/${project.version}</bundle>
@@ -46,8 +52,17 @@
         </configfile>
     </feature>
 
+    <feature name='cellar-cloud' description='Karaf Cellar Cloud Feature' 
version='${project.version}' resolver='(obr)'>
+        <feature>cellar</feature>
+        <feature>jclouds</feature>
+        <!-- Adding S3 as the default Blobstore -->
+        <feature>jclouds-aws-s3</feature>
+        
<bundle>mvn:org.apache.karaf.cellar/org.apache.karaf.cellar.cloud/${project.version}</bundle>
+    </feature>
+
     <feature name='cellar-webconsole' description='Karaf Cellar Webconsole 
Plugin' version='${project.version}'
              resolver='(obr)'>
+        <feature>cellar</feature>
         <feature>webconsole</feature>
         
<bundle>mvn:org.apache.karaf.cellar/org.apache.karaf.cellar.webconsole/${project.version}</bundle>
     </feature>

Modified: 
karaf/cellar/branches/cellar-2.2.x/assembly/src/main/resources/instance.cfg
URL: 
http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/assembly/src/main/resources/instance.cfg?rev=1151222&r1=1151221&r2=1151222&view=diff
==============================================================================
--- karaf/cellar/branches/cellar-2.2.x/assembly/src/main/resources/instance.cfg 
(original)
+++ karaf/cellar/branches/cellar-2.2.x/assembly/src/main/resources/instance.cfg 
Tue Jul 26 19:53:02 2011
@@ -6,5 +6,5 @@ multicastGroup=224.2.2.3
 multicastPort=54327
 multicastTimeoutSeconds=2
 
-tcpIpEnabled=false
+tcpIpEnabled=true
 tcpIpMembers=
\ No newline at end of file

Copied: karaf/cellar/branches/cellar-2.2.x/cloud/pom.xml (from r1149693, 
karaf/cellar/trunk/cloud/pom.xml)
URL: 
http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/cloud/pom.xml?p2=karaf/cellar/branches/cellar-2.2.x/cloud/pom.xml&p1=karaf/cellar/trunk/cloud/pom.xml&r1=1149693&r2=1151222&rev=1151222&view=diff
==============================================================================
--- karaf/cellar/trunk/cloud/pom.xml (original)
+++ karaf/cellar/branches/cellar-2.2.x/cloud/pom.xml Tue Jul 26 19:53:02 2011
@@ -19,7 +19,7 @@
     <parent>
         <groupId>org.apache.karaf</groupId>
         <artifactId>cellar</artifactId>
-        <version>3.0.0-SNAPSHOT</version>
+        <version>2.2.2-SNAPSHOT</version>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>

Modified: 
karaf/cellar/branches/cellar-2.2.x/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml
URL: 
http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml?rev=1151222&r1=1151221&r2=1151222&view=diff
==============================================================================
--- 
karaf/cellar/branches/cellar-2.2.x/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml
 (original)
+++ 
karaf/cellar/branches/cellar-2.2.x/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml
 Tue Jul 26 19:53:02 2011
@@ -19,6 +19,7 @@
         <property name="bundleContext" ref="blueprintBundleContext"/>
     </bean>
 
+    <!-- Service Registrations -->
     <service ref="registry" 
interface="org.apache.karaf.cellar.core.event.EventHandlerRegistry"/>
 
 </blueprint>

Modified: karaf/cellar/branches/cellar-2.2.x/hazelcast/pom.xml
URL: 
http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/hazelcast/pom.xml?rev=1151222&r1=1151221&r2=1151222&view=diff
==============================================================================
--- karaf/cellar/branches/cellar-2.2.x/hazelcast/pom.xml (original)
+++ karaf/cellar/branches/cellar-2.2.x/hazelcast/pom.xml Tue Jul 26 19:53:02 
2011
@@ -74,5 +74,4 @@
             <artifactId>slf4j-api</artifactId>
         </dependency>
     </dependencies>
-
 </project>

Modified: 
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/CellarMembershipListener.java
URL: 
http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/CellarMembershipListener.java?rev=1151222&r1=1151221&r2=1151222&view=diff
==============================================================================
--- 
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/CellarMembershipListener.java
 (original)
+++ 
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/CellarMembershipListener.java
 Tue Jul 26 19:53:02 2011
@@ -20,6 +20,8 @@ import com.hazelcast.core.MembershipList
 import org.apache.karaf.cellar.core.Group;
 import org.apache.karaf.cellar.core.GroupManager;
 import org.apache.karaf.cellar.core.Synchronizer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.List;
 import java.util.Set;
@@ -27,10 +29,10 @@ import java.util.Set;
 /**
  * Cellar membership listener.
  */
-public class CellarMembershipListener implements MembershipListener {
+public class CellarMembershipListener extends HazelcastInstanceAware 
implements MembershipListener {
 
+    private static final transient Logger LOGGER = 
LoggerFactory.getLogger(CellarMembershipListener.class);
     private GroupManager groupManager;
-    private HazelcastInstance instance;
     private List<? extends Synchronizer> synchronizers;
 
     public CellarMembershipListener(HazelcastInstance instance) {
@@ -40,22 +42,26 @@ public class CellarMembershipListener im
 
     public void memberAdded(MembershipEvent membershipEvent) {
         Member member = membershipEvent.getMember();
-        Member local = instance.getCluster().getLocalMember();
+        try {
+            Member local = instance.getCluster().getLocalMember();
 
-        if (local.equals(member)) {
-            if (synchronizers != null && !synchronizers.isEmpty()) {
-                Set<Group> groups = groupManager.listLocalGroups();
-                if (groups != null && !groups.isEmpty()) {
-                    for (Group group : groups) {
-                        for (Synchronizer synchronizer : synchronizers) {
-                            if (synchronizer.isSyncEnabled(group)) {
-                                synchronizer.pull(group);
-                                synchronizer.push(group);
+            if (local.equals(member)) {
+                if (synchronizers != null && !synchronizers.isEmpty()) {
+                    Set<Group> groups = groupManager.listLocalGroups();
+                    if (groups != null && !groups.isEmpty()) {
+                        for (Group group : groups) {
+                            for (Synchronizer synchronizer : synchronizers) {
+                                if (synchronizer.isSyncEnabled(group)) {
+                                    synchronizer.pull(group);
+                                    synchronizer.push(group);
+                                }
                             }
                         }
                     }
                 }
             }
+        } catch (Exception e) {
+            LOGGER.warn("Error while calling memberAdded", e);
         }
     }
 

Modified: 
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastClusterManager.java
URL: 
http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastClusterManager.java?rev=1151222&r1=1151221&r2=1151222&view=diff
==============================================================================
--- 
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastClusterManager.java
 (original)
+++ 
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastClusterManager.java
 Tue Jul 26 19:53:02 2011
@@ -104,7 +104,9 @@ public class HazelcastClusterManager ext
             Member member = cluster.getLocalMember();
             HazelcastNode node = new 
HazelcastNode(member.getInetSocketAddress().getHostName(), 
member.getInetSocketAddress().getPort());
             return node;
-        } else return null;
+        } else {
+            return null;
+        }
     }
 
     /**

Modified: 
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastGroupManager.java
URL: 
http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastGroupManager.java?rev=1151222&r1=1151221&r2=1151222&view=diff
==============================================================================
--- 
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastGroupManager.java
 (original)
+++ 
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastGroupManager.java
 Tue Jul 26 19:53:02 2011
@@ -92,8 +92,9 @@ public class HazelcastGroupManager imple
 
     public Group createGroup(String groupName) {
         Group group = listGroups().get(groupName);
-        if (group == null)
+        if (group == null) {
             group = new Group(groupName);
+        }
         if (!listGroups().containsKey(groupName)) {
             copyGroupConfiguration(Configurations.DEFAULT_GROUP_NAME, 
groupName);
             listGroups().put(groupName, group);
@@ -105,8 +106,9 @@ public class HazelcastGroupManager imple
         ClassLoader originalClassLoader = 
Thread.currentThread().getContextClassLoader();
         try {
             
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
-            if (!groupName.equals(Configurations.DEFAULT_GROUP_NAME))
+            if (!groupName.equals(Configurations.DEFAULT_GROUP_NAME)) {
                 listGroups().remove(groupName);
+            }
         } finally {
             Thread.currentThread().setContextClassLoader(originalClassLoader);
         }
@@ -162,8 +164,9 @@ public class HazelcastGroupManager imple
             Collection<Group> groupCollection = groupMap.values();
             if (groupCollection != null && !groupCollection.isEmpty()) {
                 for (Group group : groupCollection) {
-                    if (group.getMembers().contains(node))
+                    if (group.getMembers().contains(node)) {
                         result.add(group);
+                    }
                 }
             }
             return result;
@@ -278,8 +281,9 @@ public class HazelcastGroupManager imple
 
     public void registerGroup(String groupName) {
         Group group = listGroups().get(groupName);
-        if (group == null)
+        if (group == null) {
             group = new Group(groupName);
+        }
         registerGroup(group);
     }
 
@@ -370,15 +374,16 @@ public class HazelcastGroupManager imple
      * @return
      */
     protected String convertSetToString(Set<String> set) {
-        String result = "";
+        StringBuffer result = new StringBuffer();
         Iterator<String> groupIterator = set.iterator();
         while (groupIterator.hasNext()) {
             String name = groupIterator.next();
-            result = result + name;
-            if (groupIterator.hasNext())
-                result = result + ",";
+            result.append(name);
+            if (groupIterator.hasNext()) {
+                result.append(",");
+            }
         }
-        return result;
+        return result.toString();
     }
 
     /**
@@ -395,7 +400,9 @@ public class HazelcastGroupManager imple
             for (String name : groupNames) {
                 result.add(name);
             }
-        } else result.add(string);
+        } else {
+            result.add(string);
+        }
         return result;
     }
 

Modified: 
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastNode.java
URL: 
http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastNode.java?rev=1151222&r1=1151221&r2=1151222&view=diff
==============================================================================
--- 
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastNode.java
 (original)
+++ 
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastNode.java
 Tue Jul 26 19:53:02 2011
@@ -60,12 +60,18 @@ public class HazelcastNode implements No
 
     @Override
     public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
 
         HazelcastNode that = (HazelcastNode) o;
 
-        if (id != null ? !id.equals(that.id) : that.id != null) return false;
+        if (id != null ? !id.equals(that.id) : that.id != null) {
+            return false;
+        }
 
         return true;
     }

Modified: 
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactory.java
URL: 
http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactory.java?rev=1151222&r1=1151221&r2=1151222&view=diff
==============================================================================
--- 
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactory.java
 (original)
+++ 
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactory.java
 Tue Jul 26 19:53:02 2011
@@ -1,29 +1,15 @@
 /*
  * Licensed 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
+ *  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
+ *        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.
- */
-
-/*
- * Licensed 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.
+ *  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.karaf.cellar.hazelcast.factory;
 
@@ -34,6 +20,7 @@ import com.hazelcast.config.TcpIpConfig;
 import com.hazelcast.config.XmlConfigBuilder;
 import com.hazelcast.core.Hazelcast;
 import com.hazelcast.core.HazelcastInstance;
+import org.apache.karaf.cellar.core.discovery.DiscoveryTask;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
 import org.slf4j.Logger;
@@ -41,9 +28,14 @@ import org.slf4j.LoggerFactory;
 import org.springframework.osgi.context.BundleContextAware;
 
 import java.util.ArrayList;
-import java.util.List;
+import java.util.Collection;
+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;
 
 /**
  * A factory for a Hazelcast Instance, which integration with OSGi Service 
Registry and Config Admin.
@@ -60,12 +52,15 @@ public class HazelcastServiceFactory imp
     private int multicastPort = MulticastConfig.DEFAULT_MULTICAST_PORT;
     private int multicastTimeoutSeconds = 
MulticastConfig.DEFAULT_MULTICAST_TIMEOUT_SECONDS;
 
-    private boolean tcpIpEnabled = false;
+    private boolean tcpIpEnabled = true;
     private String tcpIpMembers = "";
-    private List<String> tcpIpMemberList = new ArrayList<String>();
+    private Set<String> tcpIpMemberSet = new LinkedHashSet<String>();
 
     private BundleContext bundleContext;
 
+    private ScheduledExecutorService scheduler = 
Executors.newSingleThreadScheduledExecutor();
+    private DiscoveryTask discoveryTask;
+
     private Semaphore semaphore = new Semaphore(1);
 
     /**
@@ -80,6 +75,14 @@ public class HazelcastServiceFactory imp
         }
     }
 
+    public void init() {
+        scheduler.scheduleAtFixedRate(discoveryTask, 0, 10, TimeUnit.SECONDS);
+    }
+
+    public void destroy() {
+        scheduler.shutdown();
+    }
+
     /**
      * Creates or Updates HazelcastInstace.
      *
@@ -91,71 +94,71 @@ public class HazelcastServiceFactory imp
             //We need it to properly instantiate Hazelcast.
             
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
             if (properties != null) {
-            String newUsername = (String) properties.get("username");
-            if (username != null && !username.endsWith(newUsername)) {
-                this.username = newUsername;
-                updated = Boolean.TRUE;
-            }
+                String newUsername = (String) properties.get("username");
+                if (username != null && !username.endsWith(newUsername)) {
+                    this.username = newUsername;
+                    updated = Boolean.TRUE;
+                }
 
-            String newPassword = (String) properties.get("password");
-            if (password != null && !password.equals(newPassword)) {
-                this.password = newPassword;
-            }
+                String newPassword = (String) properties.get("password");
+                if (password != null && !password.equals(newPassword)) {
+                    this.password = newPassword;
+                }
 
-            Boolean newMulticastEnabled = Boolean.parseBoolean((String) 
properties.get("multicastEnabled"));
-            if (multicastEnabled != newMulticastEnabled) {
-                this.multicastEnabled = newMulticastEnabled;
-                updated = Boolean.TRUE;
-            }
+                Boolean newMulticastEnabled = Boolean.parseBoolean((String) 
properties.get("multicastEnabled"));
+                if (multicastEnabled != newMulticastEnabled) {
+                    this.multicastEnabled = newMulticastEnabled;
+                    updated = Boolean.TRUE;
+                }
 
-            String newMulticastGroup = (String) 
properties.get("multicastGroup");
-            if (multicastGroup != null && 
!multicastGroup.endsWith(newMulticastGroup)) {
-                this.multicastGroup = newMulticastGroup;
-                updated = Boolean.TRUE;
-            }
+                String newMulticastGroup = (String) 
properties.get("multicastGroup");
+                if (multicastGroup != null && 
!multicastGroup.endsWith(newMulticastGroup)) {
+                    this.multicastGroup = newMulticastGroup;
+                    updated = Boolean.TRUE;
+                }
 
-            int multicastPort = Integer.parseInt((String) 
properties.get("multicastPort"));
-            if (multicastPort != 0) {
-                this.multicastPort = multicastPort;
-                updated = Boolean.TRUE;
-            }
+                int multicastPort = Integer.parseInt((String) 
properties.get("multicastPort"));
+                if (multicastPort != 0) {
+                    this.multicastPort = multicastPort;
+                    updated = Boolean.TRUE;
+                }
 
-            int newMulticastTimeoutSeconds = Integer.parseInt((String) 
properties.get("multicastTimeoutSeconds"));
-            if (multicastTimeoutSeconds != 0 && multicastTimeoutSeconds != 
newMulticastTimeoutSeconds) {
-                this.multicastTimeoutSeconds = newMulticastTimeoutSeconds;
-                updated = Boolean.TRUE;
-            }
+                int newMulticastTimeoutSeconds = Integer.parseInt((String) 
properties.get("multicastTimeoutSeconds"));
+                if (multicastTimeoutSeconds != 0 && multicastTimeoutSeconds != 
newMulticastTimeoutSeconds) {
+                    this.multicastTimeoutSeconds = newMulticastTimeoutSeconds;
+                    updated = Boolean.TRUE;
+                }
 
-            Boolean newTcpIpEnabled = Boolean.parseBoolean((String) 
properties.get("tcpIpEnabled"));
-            if (tcpIpEnabled != newTcpIpEnabled) {
-                this.tcpIpEnabled = newTcpIpEnabled;
-                updated = Boolean.TRUE;
-            }
+                Boolean newTcpIpEnabled = Boolean.parseBoolean((String) 
properties.get("tcpIpEnabled"));
+                if (tcpIpEnabled != newTcpIpEnabled) {
+                    this.tcpIpEnabled = newTcpIpEnabled;
+                    updated = Boolean.TRUE;
+                }
 
-            String newTcpIpMembers = (String) properties.get("tcpIpMembers");
-            if (tcpIpMembers != null && 
!tcpIpMembers.endsWith(newTcpIpMembers)) {
-                updated = Boolean.TRUE;
-
-                String[] members = tcpIpMembers.split(",");
-                if (members != null && members.length > 0) {
-                    tcpIpMemberList = new ArrayList<String>();
-                    for (String member : members) {
-                        tcpIpMemberList.add(member);
+                String newTcpIpMembers = (String) 
properties.get("tcpIpMembers");
+                if (tcpIpMembers != null && 
!tcpIpMembers.endsWith(newTcpIpMembers)) {
+                    updated = Boolean.TRUE;
+
+                    String[] members = tcpIpMembers.split(",");
+                    if (members != null && members.length > 0) {
+                        tcpIpMemberSet = new LinkedHashSet<String>();
+                        for (String member : members) {
+                            tcpIpMemberSet.add(member);
+                        }
                     }
                 }
-            }
-            }
 
-            if (updated) {
-                HazelcastInstance instance = lookupInstance();
-                if (instance != null) {
-                    try {
-                        
instance.getConfig().setGroupConfig(buildGroupConfig());
-                        
instance.getConfig().getNetworkConfig().getJoin().setMulticastConfig(buildMulticastConfig());
-                        
instance.getConfig().getNetworkConfig().getJoin().setTcpIpConfig(buildTcpIpConfig());
-                        instance.getLifecycleService().restart();
-                    } catch (Exception ex) {
-                        LOGGER.error("Error while restarting Hazelcast 
instance.", ex);
+                if (updated) {
+                    HazelcastInstance instance = lookupInstance();
+                    if (instance != null) {
+                        try {
+                            
instance.getConfig().setGroupConfig(buildGroupConfig());
+                            
instance.getConfig().getNetworkConfig().getJoin().setMulticastConfig(buildMulticastConfig());
+                            
instance.getConfig().getNetworkConfig().getJoin().setTcpIpConfig(buildTcpIpConfig());
+                            instance.getLifecycleService().restart();
+                        } catch (Exception ex) {
+                            LOGGER.error("Error while restarting Hazelcast 
instance.", ex);
+                        }
                     }
                 }
             }
@@ -168,7 +171,19 @@ public class HazelcastServiceFactory imp
         }
     }
 
-    public void destroy() {
+
+    public void updateMemberList() {
+        HazelcastInstance instance = lookupInstance();
+        if (instance != null) {
+            try {
+                instance.getConfig().setGroupConfig(buildGroupConfig());
+                
instance.getConfig().getNetworkConfig().getJoin().setMulticastConfig(buildMulticastConfig());
+                
instance.getConfig().getNetworkConfig().getJoin().setTcpIpConfig(buildTcpIpConfig());
+                instance.getLifecycleService().restart();
+            } catch (Exception ex) {
+                LOGGER.error("Error while restarting Hazelcast instance.", ex);
+            }
+        }
     }
 
 
@@ -257,10 +272,65 @@ public class HazelcastServiceFactory imp
     public TcpIpConfig buildTcpIpConfig() {
         TcpIpConfig tcpIpConfig = new TcpIpConfig();
         tcpIpConfig.setEnabled(tcpIpEnabled);
-        tcpIpConfig.setMembers(tcpIpMemberList);
+        tcpIpConfig.setMembers(new ArrayList(tcpIpMemberSet));
         return tcpIpConfig;
     }
 
+    /**
+     * Converts a comma delimited String to a Set of Strings.
+     *
+     * @param text
+     * @return
+     */
+    private Set<String> createSetFromString(String text) {
+        Set<String> result = new LinkedHashSet<String>();
+        if (text != null) {
+            String[] items = text.split(",");
+            if (items != null && items.length > 0) {
+
+                for (String item : items) {
+                    result.add(item);
+                }
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Returns true if both {@link Collection}s contain exactly the same items 
(order doesn't matter).
+     *
+     * @param col1
+     * @param col2
+     * @return
+     */
+    private boolean collectionEquals(Collection col1, Collection col2) {
+        return collectionSubset(col1, col2) && collectionSubset(col2, col1);
+    }
+
+    /**
+     * Returns true if one {@link Collection} contains all items of the others
+     *
+     * @param source
+     * @param target
+     * @return
+     */
+    private boolean collectionSubset(Collection source, Collection target) {
+        if (source == null && target == null) {
+            return true;
+        } else if (source == null || target == null) {
+            return false;
+        } else if (source.isEmpty() && target.isEmpty()) {
+            return true;
+        } else {
+            for (Object item : source) {
+                if (!target.contains(item)) {
+                    return false;
+                }
+            }
+            return true;
+        }
+    }
+
 
     public String getUsername() {
         return username;
@@ -326,4 +396,11 @@ public class HazelcastServiceFactory imp
         this.bundleContext = bundleContext;
     }
 
+    public DiscoveryTask getDiscoveryTask() {
+        return discoveryTask;
+    }
+
+    public void setDiscoveryTask(DiscoveryTask discoveryTask) {
+        this.discoveryTask = discoveryTask;
+    }
 }

Modified: 
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/resources/META-INF/spring/beans.xml
URL: 
http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/resources/META-INF/spring/beans.xml?rev=1151222&r1=1151221&r2=1151222&view=diff
==============================================================================
--- 
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/resources/META-INF/spring/beans.xml
 (original)
+++ 
karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/resources/META-INF/spring/beans.xml
 Tue Jul 26 19:53:02 2011
@@ -28,11 +28,18 @@
 
 
     <bean id="instanceFactory" 
class="org.apache.karaf.cellar.hazelcast.factory.HazelcastServiceFactory"
-          destroy-method="destroy">
+          init-method="init" destroy-method="destroy">
+        <property name="discoveryTask" ref="discoveryTask"/>
         <osgix:managed-properties 
persistent-id="org.apache.karaf.cellar.instance" update-strategy="bean-managed"
                                   update-method="createOrUpdate"/>
     </bean>
 
+    <!-- Discovery Task -->
+    <bean id="discoveryTask" 
class="org.apache.karaf.cellar.core.discovery.DiscoveryTask">
+        <property name="discoveryServices" ref="discoveryServices"/>
+        <property name="configurationAdmin" ref="configurationAdmin"/>
+    </bean>
+
 
     <bean id="membershipListener" 
class="org.apache.karaf.cellar.hazelcast.CellarMembershipListener">
         <constructor-arg index="0" ref="hazelcast"/>
@@ -151,6 +158,9 @@
     <osgi:reference id="registry" 
interface="org.apache.karaf.cellar.core.event.EventHandlerRegistry"/>
     <osgi:reference id="configurationAdmin" 
interface="org.osgi.service.cm.ConfigurationAdmin"/>
 
+    <osgi:list id="discoveryServices" cardinality="0..N"
+               
interface="org.apache.karaf.cellar.core.discovery.DiscoveryService"/>
+
     <!-- Group Consumer & Producer Serices -->
     <osgi:list id="groupEventProducers" cardinality="0..N" 
interface="org.apache.karaf.cellar.core.event.EventProducer"
                filter="(type = group)"/>

Modified: 
karaf/cellar/branches/cellar-2.2.x/manual/src/main/webapp/user-guide/index.conf
URL: 
http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/manual/src/main/webapp/user-guide/index.conf?rev=1151222&r1=1151221&r2=1151222&view=diff
==============================================================================
--- 
karaf/cellar/branches/cellar-2.2.x/manual/src/main/webapp/user-guide/index.conf 
(original)
+++ 
karaf/cellar/branches/cellar-2.2.x/manual/src/main/webapp/user-guide/index.conf 
Tue Jul 26 19:53:02 2011
@@ -4,3 +4,4 @@ h1. Karaf Cellar User Guide
 * [Start Karaf Cellar|/user-guide/deploy.conf]
 * [Nodes in Karaf Cellar|/user-guide/nodes]
 * [Groups in Karaf Cellar|/user-guide/groups]
+* [Cellar Cloud Discovery|/user-guide/cloud]
\ No newline at end of file

Modified: karaf/cellar/branches/cellar-2.2.x/pom.xml
URL: 
http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/pom.xml?rev=1151222&r1=1151221&r2=1151222&view=diff
==============================================================================
--- karaf/cellar/branches/cellar-2.2.x/pom.xml (original)
+++ karaf/cellar/branches/cellar-2.2.x/pom.xml Tue Jul 26 19:53:02 2011
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
 
     <!--
 
@@ -45,6 +44,8 @@
         <servlet.api.version>2.5</servlet.api.version>
         <slf4j.version>1.6.1</slf4j.version>
         <spring.osgi.version>1.2.1</spring.osgi.version>
+        <jclouds.version>1.0.0</jclouds.version>
+        <joda-time.version>1.6.2</joda-time.version>
     </properties>
 
     <modules>
@@ -55,6 +56,7 @@
         <module>shell</module>
         <module>hazelcast</module>        
         <module>utils</module>
+        <module>cloud</module>
         <module>webconsole</module>
         <module>assembly</module>
     </modules>
@@ -134,6 +136,11 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.karaf.cellar</groupId>
+                <artifactId>org.apache.karaf.cellar.cloud</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.cellar</groupId>
                 <artifactId>org.apache.karaf.cellar.manual</artifactId>
                 <type>html</type>
                 <version>${project.version}</version>
@@ -232,6 +239,27 @@
                 <version>${spring.osgi.version}</version>
             </dependency>
 
+
+            <!-- JClouds -->
+            <dependency>
+                <groupId>org.jclouds</groupId>
+                <artifactId>jclouds-blobstore</artifactId>
+                <version>${jclouds.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.jclouds</groupId>
+                <artifactId>jclouds-allblobstore</artifactId>
+                <version>${jclouds.version}</version>
+            </dependency>
+
+            <!-- Joda Time -->
+            <dependency>
+                <groupId>joda-time</groupId>
+                <artifactId>joda-time</artifactId>
+                <version>${joda-time.version}</version>
+            </dependency>
+
             <!-- OSGi -->
             <dependency>
                 <groupId>org.osgi</groupId>
@@ -401,6 +429,7 @@
                     <instructions>
                         <Bundle-Name>${project.name}</Bundle-Name>
                         
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                        
<Bundle-Activator>${osgi.bundle.activator}</Bundle-Activator>
                         <Export-Package>${osgi.export}</Export-Package>
                         <Import-Package>${osgi.import}</Import-Package>
                         
<DynamicImport-Package>${osgi.dynamic.import}</DynamicImport-Package>


Reply via email to