Author: jbonofre
Date: Thu Jul 28 08:14:25 2011
New Revision: 1151756

URL: http://svn.apache.org/viewvc?rev=1151756&view=rev
Log:
[KARAF-723] Add new MBeans in Karaf Cellar.

Added:
    
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarConfigMBean.java
      - copied, changed from r1151409, 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarNodeMBean.java
    
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarFeaturesMBean.java
      - copied, changed from r1151409, 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarNodeMBean.java
    
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarGroupMBean.java
      - copied, changed from r1151409, 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarNodeMBean.java
    
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/codec/JmxFeature.java
    
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/codec/JmxGroup.java
    
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/internal/CellarConfigMBeanImpl.java
    
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/internal/CellarFeaturesMBeanImpl.java
    
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/internal/CellarGroupMBeanImpl.java
Modified:
    
karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/ListCommand.java
    
karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/PropListCommand.java
    karaf/cellar/trunk/management/pom.xml
    
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarNodeMBean.java
    
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/codec/JmxNode.java
    
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/internal/CellarNodeMBeanImpl.java
    
karaf/cellar/trunk/management/src/main/resources/OSGI-INF/blueprint/blueprint.xml

Modified: 
karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/ListCommand.java
URL: 
http://svn.apache.org/viewvc/karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/ListCommand.java?rev=1151756&r1=1151755&r2=1151756&view=diff
==============================================================================
--- 
karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/ListCommand.java
 (original)
+++ 
karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/ListCommand.java
 Thu Jul 28 08:14:25 2011
@@ -49,7 +49,6 @@ public class ListCommand extends ConfigC
             } else System.err.println("No PIDs found for group:" + groupName);
         } finally {
             Thread.currentThread().setContextClassLoader(originalClassLoader);
-
         }
         return null;
     }

Modified: 
karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/PropListCommand.java
URL: 
http://svn.apache.org/viewvc/karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/PropListCommand.java?rev=1151756&r1=1151755&r2=1151756&view=diff
==============================================================================
--- 
karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/PropListCommand.java
 (original)
+++ 
karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/PropListCommand.java
 Thu Jul 28 08:14:25 2011
@@ -56,7 +56,6 @@ public class PropListCommand extends Cel
             } else System.err.print("No PIDs found for group:" + groupName);
         } finally {
             Thread.currentThread().setContextClassLoader(originalClassLoader);
-
         }
         return null;
     }

Modified: karaf/cellar/trunk/management/pom.xml
URL: 
http://svn.apache.org/viewvc/karaf/cellar/trunk/management/pom.xml?rev=1151756&r1=1151755&r2=1151756&view=diff
==============================================================================
--- karaf/cellar/trunk/management/pom.xml (original)
+++ karaf/cellar/trunk/management/pom.xml Thu Jul 28 08:14:25 2011
@@ -42,9 +42,11 @@
             javax.management,
             javax.management.loading,
             org.apache.karaf.management*;version="[2,4)",
+            org.apache.karaf.features*;version="[2,4)",
             org.apache.karaf.cellar*;version="${project.version}",
             org.apache.karaf.cellar.config*;version="${project.version}",
             org.apache.karaf.cellar.core*;version="${project.version}",
+            org.apache.karaf.cellar.features*;version="${project.version}",
             org.apache.karaf.cellar.utils*;version="${project.version}",
             *
         </osgi.import>
@@ -58,8 +60,20 @@
         <!-- Karaf Cellar dependencies -->
         <dependency>
             <groupId>org.apache.karaf.cellar</groupId>
+            <artifactId>org.apache.karaf.cellar.config</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.cellar</groupId>
             <artifactId>org.apache.karaf.cellar.core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.cellar</groupId>
+            <artifactId>org.apache.karaf.cellar.features</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.cellar</groupId>
+            <artifactId>org.apache.karaf.cellar.utils</artifactId>
+        </dependency>
     </dependencies>
 
 </project>
\ No newline at end of file

Copied: 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarConfigMBean.java
 (from r1151409, 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarNodeMBean.java)
URL: 
http://svn.apache.org/viewvc/karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarConfigMBean.java?p2=karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarConfigMBean.java&p1=karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarNodeMBean.java&r1=1151409&r2=1151756&rev=1151756&view=diff
==============================================================================
--- 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarNodeMBean.java
 (original)
+++ 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarConfigMBean.java
 Thu Jul 28 08:14:25 2011
