Repository: karaf-cellar Updated Branches: refs/heads/master 5e97cb14a -> 38af3d0c4
[KARAF-3051] Refactoring of dosgi module to use shell table and add ServiceMBean Project: http://git-wip-us.apache.org/repos/asf/karaf-cellar/repo Commit: http://git-wip-us.apache.org/repos/asf/karaf-cellar/commit/38af3d0c Tree: http://git-wip-us.apache.org/repos/asf/karaf-cellar/tree/38af3d0c Diff: http://git-wip-us.apache.org/repos/asf/karaf-cellar/diff/38af3d0c Branch: refs/heads/master Commit: 38af3d0c4e03bccb52f446c4e0c1373f98592425 Parents: 5e97cb1 Author: Jean-Baptiste Onofré <[email protected]> Authored: Tue Jun 17 21:39:16 2014 +0200 Committer: Jean-Baptiste Onofré <[email protected]> Committed: Tue Jun 17 21:39:16 2014 +0200 ---------------------------------------------------------------------- dosgi/pom.xml | 4 ++ .../cellar/dosgi/management/ServiceMBean.java | 26 ++++++++ .../management/internal/ServiceMBeanImpl.java | 66 ++++++++++++++++++++ .../shell/ListDistributedServicesCommand.java | 11 ++-- .../resources/OSGI-INF/blueprint/management.xml | 32 ++++++++++ 5 files changed, 134 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/38af3d0c/dosgi/pom.xml ---------------------------------------------------------------------- diff --git a/dosgi/pom.xml b/dosgi/pom.xml index d22efde..982deda 100644 --- a/dosgi/pom.xml +++ b/dosgi/pom.xml @@ -58,6 +58,10 @@ <groupId>org.apache.karaf.cellar</groupId> <artifactId>org.apache.karaf.cellar.core</artifactId> </dependency> + <dependency> + <groupId>org.apache.karaf.shell</groupId> + <artifactId>org.apache.karaf.shell.table</artifactId> + </dependency> <!-- Logging Dependencies --> <dependency> http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/38af3d0c/dosgi/src/main/java/org/apache/karaf/cellar/dosgi/management/ServiceMBean.java ---------------------------------------------------------------------- diff --git a/dosgi/src/main/java/org/apache/karaf/cellar/dosgi/management/ServiceMBean.java b/dosgi/src/main/java/org/apache/karaf/cellar/dosgi/management/ServiceMBean.java new file mode 100644 index 0000000..eb4bc5f --- /dev/null +++ b/dosgi/src/main/java/org/apache/karaf/cellar/dosgi/management/ServiceMBean.java @@ -0,0 +1,26 @@ +/* + * 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.dosgi.management; + +import java.util.List; +import java.util.Map; + +/** + * Describe the attributes and operations on the Cellar service MBean. + */ +public interface ServiceMBean { + + public Map<String, List<String>> getServices(); + +} http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/38af3d0c/dosgi/src/main/java/org/apache/karaf/cellar/dosgi/management/internal/ServiceMBeanImpl.java ---------------------------------------------------------------------- diff --git a/dosgi/src/main/java/org/apache/karaf/cellar/dosgi/management/internal/ServiceMBeanImpl.java b/dosgi/src/main/java/org/apache/karaf/cellar/dosgi/management/internal/ServiceMBeanImpl.java new file mode 100644 index 0000000..a5272f4 --- /dev/null +++ b/dosgi/src/main/java/org/apache/karaf/cellar/dosgi/management/internal/ServiceMBeanImpl.java @@ -0,0 +1,66 @@ +/* + * 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.dosgi.management.internal; + +import org.apache.karaf.cellar.core.ClusterManager; +import org.apache.karaf.cellar.core.Node; +import org.apache.karaf.cellar.dosgi.Constants; +import org.apache.karaf.cellar.dosgi.EndpointDescription; +import org.apache.karaf.cellar.dosgi.management.ServiceMBean; + +import javax.management.NotCompliantMBeanException; +import javax.management.StandardMBean; +import java.util.*; + +public class ServiceMBeanImpl extends StandardMBean implements ServiceMBean { + + private ClusterManager clusterManager; + + public ServiceMBeanImpl() throws NotCompliantMBeanException { + super(ServiceMBean.class); + } + + public Map<String, List<String>> getServices() { + Map<String, List<String>> services = new HashMap<String, List<String>>(); + ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); + try { + Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); + Map<String, EndpointDescription> remoteEndpoints = clusterManager.getMap(Constants.REMOTE_ENDPOINTS); + if (remoteEndpoints != null && !remoteEndpoints.isEmpty()) { + for (Map.Entry<String, EndpointDescription> entry : remoteEndpoints.entrySet()) { + EndpointDescription endpointDescription = entry.getValue(); + String serviceClass = endpointDescription.getServiceClass(); + Set<Node> nodes = endpointDescription.getNodes(); + LinkedList<String> providers = new LinkedList<String>(); + for (Node node : nodes) { + providers.add(node.getId()); + } + services.put(serviceClass, providers); + } + } + } finally { + Thread.currentThread().setContextClassLoader(originalClassLoader); + } + return services; + } + + public ClusterManager getClusterManager() { + return this.clusterManager; + } + + public void setClusterManager(ClusterManager clusterManager) { + this.clusterManager = clusterManager; + } + +} http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/38af3d0c/dosgi/src/main/java/org/apache/karaf/cellar/dosgi/shell/ListDistributedServicesCommand.java ---------------------------------------------------------------------- diff --git a/dosgi/src/main/java/org/apache/karaf/cellar/dosgi/shell/ListDistributedServicesCommand.java b/dosgi/src/main/java/org/apache/karaf/cellar/dosgi/shell/ListDistributedServicesCommand.java index f22001b..c3bf6e4 100644 --- a/dosgi/src/main/java/org/apache/karaf/cellar/dosgi/shell/ListDistributedServicesCommand.java +++ b/dosgi/src/main/java/org/apache/karaf/cellar/dosgi/shell/ListDistributedServicesCommand.java @@ -18,6 +18,7 @@ import org.apache.karaf.cellar.core.shell.CellarCommandSupport; import org.apache.karaf.cellar.dosgi.Constants; import org.apache.karaf.cellar.dosgi.EndpointDescription; import org.apache.karaf.shell.commands.Command; +import org.apache.karaf.shell.table.ShellTable; import java.util.Map; import java.util.Set; @@ -25,8 +26,6 @@ import java.util.Set; @Command(scope = "cluster", name = "service-list", description = "List the services available on the cluster") public class ListDistributedServicesCommand extends CellarCommandSupport { - private static final String LIST_FORMAT = "%-80s %-20s"; - @Override protected Object doExecute() throws Exception { ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); @@ -34,17 +33,19 @@ public class ListDistributedServicesCommand extends CellarCommandSupport { Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); Map<String, EndpointDescription> remoteEndpoints = clusterManager.getMap(Constants.REMOTE_ENDPOINTS); if (remoteEndpoints != null && !remoteEndpoints.isEmpty()) { - System.out.println(String.format(LIST_FORMAT, "Service Class", "Provider Node")); + ShellTable table = new ShellTable(); + table.column("Service Class"); + table.column("Provider Node"); for (Map.Entry<String, EndpointDescription> entry : remoteEndpoints.entrySet()) { EndpointDescription endpointDescription = entry.getValue(); String serviceClass = endpointDescription.getServiceClass(); Set<Node> nodes = endpointDescription.getNodes(); for (Node node : nodes) { - System.out.println(String.format(LIST_FORMAT, serviceClass, node.getId())); + table.addRow().addContent(serviceClass, node.getId()); serviceClass = ""; } } - + table.print(System.out); } else { System.out.println("No service available on the cluster"); } http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/38af3d0c/dosgi/src/main/resources/OSGI-INF/blueprint/management.xml ---------------------------------------------------------------------- diff --git a/dosgi/src/main/resources/OSGI-INF/blueprint/management.xml b/dosgi/src/main/resources/OSGI-INF/blueprint/management.xml new file mode 100644 index 0000000..3b52c9a --- /dev/null +++ b/dosgi/src/main/resources/OSGI-INF/blueprint/management.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ 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. + --> +<blueprint default-availability="mandatory" + xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" + xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"> + + <!-- system properties --> + <ext:property-placeholder placeholder-prefix="$[" placeholder-suffix="]" /> + + <!-- Cellar Service MBean --> + <bean id="cellarServiceMBean" class="org.apache.karaf.cellar.dosgi.management.internal.ServiceMBeanImpl"> + <property name="clusterManager" ref="clusterManager"/> + </bean> + <service ref="cellarServiceMBean" auto-export="interfaces"> + <service-properties> + <entry key="jmx.objectname" value="org.apache.karaf.cellar:type=service,name=$[karaf.name]"/> + </service-properties> + </service> + +</blueprint> \ No newline at end of file
