You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by fm...@apache.org on 2010/10/07 11:15:58 UTC

svn commit: r1005377 - in /sling/whiteboard/fmeschbe/jmx-whiteboard/src/main/java/org/apache/sling/whiteboard/fmeschbe/jmx/whiteboard: Activator.java JmxWhiteboardSupport.java MBeanHolder.java

Author: fmeschbe
Date: Thu Oct  7 09:15:58 2010
New Revision: 1005377

URL: http://svn.apache.org/viewvc?rev=1005377&view=rev
Log:
ARIES-430 Fix Activator license header; Add support for generic MBean services; refactor MBean service maintenance to allow for easy registration with MBeanServers arriving after MBean server registration

Added:
    sling/whiteboard/fmeschbe/jmx-whiteboard/src/main/java/org/apache/sling/whiteboard/fmeschbe/jmx/whiteboard/MBeanHolder.java   (with props)
Modified:
    sling/whiteboard/fmeschbe/jmx-whiteboard/src/main/java/org/apache/sling/whiteboard/fmeschbe/jmx/whiteboard/Activator.java
    sling/whiteboard/fmeschbe/jmx-whiteboard/src/main/java/org/apache/sling/whiteboard/fmeschbe/jmx/whiteboard/JmxWhiteboardSupport.java

Modified: sling/whiteboard/fmeschbe/jmx-whiteboard/src/main/java/org/apache/sling/whiteboard/fmeschbe/jmx/whiteboard/Activator.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/jmx-whiteboard/src/main/java/org/apache/sling/whiteboard/fmeschbe/jmx/whiteboard/Activator.java?rev=1005377&r1=1005376&r2=1005377&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/jmx-whiteboard/src/main/java/org/apache/sling/whiteboard/fmeschbe/jmx/whiteboard/Activator.java (original)
+++ sling/whiteboard/fmeschbe/jmx-whiteboard/src/main/java/org/apache/sling/whiteboard/fmeschbe/jmx/whiteboard/Activator.java Thu Oct  7 09:15:58 2010
@@ -1,21 +1,29 @@
 /*
- * Copyright 1997-2010 Day Management AG
- * Barfuesserplatz 6, 4001 Basel, Switzerland
- * All Rights Reserved.
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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
  *
- * This software is the confidential and proprietary information of
- * Day Management AG, ("Confidential Information"). You shall not
- * disclose such Confidential Information and shall use it only in
- * accordance with the terms of the license agreement you entered into
- * with Day.
+ *   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.sling.whiteboard.fmeschbe.jmx.whiteboard;
 
-import javax.management.DynamicMBean;
 import javax.management.MBeanServer;
 
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 import org.osgi.util.tracker.ServiceTracker;
 
@@ -75,22 +83,31 @@ public class Activator implements Bundle
 
     private class MBeanTracker extends ServiceTracker {
 
-        public MBeanTracker(BundleContext context) {
-            super(context, DynamicMBean.class.getName(), null);
+        /**
+         * Listens for any services registered with an interface whose name ends
+         * with "MBean". This matches all simple MBeans which have to implement
+         * an interface named after the class with a suffix of MBean. It also
+         * matches DynamicMBeans and all its extensions like open MBeans, model
+         * MBeans and StandardMBeans.
+         */
+        private static final String SIMPLE_MBEAN_FILTER = "("
+            + Constants.OBJECTCLASS + "=*MBean)";
+
+        public MBeanTracker(BundleContext context)
+                throws InvalidSyntaxException {
+            super(context, context.createFilter(SIMPLE_MBEAN_FILTER), null);
         }
 
         @Override
         public Object addingService(ServiceReference reference) {
-            DynamicMBean mbean = (DynamicMBean) super.addingService(reference);
+            Object mbean = super.addingService(reference);
             jmxWhiteBoard.registerMBean(mbean, reference);
             return mbean;
         }
 
         @Override
         public void removedService(ServiceReference reference, Object service) {
-            if (service instanceof DynamicMBean) {
-                jmxWhiteBoard.unregisterMBean((DynamicMBean) service);
-            }
+            jmxWhiteBoard.unregisterMBean(service);
             super.removedService(reference, service);
         }
     }

Modified: sling/whiteboard/fmeschbe/jmx-whiteboard/src/main/java/org/apache/sling/whiteboard/fmeschbe/jmx/whiteboard/JmxWhiteboardSupport.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/jmx-whiteboard/src/main/java/org/apache/sling/whiteboard/fmeschbe/jmx/whiteboard/JmxWhiteboardSupport.java?rev=1005377&r1=1005376&r2=1005377&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/jmx-whiteboard/src/main/java/org/apache/sling/whiteboard/fmeschbe/jmx/whiteboard/JmxWhiteboardSupport.java (original)
+++ sling/whiteboard/fmeschbe/jmx-whiteboard/src/main/java/org/apache/sling/whiteboard/fmeschbe/jmx/whiteboard/JmxWhiteboardSupport.java Thu Oct  7 09:15:58 2010
@@ -18,22 +18,13 @@
  */
 package org.apache.sling.whiteboard.fmeschbe.jmx.whiteboard;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
