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