You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by aw...@apache.org on 2009/11/19 21:41:15 UTC

svn commit: r882287 - in /incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx: Activator.java Logger.java MBeanHandler.java MBeanServiceTracker.java agent/ agent/JMXAgent.java agent/JMXAgentContext.java agent/JMXAgentImpl.java

Author: awojtuniak
Date: Thu Nov 19 20:41:14 2009
New Revision: 882287

URL: http://svn.apache.org/viewvc?rev=882287&view=rev
Log:
ARIES-29 Implement JMX Agent

Added:
    incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/Logger.java   (with props)
    incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/MBeanHandler.java   (with props)
    incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/MBeanServiceTracker.java   (with props)
    incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/agent/
    incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgent.java   (with props)
    incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentContext.java   (with props)
    incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentImpl.java   (with props)
Modified:
    incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/Activator.java

Modified: incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/Activator.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/Activator.java?rev=882287&r1=882286&r2=882287&view=diff
==============================================================================
--- incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/Activator.java (original)
+++ incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/Activator.java Thu Nov 19 20:41:14 2009
@@ -16,30 +16,56 @@
  */
 package org.apache.aries.jmx;
 
+import org.apache.aries.jmx.agent.JMXAgent;
+import org.apache.aries.jmx.agent.JMXAgentImpl;
+import org.apache.aries.jmx.agent.JMXAgentContext;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
+import org.osgi.service.log.LogService;
 
 /**
+ * <p>Activator for JMX OSGi bundle.</p>
  * 
- *
  * @version $Rev$ $Date$
  */
 public class Activator implements BundleActivator {
 
-    /* (non-Javadoc)
-     * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+    private JMXAgent agent;
+    private Logger logger;
+
+    /**
+     * <p>Called when JMX OSGi bundle starts.
+     * This method creates and starts JMX agent.</p>
+     * 
+     * @see org.osgi.framework.BundleActivator#start(BundleContext)
      */
     public void start(BundleContext context) throws Exception {
-        // TODO Auto-generated method stub
-
+        logger = new Logger(context);
+        //starting logger
+        logger.open();
+        logger.log(LogService.LOG_DEBUG, "Starting JMX OSGi bundle");
+        agent = new JMXAgentImpl(logger);
+        JMXAgentContext agentContext = new JMXAgentContext(context, agent, logger);
+        agent.setAgentContext(agentContext);
+        agent.start();
     }
 
-    /* (non-Javadoc)
-     * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+    /**
+     * <p>Called when JMX OSGi bundle stops.
+     * This method stops agent and logger @see {@link Logger}.</p>
+     * 
+     * @see org.osgi.framework.BundleActivator#stop(BundleContext)
      */
-    public void stop(BundleContext context) throws Exception {
-        // TODO Auto-generated method stub
-
+    public void stop(BundleContext bc) throws Exception {
+        if (logger != null) {
+            logger.log(LogService.LOG_DEBUG, "Stopping JMX OSGi bundle");
+        }
+        if (agent != null) {
+            agent.stop();
+        }
+        if (logger != null) {
+            logger.close();
+        }
     }
 
 }

Added: incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/Logger.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/Logger.java?rev=882287&view=auto
==============================================================================
--- incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/Logger.java (added)
+++ incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/Logger.java Thu Nov 19 20:41:14 2009
@@ -0,0 +1,99 @@
+/**
+ *  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.aries.jmx;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.log.LogService;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * <p>This <tt>Logger</tt> class represents ServiceTracker for LogService. 
+ * It provides methods for logging messages. If LogService is not available it logs to stdout.</p>
+ * 
+ * @see org.osgi.service.log.LogService
+ * @see org.osgi.util.tracker.ServiceTracker
+ * @version $Rev$ $Date$
+ */
+public class Logger extends ServiceTracker implements LogService {
+    
+    private String bundleLocation;
+
+    /**
+     * Constructs new Logger(ServiceTracker for LogService).
+     * 
+     * @param context bundle context.
+     */
+    public Logger(BundleContext context) {
+        super(context, LogService.class.getName(), null);
+        this.bundleLocation = context.getBundle().getLocation();
+    }
+
+    /**
+     * @see org.osgi.service.log.LogService#log(int, java.lang.String)
+     */
+    public void log(int level, String message) {
+        LogService logService = (LogService) getService();
+        if (logService != null) {
+            logService.log(level, message);
+        } else {
+            System.err.println("[" + bundleLocation + ":" + level + "] " + message);
+        }
+
+    }
+
+    /**
+     * @see org.osgi.service.log.LogService#log(int, java.lang.String, java.lang.Throwable)
+     */
+    public void log(int level, String message, Throwable exception) {
+        LogService logService = (LogService) getService();
+        if (logService != null) {
+            logService.log(level, message, exception);
+        } else {
+            System.err.println("[" + bundleLocation + ":" + +level + "] " + message
+                    + ((exception == null) ? " " : exception.toString()));
+        }
+    }
+
+    /**
+     * @see org.osgi.service.log.LogService#log(org.osgi.framework.ServiceReference, int, java.lang.String)
+     */
+    public void log(ServiceReference ref, int level, String message) {
+        LogService logService = (LogService) getService();
+        if (logService != null) {
+            logService.log(ref, level, message);
+        } else {
+            System.err.println("[" + bundleLocation + ":" + ((ref == null) ? " " : (ref + ":"))
+                    + level + "] " + message);
+        }
+    }
+
+    /**
+     * @see org.osgi.service.log.LogService#log(org.osgi.framework.ServiceReference, int, java.lang.String,
+     *      java.lang.Throwable)
+     */
+    public void log(ServiceReference ref, int level, String message, Throwable exception) {
+        LogService logService = (LogService) getService();
+        if (logService != null) {
+            logService.log(ref, level, message, exception);
+        } else {
+            System.err.println("[" + bundleLocation + ":" + ((ref == null) ? "" : (ref + ":"))
+                    + level + "] " + message + ((exception == null) ? " " : exception.toString()));
+        }
+    }
+
+}

Propchange: incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/Logger.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/MBeanHandler.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/MBeanHandler.java?rev=882287&view=auto
==============================================================================
--- incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/MBeanHandler.java (added)
+++ incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/MBeanHandler.java Thu Nov 19 20:41:14 2009
@@ -0,0 +1,51 @@
+/**
+ *  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.aries.jmx;
+
+import javax.management.StandardMBean;
+
+/**
+ * <p>Represents JMX OSGi MBeans handler.
+ * Storing information about holden MBean.</p>
+ * 
+ * @version $Rev$ $Date$
+ */
+public interface MBeanHandler {
+
+    /**
+     * Gets MBean holden by handler.
+     * @return MBean @see {@link StandardMBean}.
+     */
+    StandardMBean getMbean();
+
+    /**
+     * Starts handler.
+     */
+    void open();
+
+    /**
+     * Stops handler.
+     */
+    void close();
+
+    /**
+     * Gets name of the MBean.
+     * @return MBean name.
+     */
+    String getName();
+
+}
\ No newline at end of file

Propchange: incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/MBeanHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/MBeanServiceTracker.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/MBeanServiceTracker.java?rev=882287&view=auto
==============================================================================
--- incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/MBeanServiceTracker.java (added)
+++ incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/MBeanServiceTracker.java Thu Nov 19 20:41:14 2009
@@ -0,0 +1,90 @@
+/**
+ *  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.aries.jmx;
+
+import java.util.concurrent.ExecutorService;
+
+import javax.management.MBeanServer;
+
+import org.apache.aries.jmx.agent.JMXAgentContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.log.LogService;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * <p>This class <tt>MBeanServiceTracker</tt> represents {@link ServiceTracker} for {@link MBeanServer}'s
+ * registered as services.
+ * Tracking all registered MBeanServers in ServiceRegistry.</p>
+ * @see ServiceTracker
+ * @version $Rev$ $Date$
+ */
+public class MBeanServiceTracker extends ServiceTracker {
+
+    private JMXAgentContext agentContext;
+
+    /**
+     * Constructs new MBeanServiceTracker.
+     * @param agentContext agent context.
+     */
+    public MBeanServiceTracker(JMXAgentContext agentContext) {
+        super(agentContext.getBundleContext(), MBeanServer.class.getName(), null);
+        this.agentContext = agentContext;
+    }
+
+    /**
+     * <p>Register MBeans using {@link JMXAgentContext#registerMBeans(MBeanServer)} 
+     * when MBeanServer service is discovered</p> 
+     * @see ServiceTracker#addingService(ServiceReference)
+     */
+    public Object addingService(final ServiceReference reference) {
+        final MBeanServer mbeanServer = (MBeanServer) context.getService(reference);
+        Logger logger = agentContext.getLogger();
+        logger.log(LogService.LOG_DEBUG, "Discovered MBean server " + mbeanServer);
+        ExecutorService executor = agentContext.getRegistrationExecutor();
+        executor.submit(new Runnable() {
+
+            public void run() {
+                agentContext.registerMBeans(mbeanServer);
+
+            }
+        });
+
+        return super.addingService(reference);
+    }
+
+    /**
+     * <p>Unregister MBeans using {@link JMXAgentContext#unregisterMBeans(MBeanServer)} 
+     * when MBeanServer service is removed (unregistered from ServiceRegistry) or
+     * tracker is closed</p> 
+     * @see ServiceTracker#removedService(ServiceReference, Object)
+     */
+    public void removedService(final ServiceReference reference, Object service) {
+        final MBeanServer mbeanServer = (MBeanServer) context.getService(reference);
+        Logger logger = agentContext.getLogger();
+        logger.log(LogService.LOG_DEBUG, "MBean server " + mbeanServer+ " is unregistered from SeviceRegistry");
+        ExecutorService executor = agentContext.getRegistrationExecutor();
+        executor.submit(new Runnable() {
+
+            public void run() {
+                agentContext.unregisterMBeans(mbeanServer);
+            }
+        });
+        super.removedService(reference, service);
+    }
+
+    
+}

Propchange: incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/MBeanServiceTracker.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgent.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgent.java?rev=882287&view=auto
==============================================================================
--- incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgent.java (added)
+++ incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgent.java Thu Nov 19 20:41:14 2009
@@ -0,0 +1,88 @@
+/**
+ *  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.aries.jmx.agent;
+
+import java.util.concurrent.ExecutorService;
+
+import javax.management.MBeanServer;
+
+import org.apache.aries.jmx.MBeanHandler;
+
+/**
+ * <p>This <tt>JMXAgent</tt> class represent agent for MBeanServers registered in ServiceRegistry.
+ * It's responsible for registration and unregistration MBeans with available MBeanServers.
+ * </p>
+ * 
+ * @version $Rev$ $Date$
+ */
+public interface JMXAgent {
+
+    /**
+     * This method starts JMX agent.
+     * Creates and starting all MBean Handlers and MBeanServiceTracker. 
+     */
+    void start();
+
+    /**
+     * Registers MBeans with provided MBeanServer.
+     * @param server MBeanServer with which MBeans are going to be registered 
+     */
+    void registerMBeans(final MBeanServer server);
+
+    /**
+     * Unregisters MBeans with provided MBeanServer.
+     * @param server MBeanServer with which MBeans are going to be unregistered.
+     */
+    void unregisterMBeans(final MBeanServer server);
+
+    /**
+     * Registers MBean with all available MBeanServers.
+     * @param mBeanHandler handler which contains MBean info.
+     */
+    void registerMBean(final MBeanHandler mBeanHandler);
+
+    /**
+     * Unregisters MBean with all available MBeanServers.
+     * @param name of MBean to be unregistered.
+     */
+    void unregisterMBean(final String name);
+
+    /**
+     * Stops JMXAgent.
+     * This method stops MBeanServiceTracker and all MBean handlers.
+     */
+    void stop();
+
+    /**
+     * Gets JMXAgentContext @see {@link JMXAgentContext}.
+     * @return JMXAgentContext instance.
+     */
+    JMXAgentContext getAgentContext();
+
+    /**
+     * Sets JMXAgentContext for this agent.
+     * @param agentContext JMXAgentContext instance created for this agent.
+     */
+    void setAgentContext(JMXAgentContext agentContext);
+
+    /**
+     * Gets registration {@link ExecutorService}.
+     * @return registration executor.
+     */
+    ExecutorService getRegistrationExecutor();
+
+}
\ No newline at end of file

Propchange: incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgent.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentContext.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentContext.java?rev=882287&view=auto
==============================================================================
--- incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentContext.java (added)
+++ incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentContext.java Thu Nov 19 20:41:14 2009
@@ -0,0 +1,108 @@
+/**
+ *  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.aries.jmx.agent;
+
+import java.util.concurrent.ExecutorService;
+
+import javax.management.MBeanServer;
+
+import org.apache.aries.jmx.Logger;
+import org.apache.aries.jmx.MBeanHandler;
+import org.osgi.framework.BundleContext;
+
+/**
+ * <p>This class <tt>JMXAgentContext</tt> represents context of JMXAgent.
+ * Delegates registration and unregistration methods to {@link JMXAgent}.</p>
+ * @see JMXAgent
+ * 
+ * @version $Rev$ $Date$
+ */
+public class JMXAgentContext {
+
+    private JMXAgent agent;
+    private BundleContext bundleContext;
+    private Logger logger;
+
+    /**
+     * Constructs new JMXAgentContext.
+     * @param bundleContext bundle context @see {@link BundleContext}.
+     * @param agent {@link JMXAgent}.
+     * @param log logger represents by @see {@link Logger}.
+     */
+    public JMXAgentContext(BundleContext bundleContext, JMXAgent agent, Logger log) {
+        this.bundleContext = bundleContext;
+        this.agent = agent;
+        this.logger = log;
+    }
+
+    /**
+     * Delegates invocation to JMX agent.
+     * @see org.apache.aries.jmx.agent.JMXAgent#registerMBeans(MBeanServer)
+     * 
+     */
+    public void registerMBeans(final MBeanServer server) {
+        agent.registerMBeans(server);
+    }
+
+    /**
+     * Delegates invocation to JMX agent.
+     * @see org.apache.aries.jmx.agent.JMXAgent#unregisterMBeans(MBeanServer)
+     */
+    public void unregisterMBeans(final MBeanServer server) {
+        agent.unregisterMBeans(server);
+    }
+
+    /**
+     * Delegates invocation to JMX agent.
+     * @see org.apache.aries.jmx.agent.JMXAgentl#registerMBean(MBeanHandler)
+     */
+    public void registerMBean(final MBeanHandler mbeanData) {
+        agent.registerMBean(mbeanData);
+    }
+
+    /**
+     * Delegates invocation to JMX agent.
+     * @see org.apache.aries.jmx.agent.JMXAgent#unregisterMBean(String)
+     */
+    public void unregisterMBean(final String name) {
+        agent.unregisterMBean(name);
+    }
+
+    /**
+     * Gets bundle context.
+     * @return bundle context.
+     */
+    public BundleContext getBundleContext() {
+        return bundleContext;
+    }
+
+    /**
+     * Gets a logger represents by @see {@link Logger}.
+     * @return LogService tracker.
+     */
+    public Logger getLogger() {
+        return logger;
+    }
+
+    /**
+     * Delegates invocation to JMX agent.
+     * @see org.apache.aries.jmx.agent.JMXAgent#getRegistrationExecutor()
+     */
+    public ExecutorService getRegistrationExecutor() {
+        return agent.getRegistrationExecutor();
+    }
+}

Propchange: incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentContext.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentImpl.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentImpl.java?rev=882287&view=auto
==============================================================================
--- incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentImpl.java (added)
+++ incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentImpl.java Thu Nov 19 20:41:14 2009
@@ -0,0 +1,247 @@
+/**
+ *  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.aries.jmx.agent;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.NotCompliantMBeanException;
+import javax.management.ObjectName;
+import javax.management.StandardMBean;
+
+import org.apache.aries.jmx.Logger;
+import org.apache.aries.jmx.MBeanHandler;
+import org.apache.aries.jmx.MBeanServiceTracker;
+import org.osgi.service.log.LogService;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * <p>
+ * Represent agent for MBeanServers registered in ServiceRegistry. Providing registration and unregistration methods.
+ * </p>
+ * 
+ * @see JMXAgent
+ * 
+ * @version $Rev$ $Date$
+ */
+public class JMXAgentImpl implements JMXAgent {
+
+    private ServiceTracker mbeanServiceTracker;
+    /**
+     * {@link MBeanHandler} store.
+     */
+    private Set<MBeanHandler> mbeansHandlers;
+    private JMXAgentContext agentContext;
+    private Logger logger;
+
+    /**
+     * Registration {@link ExecutorService}.
+     */
+    private ExecutorService registrationExecutor;
+
+    /**
+     * Constructs new JMXAgent.
+     * 
+     * @param logger @see org.apache.aries.jmx.Logger
+     */
+    public JMXAgentImpl(Logger logger) {
+        this.logger = logger;
+        this.mbeansHandlers = new HashSet<MBeanHandler>();
+        this.registrationExecutor = Executors.newSingleThreadExecutor();
+    }
+
+    /**
+     * @see org.apache.aries.jmx.agent.JMXAgent#start()
+     */
+    public void start() {
+        logger.log(LogService.LOG_INFO, "Starting JMX OSGi agent");
+        //MBeanHandler frameworkHandler = new FrameworkMBeanHandler(bc, logger);
+        //frameworkHandler.open();
+        //mbeansHandlers.add(frameworkHandler);
+        mbeanServiceTracker = new MBeanServiceTracker(agentContext);
+        mbeanServiceTracker.open();
+    }
+
+    /**
+     * @see org.apache.aries.jmx.agent.JMXAgent#registerMBeans(javax.management.MBeanServer)
+     */
+    public void registerMBeans(final MBeanServer server) {
+        for (MBeanHandler mbeanHandler : mbeansHandlers) {
+            String name = mbeanHandler.getName();
+            StandardMBean mbean = mbeanHandler.getMbean();
+            if (mbean != null) {
+                try {
+                    logger.log(LogService.LOG_INFO, "Registering " + mbean.getMBeanInterface().getName()
+                            + " to MBeanServer " + server + " with name " + name);
+                    server.registerMBean(mbean, new ObjectName(name));
+                } catch (InstanceAlreadyExistsException e) {
+                    logger.log(LogService.LOG_ERROR, "MBean is already registered", e);
+                } catch (MBeanRegistrationException e) {
+                    logger.log(LogService.LOG_ERROR, "Can't register MBean", e);
+                } catch (NotCompliantMBeanException e) {
+                    logger.log(LogService.LOG_ERROR, "MBean is not compliant MBean", e);
+                } catch (MalformedObjectNameException e) {
+                    logger.log(LogService.LOG_ERROR, "Try to register with no valid objectname", e);
+                } catch (NullPointerException e) {
+                    logger.log(LogService.LOG_ERROR, "Name of objectname can't be null", e);
+                }
+            }
+        }
+
+    }
+
+    /**
+     * @see org.apache.aries.jmx.agent.JMXAgent#unregisterMBeans(javax.management.MBeanServer)
+     */
+    public void unregisterMBeans(final MBeanServer server) {
+        for (MBeanHandler mBeanHandler : mbeansHandlers) {
+            String name = mBeanHandler.getName();
+            StandardMBean mbean = mBeanHandler.getMbean();
+            if (mbean != null) {
+                try {
+                    logger.log(LogService.LOG_INFO, "Unregistering " + mbean.getMBeanInterface().getName()
+                            + " to MBeanServer " + server + " with name " + name);
+                    server.unregisterMBean(new ObjectName(name));
+                } catch (MBeanRegistrationException e) {
+                    logger.log(LogService.LOG_ERROR, "Can't unregister MBean", e);
+                } catch (InstanceNotFoundException e) {
+                    logger.log(LogService.LOG_ERROR, "Mbena doesn't exist in the repository", e);
+                } catch (MalformedObjectNameException e) {
+                    logger.log(LogService.LOG_ERROR, "Try to unregister with no valid objectname", e);
+                } catch (NullPointerException e) {
+                    logger.log(LogService.LOG_ERROR, "Name of objectname can't be null ", e);
+                } 
+            }
+
+        }
+
+    }
+
+    /**
+     * @see org.apache.aries.jmx.agent.JMXAgent#registerMBean(org.apache.aries.jmx.MBeanHandler)
+     */
+    public void registerMBean(final MBeanHandler mBeanHandler) {
+        Object[] servers = getMBeanServers();
+        if (servers == null) {
+            logger.log(LogService.LOG_WARNING, "There are no MBean servers registred, can't register MBeans");
+            return;
+        }
+
+        for (Object server : servers) {
+            String name = mBeanHandler.getName();
+            StandardMBean mbean = mBeanHandler.getMbean();
+            try {
+                logger.log(LogService.LOG_INFO, "Registering " + mbean.getMBeanInterface().getName()
+                        + " to MBeanServer " + server + " with name " + name);
+                ((MBeanServer) server).registerMBean(mbean, new ObjectName(name));
+
+            } catch (InstanceAlreadyExistsException e) {
+                logger.log(LogService.LOG_ERROR, "MBean is already registered", e);
+            } catch (MBeanRegistrationException e) {
+                logger.log(LogService.LOG_ERROR, "Can't register MBean", e);
+            } catch (NotCompliantMBeanException e) {
+                logger.log(LogService.LOG_ERROR, "MBean is not compliant MBean, Stopping registration", e);
+                return;
+            } catch (MalformedObjectNameException e) {
+                logger.log(LogService.LOG_ERROR, "Try to register with no valid objectname, Stopping registration", e);
+                return;
+            } catch (NullPointerException e) {
+                logger.log(LogService.LOG_ERROR, "Name of objectname can't be null, Stopping registration", e);
+                return;
+            }
+        }
+
+    }
+
+    /**
+     * @see org.apache.aries.jmx.agent.JMXAgent#unregisterMBean(java.lang.String)
+     */
+    public void unregisterMBean(final String name) {
+        Object[] servers = getMBeanServers();
+        for (Object server : servers) {
+
+            try {
+                logger.log(LogService.LOG_INFO, "Unregistering mbean " + " to MBeanServer " + server + " with name "
+                        + name);
+                ((MBeanServer) server).unregisterMBean(new ObjectName(name));
+            } catch (MBeanRegistrationException e) {
+                logger.log(LogService.LOG_ERROR, "Can't register MBean", e);
+            } catch (InstanceNotFoundException e) {
+                logger.log(LogService.LOG_ERROR, "Mbena doesn't exist in the repository", e);
+            } catch (MalformedObjectNameException e) {
+                logger.log(LogService.LOG_ERROR, "Try to register with no valid objectname, Stopping registration", e);
+                return;
+            } catch (NullPointerException e) {
+                logger.log(LogService.LOG_ERROR, "Name of objectname can't be null, Stopping registration", e);
+                return;
+            }
+
+        }
+    }
+
+    /**
+     * @see org.apache.aries.jmx.agent.JMXAgent#stop()
+     */
+    public void stop() {
+        logger.log(LogService.LOG_INFO, "Stopping JMX OSGi agent");
+        mbeanServiceTracker.close();
+        for (MBeanHandler mBeanHandler : mbeansHandlers) {
+            mBeanHandler.close();
+        }
+        if (registrationExecutor != null && !registrationExecutor.isShutdown()) {
+            registrationExecutor.shutdown();
+        }
+    }
+
+    /**
+     * @see org.apache.aries.jmx.agent.JMXAgent#getAgentContext()
+     */
+    public JMXAgentContext getAgentContext() {
+        return agentContext;
+    }
+
+    /**
+     * @see org.apache.aries.jmx.agent.JMXAgent#setAgentContext(org.apache.aries.jmx.agent.JMXAgentContext)
+     */
+    public void setAgentContext(JMXAgentContext agentContext) {
+        this.agentContext = agentContext;
+    }
+
+    /**
+     * Gets all MBeanServers from MBeanServiceTracker.
+     * 
+     * @return array of MBean servers.
+     */
+    private Object[] getMBeanServers() {
+        return mbeanServiceTracker.getServices();
+    }
+
+    /**
+     * @see org.apache.aries.jmx.agent.JMXAgent#getRegistrationExecutor()
+     */
+    public ExecutorService getRegistrationExecutor() {
+        return registrationExecutor;
+    }
+
+}

Propchange: incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native