-import java.util.IdentityHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import javax.management.DynamicMBean;
-import javax.management.InstanceAlreadyExistsException;
-import javax.management.InstanceNotFoundException;
+
 import javax.management.MBeanRegistration;
-import javax.management.MBeanRegistrationException;
 import javax.management.MBeanServer;
 import javax.management.MalformedObjectNameException;
-import javax.management.NotCompliantMBeanException;
-import javax.management.ObjectInstance;
 import javax.management.ObjectName;
 
 import org.osgi.framework.ServiceReference;
@@ -49,78 +40,61 @@ class JmxWhiteboardSupport {
 
     private MBeanServer[] mbeanServers = new MBeanServer[0];
 
-    private final Map<DynamicMBean, Map<MBeanServer, ObjectName>> mbeans = new IdentityHashMap<DynamicMBean, Map<MBeanServer, ObjectName>>();
+    private final HashMap<MBeanHolder, MBeanHolder> mbeans = new HashMap<MBeanHolder, MBeanHolder>();
 
     protected void addMBeanServer(final MBeanServer mbeanServer) {
-        List<MBeanServer> serverList = Arrays.asList(mbeanServers);
+
+        log.info("addMBeanServer: Adding MBeanServer " + mbeanServer);
+
+        ArrayList<MBeanServer> serverList = new ArrayList<MBeanServer>(
+            Arrays.asList(mbeanServers));
         serverList.add(mbeanServer);
         mbeanServers = serverList.toArray(new MBeanServer[serverList.size()]);
 
-        // TODO: register all mbeans with the new server
-        for (Entry<DynamicMBean, Map<MBeanServer, ObjectName>> mbean : mbeans.entrySet()) {
+        // register all mbeans with the new server
+        for (MBeanHolder mbean : mbeans.values()) {
+            mbean.register(mbeanServer);
         }
     }
 
     protected void removeMBeanServer(final MBeanServer mbeanServer) {
-        for (Map<MBeanServer, ObjectName> registration : mbeans.values()) {
-            ObjectName name = registration.remove(mbeanServer);
-            if (name != null) {
-                try {
-                    mbeanServer.unregisterMBean(name);
-                } catch (MBeanRegistrationException e) {
-                    log.error("unregisterMBean: Failure unregistering", e);
-                } catch (InstanceNotFoundException e) {
-                    log.error("unregisterMBean: Failure unregistering", e);
-                }
-            }
+
+        log.info("removeMBeanServer: Removing MBeanServer " + mbeanServer);
+
+        // remove all dynamically registered mbeans from the server
+        for (MBeanHolder mbean : mbeans.values()) {
+            mbean.unregister(mbeanServer);
         }
 
-        List<MBeanServer> serverList = Arrays.asList(mbeanServers);
+        ArrayList<MBeanServer> serverList = new ArrayList<MBeanServer>(
+            Arrays.asList(mbeanServers));
         serverList.remove(mbeanServer);
         mbeanServers = serverList.toArray(new MBeanServer[serverList.size()]);
     }
 
-    protected void registerMBean(DynamicMBean mbean,
-            final ServiceReference props) {
+    protected void registerMBean(Object mbean, final ServiceReference props) {
+
+        log.info("registerMBean: Adding MBean " + mbean);
+
         ObjectName objectName = getObjectName(props);
         if (objectName != null || mbean instanceof MBeanRegistration) {
-            Map<MBeanServer, ObjectName> registration = new HashMap<MBeanServer, ObjectName>();
+            MBeanHolder holder = new MBeanHolder(mbean, objectName);
             MBeanServer[] mbeanServers = this.mbeanServers;
             for (MBeanServer mbeanServer : mbeanServers) {
-                try {
-                    ObjectInstance registeredObject = mbeanServer.registerMBean(
-                        mbean, objectName);
-                    registration.put(mbeanServer,
-                        registeredObject.getObjectName());
-                } catch (InstanceAlreadyExistsException e) {
-                    log.error("registerMBean: Failure registering MBean "
-                        + mbean, e);
-                } catch (MBeanRegistrationException e) {
-                    log.error("registerMBean: Failure registering MBean "
-                        + mbean, e);
-                } catch (NotCompliantMBeanException e) {
-                    log.error("registerMBean: Failure registering MBean "
-                        + mbean, e);
-                }
+                holder.register(mbeanServer);
             }
-            mbeans.put(mbean, registration);
+            mbeans.put(holder, holder);
         }
     }
 
-    protected void unregisterMBean(DynamicMBean mbean) {
-        Map<MBeanServer, ObjectName> registration = mbeans.remove(mbean);
-        for (Entry<MBeanServer, ObjectName> reg : registration.entrySet()) {
-            try {
-                reg.getKey().unregisterMBean(reg.getValue());
-            } catch (MBeanRegistrationException e) {
-                log.error("unregisterMBean: Failure unregistering MBean "
-                    + mbean, e);
-            } catch (InstanceNotFoundException e) {
-                log.error("unregisterMBean: Failure unregistering MBean "
-                    + mbean, e);
-            }
+    protected void unregisterMBean(Object mbean) {
+
+        log.info("unregisterMBean: Removing MBean " + mbean);
+
+        final MBeanHolder holder = mbeans.remove(new MBeanHolder(mbean, null));
+        if (holder != null) {
+            holder.unregister();
         }
-        registration.clear();
     }
 
     private ObjectName getObjectName(final ServiceReference props) {

Added: sling/whiteboard/fmeschbe/jmx-whiteboard/src/main/java/org/apache/sling/whiteboard/fmeschbe/jmx/whiteboard/MBeanHolder.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/jmx-whiteboard/src/main/java/org/apache/sling/whiteboard/fmeschbe/jmx/whiteboard/MBeanHolder.java?rev=1005377&view=auto
==============================================================================
--- sling/whiteboard/fmeschbe/jmx-whiteboard/src/main/java/org/apache/sling/whiteboard/fmeschbe/jmx/whiteboard/MBeanHolder.java (added)
+++ sling/whiteboard/fmeschbe/jmx-whiteboard/src/main/java/org/apache/sling/whiteboard/fmeschbe/jmx/whiteboard/MBeanHolder.java Thu Oct  7 09:15:58 2010
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.sling.whiteboard.fmeschbe.jmx.whiteboard;
+
+import java.util.IdentityHashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MBeanServer;
+import javax.management.NotCompliantMBeanException;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+final class MBeanHolder {
+
+    /** default log */
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    private final Object mbean;
+
+    private final ObjectName requestedObjectName;
+
+    private final Map<MBeanServer, ObjectName> registrations;
+
+    MBeanHolder(final Object mbean, final ObjectName requestedObjectName) {
+        this.mbean = mbean;
+        this.requestedObjectName = requestedObjectName;
+        this.registrations = new IdentityHashMap<MBeanServer, ObjectName>();
+    }
+
+    void register(final MBeanServer server) {
+        ObjectInstance instance;
+        try {
+            instance = server.registerMBean(mbean, requestedObjectName);
+            registrations.put(server, instance.getObjectName());
+        } catch (InstanceAlreadyExistsException e) {
+            log.error("register: Failure registering MBean " + mbean, e);
+        } catch (MBeanRegistrationException e) {
+            log.error("register: Failure registering MBean " + mbean, e);
+        } catch (NotCompliantMBeanException e) {
+            log.error("register: Failure registering MBean " + mbean, e);
+        }
+    }
+
+    void unregister(final MBeanServer server) {
+        final ObjectName registeredName = registrations.remove(server);
+        if (registeredName != null) {
+            unregister(server, registeredName);
+        }
+    }
+
+    void unregister() {
+        for (Entry<MBeanServer, ObjectName> entry : registrations.entrySet()) {
+            unregister(entry.getKey(), entry.getValue());
+        }
+        registrations.clear();
+    }
+
+    private void unregister(final MBeanServer server, final ObjectName name) {
+        try {
+            server.unregisterMBean(name);
+        } catch (MBeanRegistrationException e) {
+            log.error("unregister: preDeregister of " + name
+                + " threw an exception", e);
+        } catch (InstanceNotFoundException e) {
+            // not really expected !
+            log.error("unregister: Unexpected unregistration problem of MBean "
+                + name, e);
+        }
+    }
+
+    // ---------- Object Overwrite
+
+    @Override
+    public int hashCode() {
+        return mbean.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == null) {
+            return false;
+        } else if (obj == this) {
+            return true;
+        } else if (obj instanceof MBeanHolder) {
+            return mbean == ((MBeanHolder) obj).mbean;
+        }
+
+        return false;
+    }
+}

Propchange: sling/whiteboard/fmeschbe/jmx-whiteboard/src/main/java/org/apache/sling/whiteboard/fmeschbe/jmx/whiteboard/MBeanHolder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/whiteboard/fmeschbe/jmx-whiteboard/src/main/java/org/apache/sling/whiteboard/fmeschbe/jmx/whiteboard/MBeanHolder.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev Url