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