@@ -13,22 +13,16 @@
  */
 package org.apache.karaf.cellar.management;
 
-import javax.management.openmbean.TabularData;
+import java.util.Properties;
+import java.util.Set;
 
 /**
- *  Cellar Node MBean to manipulate Cellar cluster nodes.
+ * Config interface describing the operations and attributes available on a 
Cellar configuration.
  */
-public interface CellarNodeMBean {
+public interface CellarConfigMBean {
 
-    String NODE_NAME = "Name";
-    String NODE_IS_LOCAL = "Is Local";
-
-    String[] NODE = { NODE_NAME, NODE_IS_LOCAL };
-
-    // Operations
-    int pingNode(String name) throws Exception;
-
-    // Attributes
-    TabularData getNodes() throws Exception;
+    Set<String> list(String group) throws Exception;
+    Properties listProperties(String group, String pid) throws Exception;
+    void setProperty(String group, String pid, String key, String value) 
throws Exception;
 
 }

Copied: 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarFeaturesMBean.java
 (from r1151409, 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarNodeMBean.java)
URL: 
http://svn.apache.org/viewvc/karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarFeaturesMBean.java?p2=karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarFeaturesMBean.java&p1=karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarNodeMBean.java&r1=1151409&r2=1151756&rev=1151756&view=diff
==============================================================================
--- 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarNodeMBean.java
 (original)
+++ 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarFeaturesMBean.java
 Thu Jul 28 08:14:25 2011
@@ -16,19 +16,20 @@ package org.apache.karaf.cellar.manageme
 import javax.management.openmbean.TabularData;
 
 /**
- *  Cellar Node MBean to manipulate Cellar cluster nodes.
+ * MBean interface describing the operations and attributes on a Cellar 
feature.
  */
-public interface CellarNodeMBean {
+public interface CellarFeaturesMBean {
 
-    String NODE_NAME = "Name";
-    String NODE_IS_LOCAL = "Is Local";
-
-    String[] NODE = { NODE_NAME, NODE_IS_LOCAL };
-
-    // Operations
-    int pingNode(String name) throws Exception;
-
-    // Attributes
-    TabularData getNodes() throws Exception;
+    void install(String group, String name) throws Exception;
+    void install(String group, String name, String version) throws Exception;
+    void uninstall(String group, String name) throws Exception;
+    void uninstall(String group, String name, String version) throws Exception;
+
+    TabularData listFeatures(String group) throws Exception;
+
+    String FEATURE_NAME = "Name";
+    String FEATURE_VERSION = "Version";
+    String FEATURE_INSTALLED = "Installed";
+    String[] FEATURE = { FEATURE_NAME, FEATURE_VERSION, FEATURE_INSTALLED };
 
 }

Copied: 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarGroupMBean.java
 (from r1151409, 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarNodeMBean.java)
URL: 
http://svn.apache.org/viewvc/karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarGroupMBean.java?p2=karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarGroupMBean.java&p1=karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarNodeMBean.java&r1=1151409&r2=1151756&rev=1151756&view=diff
==============================================================================
--- 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarNodeMBean.java
 (original)
+++ 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarGroupMBean.java
 Thu Jul 28 08:14:25 2011
@@ -16,19 +16,22 @@ package org.apache.karaf.cellar.manageme
 import javax.management.openmbean.TabularData;
 
 /**
- *  Cellar Node MBean to manipulate Cellar cluster nodes.
+ * Cellar Group MBean to manipule Cellar cluster group.
  */
-public interface CellarNodeMBean {
+public interface CellarGroupMBean {
 
-    String NODE_NAME = "Name";
-    String NODE_IS_LOCAL = "Is Local";
+    String GROUP_NAME = "Name";
+    String GROUP_MEMBERS = "Members";
 
-    String[] NODE = { NODE_NAME, NODE_IS_LOCAL };
+    String[] GROUP = { GROUP_NAME,GROUP_MEMBERS };
 
     // Operations
-    int pingNode(String name) throws Exception;
+    void create(String name) throws Exception;
+    void delete(String name) throws Exception;
+    void join(String name, String nodeId) throws Exception;
+    void quit(String name, String nodeId) throws Exception;
 
     // Attributes
-    TabularData getNodes() throws Exception;
+    TabularData getGroups() throws Exception;
 
 }

Modified: 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarNodeMBean.java
URL: 
http://svn.apache.org/viewvc/karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarNodeMBean.java?rev=1151756&r1=1151755&r2=1151756&view=diff
==============================================================================
--- 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarNodeMBean.java
 (original)
+++ 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/CellarNodeMBean.java
 Thu Jul 28 08:14:25 2011
@@ -20,13 +20,15 @@ import javax.management.openmbean.Tabula
  */
 public interface CellarNodeMBean {
 
-    String NODE_NAME = "Name";
+    String NODE_ID = "ID";
+    String NODE_HOST = "Host";
+    String NODE_PORT = "Port";
     String NODE_IS_LOCAL = "Is Local";
 
-    String[] NODE = { NODE_NAME, NODE_IS_LOCAL };
+    String[] NODE = { NODE_ID, NODE_HOST, NODE_PORT, NODE_IS_LOCAL };
 
     // Operations
-    int pingNode(String name) throws Exception;
+    long pingNode(String nodeId) throws Exception;
 
     // Attributes
     TabularData getNodes() throws Exception;

Added: 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/codec/JmxFeature.java
URL: 
http://svn.apache.org/viewvc/karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/codec/JmxFeature.java?rev=1151756&view=auto
==============================================================================
--- 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/codec/JmxFeature.java
 (added)
+++ 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/codec/JmxFeature.java
 Thu Jul 28 08:14:25 2011
@@ -0,0 +1,101 @@
+/*
+ * 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.
+ */
+package org.apache.karaf.cellar.management.codec;
+
+import org.apache.karaf.cellar.features.FeatureInfo;
+import org.apache.karaf.cellar.management.CellarFeaturesMBean;
+
+import javax.management.openmbean.*;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * JMX representation of a feature.
+ */
+public class JmxFeature {
+
+    static final CompositeType FEATURE;
+    static final TabularType FEATURE_TABLE;
+
+    static {
+        FEATURE = createFeatureType();
+        FEATURE_TABLE = createFeatureTableType();
+    }
+
+    private final CompositeData data;
+
+    public JmxFeature(FeatureInfo feature, boolean installed) {
+        try {
+            String[] itemNames = CellarFeaturesMBean.FEATURE;
+            Object[] itemValues = new Object[itemNames.length];
+            itemValues[0] = feature.getName();
+            itemValues[1] = feature.getVersion();
+            itemValues[2] = installed;
+            data = new CompositeDataSupport(FEATURE, itemNames, itemValues);
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Cannot form feature open data", 
e);
+        }
+    }
+
+    public CompositeData asCompositeData() {
+        return data;
+    }
+
+    public static TabularData tableFrom(Collection<JmxFeature> features) {
+        TabularDataSupport table = new TabularDataSupport(FEATURE_TABLE);
+        for (JmxFeature feature : features) {
+            table.put(feature.asCompositeData());
+        }
+        return table;
+    }
+
+    private static CompositeType createFeatureType() {
+        try {
+            String description = "Description of a Karaf features managed into 
Cellar cluster";
+            String[] itemNames = CellarFeaturesMBean.FEATURE;
+            OpenType[] itemTypes = new OpenType[itemNames.length];
+            String[] itemDescriptions = new String[itemNames.length];
+
+            itemTypes[0] = SimpleType.STRING;
+            itemDescriptions[0] = "The name of the feature";
+
+            itemTypes[1] = SimpleType.STRING;
+            itemDescriptions[1] = "The version of the feature";
+
+            itemTypes[2] = SimpleType.BOOLEAN;
+            itemDescriptions[2] = "Whether a feature is installed or not";
+
+            return new CompositeType("Feature", description, itemNames, 
itemDescriptions, itemTypes);
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Unable to build feature type", e);
+        }
+    }
+
+    private static TabularType createFeatureTableType() {
+        try {
+            return new TabularType("Features", "Table of all Karaf Cellar 
features", FEATURE, new String[]{CellarFeaturesMBean.FEATURE_NAME});
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Unable to build feature table 
type", e);
+        }
+    }
+
+    public static TabularData tableFrom(List<JmxFeature> features) {
+        TabularDataSupport table = new TabularDataSupport(FEATURE_TABLE);
+        for (JmxFeature feature : features) {
+            table.put(feature.asCompositeData());
+        }
+        return table;
+    }
+
+}

Added: 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/codec/JmxGroup.java
URL: 
http://svn.apache.org/viewvc/karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/codec/JmxGroup.java?rev=1151756&view=auto
==============================================================================
--- 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/codec/JmxGroup.java
 (added)
+++ 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/codec/JmxGroup.java
 Thu Jul 28 08:14:25 2011
@@ -0,0 +1,94 @@
+/*
+ * 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.
+ */
+package org.apache.karaf.cellar.management.codec;
+
+import org.apache.karaf.cellar.core.Group;
+import org.apache.karaf.cellar.core.Node;
+import org.apache.karaf.cellar.management.CellarGroupMBean;
+
+import javax.management.openmbean.*;
+import java.util.List;
+
+/**
+ * JMX representation of a Cellar cluster group.
+ */
+public class JmxGroup {
+
+    static final CompositeType GROUP;
+    static final TabularType GROUP_TABLE;
+
+    static {
+        GROUP = createGroupType();
+        GROUP_TABLE = createGroupTableType();
+    }
+
+    private final CompositeDataSupport data;
+
+    private CompositeData asCompositeData() {
+        return data;
+    }
+
+    public JmxGroup(Group group) {
+        try {
+            String[] itemNames = CellarGroupMBean.GROUP;
+            Object[] itemValues = new Object[itemNames.length];
+            itemValues[0] = group.getName();
+            StringBuffer buffer = new StringBuffer();
+            for (Node node : group.getMembers()) {
+                buffer.append(node.getId());
+                buffer.append(" ");
+            }
+            itemValues[1] = buffer.toString();
+            data = new CompositeDataSupport(GROUP, itemNames, itemValues);
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Cannot create group open data", 
e);
+        }
+    }
+
+    private static CompositeType createGroupType() {
+        try {
+            String desc = "This type describes Karaf Cellar groups";
+            String[] itemNames = CellarGroupMBean.GROUP;
+            OpenType[] itemTypes = new OpenType[itemNames.length];
+            String[] descriptions = new String[itemNames.length];
+
+            itemTypes[0] = SimpleType.STRING;
+            descriptions[0] = "The name of the Cellar group";
+
+            itemTypes[1] = SimpleType.STRING;
+            descriptions[1] = "The members of the Cellar group";
+
+            return new CompositeType("Group", desc, itemNames, descriptions, 
itemTypes);
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Unable to build group", e);
+        }
+    }
+
+    private static TabularType createGroupTableType() {
+        try {
+            return new TabularType("Groups", "Table of all Karaf Cellar 
groups", GROUP, new String[] { CellarGroupMBean.GROUP_NAME });
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Unable to build group table 
type", e);
+        }
+    }
+
+    public static TabularData tableFrom(List<JmxGroup> groups) {
+        TabularDataSupport table = new TabularDataSupport(GROUP_TABLE);
+        for (JmxGroup group : groups) {
+            table.put(group.asCompositeData());
+        }
+        return table;
+    }
+
+}

Modified: 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/codec/JmxNode.java
URL: 
http://svn.apache.org/viewvc/karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/codec/JmxNode.java?rev=1151756&r1=1151755&r2=1151756&view=diff
==============================================================================
--- 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/codec/JmxNode.java
 (original)
+++ 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/codec/JmxNode.java
 Thu Jul 28 08:14:25 2011
@@ -18,6 +18,7 @@ import org.apache.karaf.cellar.core.Node
 import org.apache.karaf.cellar.management.CellarNodeMBean;
 
 import javax.management.openmbean.*;
+import javax.management.openmbean.SimpleType;
 import java.util.List;
 
 /**
@@ -44,14 +45,16 @@ public class JmxNode {
             String[] itemNames = CellarNodeMBean.NODE;
             Object[] itemValues = new Object[itemNames.length];
             itemValues[0] = node.getId();
+            itemValues[1] = node.getHost();
+            itemValues[2] = node.getPort();
             if (node.getHost().equals(clusterManager.getNode())) {
-                itemValues[1] = true;
+                itemValues[3] = true;
             } else {
-                itemValues[1] = false;
+                itemValues[3] = false;
             }
             data = new CompositeDataSupport(NODE, itemNames, itemValues);
         } catch (OpenDataException e) {
-            throw new IllegalStateException("Cannot create instance open 
data", e);
+            throw new IllegalStateException("Cannot create node open data", e);
         }
     }
 
@@ -63,22 +66,28 @@ public class JmxNode {
             String[] descriptions = new String[itemNames.length];
 
             itemTypes[0] = SimpleType.STRING;
-            descriptions[0] = "The name of the Cellar node";
+            descriptions[0] = "The ID of the Cellar node";
 
-            itemTypes[1] = SimpleType.BOOLEAN;
-            descriptions[1] = "Whether the Cellar node is the local one or 
not";
+            itemTypes[1] = SimpleType.STRING;
+            descriptions[1] = "The hostname of the Cellar node";
+
+            itemTypes[2] = SimpleType.INTEGER;
+            descriptions[2] = "The port number of the Cellar node";
+
+            itemTypes[3] = SimpleType.BOOLEAN;
+            descriptions[3] = "Whether the Cellar node is the local one or 
not";
 
             return new CompositeType("Node", desc, itemNames, descriptions, 
itemTypes);
         } catch (OpenDataException e) {
-            throw new IllegalStateException("Unable to build instance type", 
e);
+            throw new IllegalStateException("Unable to build node type", e);
         }
     }
 
     private static TabularType createNodeTableType() {
         try {
-            return new TabularType("Nodes", "Table of all Karaf Cellar nodes", 
NODE, new String[] {CellarNodeMBean.NODE_NAME});
+            return new TabularType("Nodes", "Table of all Karaf Cellar nodes", 
NODE, new String[] {CellarNodeMBean.NODE_ID});
         } catch (OpenDataException e) {
-            throw new IllegalStateException("Unable to build node table tyep", 
e);
+            throw new IllegalStateException("Unable to build node table type", 
e);
         }
     }
 

Added: 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/internal/CellarConfigMBeanImpl.java
URL: 
http://svn.apache.org/viewvc/karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/internal/CellarConfigMBeanImpl.java?rev=1151756&view=auto
==============================================================================
--- 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/internal/CellarConfigMBeanImpl.java
 (added)
+++ 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/internal/CellarConfigMBeanImpl.java
 Thu Jul 28 08:14:25 2011
@@ -0,0 +1,64 @@
+/*
+ * 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.
+ */
+package org.apache.karaf.cellar.management.internal;
+
+import org.apache.karaf.cellar.config.Constants;
+import org.apache.karaf.cellar.core.ClusterManager;
+import org.apache.karaf.cellar.core.Configurations;
+import org.apache.karaf.cellar.management.CellarConfigMBean;
+
+import javax.management.NotCompliantMBeanException;
+import javax.management.StandardMBean;
+import java.util.*;
+
+/**
+ * Implementation of the Cellar Config MBean allowing to manipulate Cellar 
config admin layer.
+ */
+public class CellarConfigMBeanImpl extends StandardMBean implements 
CellarConfigMBean {
+
+    private ClusterManager clusterManager;
+
+    public ClusterManager getClusterManager() {
+        return this.clusterManager;
+    }
+
+    public void setClusterManager(ClusterManager clusterManager) {
+        this.clusterManager = clusterManager;
+    }
+
+    public CellarConfigMBeanImpl() throws NotCompliantMBeanException {
+        super(CellarConfigMBean.class);
+    }
+
+    public Set<String> list(String group) throws Exception {
+        Map<String, Properties> configurationTable = 
clusterManager.getMap(Constants.CONFIGURATION_MAP + Configurations.SEPARATOR + 
group);
+        return configurationTable.keySet();
+    }
+
+    public Properties listProperties(String group, String pid) throws 
Exception {
+        Map<String, Properties> configurationTable = 
clusterManager.getMap(Constants.CONFIGURATION_MAP + Configurations.SEPARATOR + 
group);
+        return configurationTable.get(pid);
+    }
+
+    public void setProperty(String group, String pid, String key, String 
value) throws Exception {
+        Map<String, Properties> configurationTable = 
clusterManager.getMap(Constants.CONFIGURATION_MAP + Configurations.SEPARATOR + 
group);
+        Properties properties = configurationTable.get(pid);
+        if (properties == null) {
+            properties = new Properties();
+        }
+        properties.put(key, value);
+        configurationTable.put(pid, properties);
+    }
+
+}

Added: 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/internal/CellarFeaturesMBeanImpl.java
URL: 
http://svn.apache.org/viewvc/karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/internal/CellarFeaturesMBeanImpl.java?rev=1151756&view=auto
==============================================================================
--- 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/internal/CellarFeaturesMBeanImpl.java
 (added)
+++ 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/internal/CellarFeaturesMBeanImpl.java
 Thu Jul 28 08:14:25 2011
@@ -0,0 +1,102 @@
+/*
+ * 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.
+ */
+package org.apache.karaf.cellar.management.internal;
+
+import org.apache.karaf.cellar.core.ClusterManager;
+import org.apache.karaf.cellar.core.Configurations;
+import org.apache.karaf.cellar.core.Group;
+import org.apache.karaf.cellar.core.GroupManager;
+import org.apache.karaf.cellar.core.event.EventProducer;
+import org.apache.karaf.cellar.features.Constants;
+import org.apache.karaf.cellar.features.FeatureInfo;
+import org.apache.karaf.cellar.features.RemoteFeaturesEvent;
+import org.apache.karaf.cellar.management.CellarFeaturesMBean;
+import org.apache.karaf.cellar.management.codec.JmxFeature;
+import org.apache.karaf.features.FeatureEvent;
+
+import javax.management.NotCompliantMBeanException;
+import javax.management.StandardMBean;
+import javax.management.openmbean.TabularData;
+import java.util.ArrayList;
+import java.util.Map;
+
+/**
+ * Implementation of the CellarFeaturesMBean to manipulate Cellar features.
+ */
+public class CellarFeaturesMBeanImpl extends StandardMBean implements 
CellarFeaturesMBean {
+
+    private ClusterManager clusterManager;
+    private GroupManager groupManager;
+
+    public ClusterManager getClusterManager() {
+        return this.clusterManager;
+    }
+
+    public void setClusterManager(ClusterManager clusterManager) {
+        this.clusterManager = clusterManager;
+    }
+
+    public GroupManager getGroupManager() {
+        return this.groupManager;
+    }
+
+    public void setGroupManager(GroupManager groupManager) {
+        this.groupManager = groupManager;
+    }
+
+    public CellarFeaturesMBeanImpl() throws NotCompliantMBeanException {
+        super(CellarFeaturesMBean.class);
+    }
+
+    public void install(String groupName, String name, String version) throws 
Exception {
+        Group group = groupManager.findGroupByName(groupName);
+        EventProducer producer = clusterManager.getEventProducer(groupName);
+        RemoteFeaturesEvent event = new RemoteFeaturesEvent(name, version, 
FeatureEvent.EventType.FeatureInstalled);
+        event.setForce(true);
+        event.setSourceGroup(group);
+        producer.produce(event);
+    }
+
+    public void install(String groupName, String name) throws Exception {
+        this.install(groupName, name, null);
+    }
+
+    public void uninstall(String groupName, String name, String version) 
throws Exception {
+        Group group = groupManager.findGroupByName(groupName);
+        EventProducer producer = clusterManager.getEventProducer(groupName);
+        RemoteFeaturesEvent event = new RemoteFeaturesEvent(name, version, 
FeatureEvent.EventType.FeatureUninstalled);
+        event.setForce(true);
+        event.setSourceGroup(group);
+        producer.produce(event);
+    }
+
+    public void uninstall(String groupName, String name) throws Exception {
+        this.uninstall(groupName, name, null);
+    }
+
+    public TabularData listFeatures(String group) throws Exception {
+        Map<FeatureInfo, Boolean> allFeatures = 
clusterManager.getMap(Constants.FEATURES + Configurations.SEPARATOR + group);
+        ArrayList<JmxFeature> features = new ArrayList<JmxFeature>();
+        if (allFeatures != null && !allFeatures.isEmpty()) {
+            for (FeatureInfo feature : allFeatures.keySet()) {
+                boolean installed = allFeatures.get(feature);
+                JmxFeature jmxFeature = new JmxFeature(feature, installed);
+                features.add(jmxFeature);
+            }
+        }
+        TabularData table = JmxFeature.tableFrom(features);
+        return table;
+    }
+
+}

Added: 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/internal/CellarGroupMBeanImpl.java
URL: 
http://svn.apache.org/viewvc/karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/internal/CellarGroupMBeanImpl.java?rev=1151756&view=auto
==============================================================================
--- 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/internal/CellarGroupMBeanImpl.java
 (added)
+++ 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/internal/CellarGroupMBeanImpl.java
 Thu Jul 28 08:14:25 2011
@@ -0,0 +1,131 @@
+/*
+ * 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.
+ */
+package org.apache.karaf.cellar.management.internal;
+
+import org.apache.karaf.cellar.core.ClusterManager;
+import org.apache.karaf.cellar.core.Group;
+import org.apache.karaf.cellar.core.GroupManager;
+import org.apache.karaf.cellar.core.Node;
+import org.apache.karaf.cellar.core.command.ExecutionContext;
+import org.apache.karaf.cellar.core.control.ManageGroupAction;
+import org.apache.karaf.cellar.core.control.ManageGroupCommand;
+import org.apache.karaf.cellar.core.control.ManageGroupResult;
+import org.apache.karaf.cellar.management.CellarGroupMBean;
+import org.apache.karaf.cellar.management.codec.JmxGroup;
+
+import javax.management.NotCompliantMBeanException;
+import javax.management.StandardMBean;
+import javax.management.openmbean.TabularData;
+import java.util.*;
+
+/**
+ * Implementation of the Cellar Group MBean;
+ */
+public class CellarGroupMBeanImpl extends StandardMBean implements 
CellarGroupMBean {
+
+    private ClusterManager clusterManager;
+    private ExecutionContext executionContext;
+    private GroupManager groupManager;
+
+    public ClusterManager getClusterManager() {
+        return this.clusterManager;
+    }
+
+    public void setClusterManager(ClusterManager clusterManager) {
+        this.clusterManager = clusterManager;
+    }
+
+    public ExecutionContext getExecutionContext() {
+        return this.executionContext;
+    }
+
+    public void setExecutionContext(ExecutionContext executionContext) {
+        this.executionContext = executionContext;
+    }
+
+    public GroupManager getGroupManager() {
+        return this.groupManager;
+    }
+
+    public void setGroupManager(GroupManager groupManager) {
+        this.groupManager = groupManager;
+    }
+
+    public CellarGroupMBeanImpl() throws NotCompliantMBeanException {
+        super(CellarGroupMBean.class);
+    }
+
+    public void create(String name) throws Exception {
+        groupManager.createGroup(name);
+    }
+
+    public void delete(String name) throws Exception {
+        ClassLoader originalClassLoader = 
Thread.currentThread().getContextClassLoader();
+        try {
+            
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+            Group g = groupManager.findGroupByName(name);
+            List<String> nodes = new LinkedList<String>();
+
+            if (g.getMembers() != null && !g.getMembers().isEmpty()) {
+                for (Node n : g.getMembers()) {
+                    nodes.add(n.getId());
+                }
+                ManageGroupCommand command = new 
ManageGroupCommand(clusterManager.generateId());
+                command.setAction(ManageGroupAction.QUIT);
+                command.setGroupName(name);
+                Set<Node> recipientList = clusterManager.listNodes(nodes);
+                command.setDestination(recipientList);
+                executionContext.execute(command);
+            }
+
+            groupManager.deleteGroup(name);
+        } finally {
+            Thread.currentThread().setContextClassLoader(originalClassLoader);
+        }
+    }
+
+    public void join(String group, String nodeId) throws Exception {
+        List<String> nodes = new ArrayList<String>();
+        nodes.add(nodeId);
+        ManageGroupCommand command = new 
ManageGroupCommand(clusterManager.generateId());
+        command.setAction(ManageGroupAction.JOIN);
+        command.setGroupName(group);
+        Set<Node> recipientList = clusterManager.listNodes(nodes);
+        command.setDestination(recipientList);
+        executionContext.execute(command);
+    }
+
+    public void quit(String group, String nodeId) throws Exception {
+        List<String> nodes = new ArrayList<String>();
+        nodes.add(nodeId);
+        ManageGroupCommand command = new 
ManageGroupCommand(clusterManager.generateId());
+        command.setAction(ManageGroupAction.QUIT);
+        command.setGroupName(group);
+        Set<Node> recipientList = clusterManager.listNodes(nodes);
+        command.setDestination(recipientList);
+        executionContext.execute(command);
+    }
+
+    public TabularData getGroups() throws Exception {
+        Set<Group> allGroups = groupManager.listAllGroups();
+        ArrayList<JmxGroup> groups = new ArrayList<JmxGroup>();
+        for (Group group : allGroups) {
+            JmxGroup jmxGroup = new JmxGroup(group);
+            groups.add(jmxGroup);
+        }
+        TabularData table = JmxGroup.tableFrom(groups);
+        return table;
+    }
+
+}

Modified: 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/internal/CellarNodeMBeanImpl.java
URL: 
http://svn.apache.org/viewvc/karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/internal/CellarNodeMBeanImpl.java?rev=1151756&r1=1151755&r2=1151756&view=diff
==============================================================================
--- 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/internal/CellarNodeMBeanImpl.java
 (original)
+++ 
karaf/cellar/trunk/management/src/main/java/org/apache/karaf/cellar/management/internal/CellarNodeMBeanImpl.java
 Thu Jul 28 08:14:25 2011
@@ -15,15 +15,15 @@ package org.apache.karaf.cellar.manageme
 
 import org.apache.karaf.cellar.core.ClusterManager;
 import org.apache.karaf.cellar.core.Node;
+import org.apache.karaf.cellar.core.command.ExecutionContext;
 import org.apache.karaf.cellar.management.CellarNodeMBean;
 import org.apache.karaf.cellar.management.codec.JmxNode;
+import org.apache.karaf.cellar.utils.ping.Ping;
 
 import javax.management.NotCompliantMBeanException;
 import javax.management.StandardMBean;
 import javax.management.openmbean.TabularData;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 
 /**
  * Implementation of the Cellar Node MBean to manipulate Cellar cluster nodes.
@@ -31,6 +31,7 @@ import java.util.Set;
 public class CellarNodeMBeanImpl extends StandardMBean implements 
CellarNodeMBean {
 
     private ClusterManager clusterManager;
+    private ExecutionContext executionContext;
 
     public CellarNodeMBeanImpl() throws NotCompliantMBeanException {
         super(CellarNodeMBean.class);
@@ -44,9 +45,22 @@ public class CellarNodeMBeanImpl extends
         this.clusterManager = clusterManager;
     }
 
-    public int pingNode(String name) throws Exception {
+    public ExecutionContext getExecutionContext() {
+        return this.executionContext;
+    }
+
+    public void setExecutionContext(ExecutionContext executionContext) {
+        this.executionContext = executionContext;
+    }
 
-        return 0;
+    public long pingNode(String nodeId) throws Exception {
+        Node node = clusterManager.findNodeById(nodeId);
+        Long start = System.currentTimeMillis();
+        Ping ping = new Ping(clusterManager.generateId());
+        ping.setDestination(new HashSet(Arrays.asList(node)));
+        executionContext.execute(ping);
+        Long stop = System.currentTimeMillis();
+        return (stop - start);
     }
 
     public TabularData getNodes() throws Exception {

Modified: 
karaf/cellar/trunk/management/src/main/resources/OSGI-INF/blueprint/blueprint.xml
URL: 
http://svn.apache.org/viewvc/karaf/cellar/trunk/management/src/main/resources/OSGI-INF/blueprint/blueprint.xml?rev=1151756&r1=1151755&r2=1151756&view=diff
==============================================================================
--- 
karaf/cellar/trunk/management/src/main/resources/OSGI-INF/blueprint/blueprint.xml
 (original)
+++ 
karaf/cellar/trunk/management/src/main/resources/OSGI-INF/blueprint/blueprint.xml
 Thu Jul 28 08:14:25 2011
@@ -26,12 +26,31 @@
 
     <bean id="cellarNodeMBean" 
class="org.apache.karaf.cellar.management.internal.CellarNodeMBeanImpl">
         <property name="clusterManager" ref="clusterManager"/>
+        <property name="executionContext" ref="executionContext"/>
+    </bean>
+
+    <bean id="cellarConfigMBean" 
class="org.apache.karaf.cellar.management.internal.CellarConfigMBeanImpl">
+        <property name="clusterManager" ref="clusterManager"/>
+    </bean>
+
+    <bean id="cellarFeaturesMBean" 
class="org.apache.karaf.cellar.management.internal.CellarFeaturesMBeanImpl">
+        <property name="clusterManager" ref="clusterManager"/>
+        <property name="groupManager" ref="groupManager"/>
+    </bean>
+
+    <bean id="cellarGroupMBean" 
class="org.apache.karaf.cellar.management.internal.CellarGroupMBeanImpl">
+        <property name="clusterManager" ref="clusterManager"/>
+        <property name="executionContext" ref="executionContext"/>
+        <property name="groupManager" ref="groupManager"/>
     </bean>
 
     <bean id="mbeanRegister" 
class="org.apache.karaf.management.MBeanRegistrer">
         <property name="mbeans">
             <map>
                 <entry 
value="org.apache.karaf.cellar:type=node,name=${karaf.name}" 
key-ref="cellarNodeMBean"/>
+                <entry 
value="org.apache.karaf.cellar:type=config,name=${karaf.name}" 
key-ref="cellarConfigMBean"/>
+                <entry 
value="org.apache.karaf.cellar:type=features,name=${karaf.name}" 
key-ref="cellarFeaturesMBean"/>
+                <entry 
value="org.apache.karaf.cellar:type=group,name=${karaf.name}" 
key-ref="cellarGroupMBean"/>
             </map>
         </property>
     </bean>


Reply via email to