Author: davidb
Date: Wed May 23 14:06:29 2012
New Revision: 1341868
URL: http://svn.apache.org/viewvc?rev=1341868&view=rev
Log:
Transfer changes from ARIES-663 and ARIES-782 to jmx-next.
Modified:
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/AbstractCompendiumHandler.java
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgent.java
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentContext.java
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentImpl.java
aries/trunk/sandbox/jmx-next/jmx-core/src/test/java/org/apache/aries/jmx/CompendiumHandlerTest.java
Modified:
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/AbstractCompendiumHandler.java
URL:
http://svn.apache.org/viewvc/aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/AbstractCompendiumHandler.java?rev=1341868&r1=1341867&r2=1341868&view=diff
==============================================================================
---
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/AbstractCompendiumHandler.java
(original)
+++
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/AbstractCompendiumHandler.java
Wed May 23 14:06:29 2012
@@ -77,7 +77,7 @@ public abstract class AbstractCompendium
Long serviceId = (Long) reference.getProperty(Constants.SERVICE_ID);
//API stipulates versions for compendium services with static
ObjectName
//This shouldn't happen but added as a consistency check
- if (getTrackingCount() > 0) {
+ if (trackedId != null) {
String serviceDescription = (String)
((reference.getProperty(Constants.SERVICE_DESCRIPTION) != null) ?
reference.getProperty(Constants.SERVICE_DESCRIPTION) :
reference.getProperty(Constants.OBJECTCLASS));
logger.log(LogService.LOG_WARNING, "Detected secondary
ServiceReference for [" + serviceDescription
@@ -117,7 +117,7 @@ public abstract class AbstractCompendium
ExecutorService executor = agentContext.getRegistrationExecutor();
executor.submit(new Runnable() {
public void run() {
- agentContext.unregisterMBean(getName());
+
agentContext.unregisterMBean(AbstractCompendiumHandler.this);
}
});
trackedId = null;
Modified:
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgent.java
URL:
http://svn.apache.org/viewvc/aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgent.java?rev=1341868&r1=1341867&r2=1341868&view=diff
==============================================================================
---
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgent.java
(original)
+++
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgent.java
Wed May 23 14:06:29 2012
@@ -26,20 +26,20 @@ 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.
+ * 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
+ * @param server MBeanServer with which MBeans are going to be registered
*/
void registerMBeans(final MBeanServer server);
@@ -57,7 +57,14 @@ public interface JMXAgent {
/**
* Unregisters MBean with all available MBeanServers.
+ * @param mBeanHandler handler which contains MBean info.
+ */
+ void unregisterMBean(final MBeanHandler mBeanHandler);
+
+ /**
+ * Unregisters MBean with all available MBeanServers.
* @param name of MBean to be unregistered.
+ * @deprecated
*/
void unregisterMBean(final String name);
Modified:
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentContext.java
URL:
http://svn.apache.org/viewvc/aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentContext.java?rev=1341868&r1=1341867&r2=1341868&view=diff
==============================================================================
---
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentContext.java
(original)
+++
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentContext.java
Wed May 23 14:06:29 2012
@@ -28,7 +28,7 @@ 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 {
@@ -52,7 +52,7 @@ public class JMXAgentContext {
/**
* Delegates invocation to JMX agent.
* @see org.apache.aries.jmx.agent.JMXAgent#registerMBeans(MBeanServer)
- *
+ *
*/
public void registerMBeans(final MBeanServer server) {
agent.registerMBeans(server);
@@ -68,7 +68,7 @@ public class JMXAgentContext {
/**
* Delegates invocation to JMX agent.
- * @see org.apache.aries.jmx.agent.JMXAgentl#registerMBean(MBeanHandler)
+ * @see org.apache.aries.jmx.agent.JMXAgent#registerMBean(MBeanHandler)
*/
public void registerMBean(final MBeanHandler mbeanData) {
agent.registerMBean(mbeanData);
@@ -76,7 +76,16 @@ public class JMXAgentContext {
/**
* Delegates invocation to JMX agent.
+ * @see org.apache.aries.jmx.agent.JMXAgent#unregisterMBean(MBeanHandler)
+ */
+ public void unregisterMBean(final MBeanHandler mBeanHandler) {
+ agent.unregisterMBean(mBeanHandler);
+ }
+
+ /**
+ * Delegates invocation to JMX agent.
* @see org.apache.aries.jmx.agent.JMXAgent#unregisterMBean(String)
+ * @deprecated
*/
public void unregisterMBean(final String name) {
agent.unregisterMBean(name);
Modified:
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentImpl.java
URL:
http://svn.apache.org/viewvc/aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentImpl.java?rev=1341868&r1=1341867&r2=1341868&view=diff
==============================================================================
---
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentImpl.java
(original)
+++
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentImpl.java
Wed May 23 14:06:29 2012
@@ -16,8 +16,8 @@
*/
package org.apache.aries.jmx.agent;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.HashMap;
+import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -62,7 +62,7 @@ public class JMXAgentImpl implements JMX
/**
* {@link MBeanHandler} store.
*/
- private Set<MBeanHandler> mbeansHandlers;
+ private Map<MBeanHandler, Boolean> mbeansHandlers;
private JMXAgentContext agentContext;
private Logger logger;
@@ -78,43 +78,43 @@ public class JMXAgentImpl implements JMX
*/
public JMXAgentImpl(Logger logger) {
this.logger = logger;
- this.mbeansHandlers = new HashSet<MBeanHandler>();
+ this.mbeansHandlers = new HashMap<MBeanHandler, Boolean>();
this.registrationExecutor = Executors.newSingleThreadExecutor(new
JMXThreadFactory("JMX OSGi Agent"));
}
/**
* @see org.apache.aries.jmx.agent.JMXAgent#start()
*/
- public void start() {
+ public synchronized void start() {
logger.log(LogService.LOG_INFO, "Starting JMX OSGi agent");
BundleContext bc = agentContext.getBundleContext();
MBeanHandler frameworkHandler = new FrameworkMBeanHandler(bc, logger);
+ mbeansHandlers.put(frameworkHandler, Boolean.FALSE);
frameworkHandler.open();
- mbeansHandlers.add(frameworkHandler);
MBeanHandler bundleStateHandler = new BundleStateMBeanHandler(bc,
logger);
+ mbeansHandlers.put(bundleStateHandler, Boolean.FALSE);
bundleStateHandler.open();
- mbeansHandlers.add(bundleStateHandler);
MBeanHandler revisionsStateHandler = new
BundleWiringStateMBeanHandler(bc, logger);
+ mbeansHandlers.put(revisionsStateHandler, Boolean.FALSE);
revisionsStateHandler.open();
- mbeansHandlers.add(revisionsStateHandler);
MBeanHandler serviceStateHandler = new ServiceStateMBeanHandler(bc,
logger);
+ mbeansHandlers.put(serviceStateHandler, Boolean.FALSE);
serviceStateHandler.open();
- mbeansHandlers.add(serviceStateHandler);
MBeanHandler packageStateHandler = new PackageStateMBeanHandler(bc,
logger);
+ mbeansHandlers.put(packageStateHandler, Boolean.FALSE);
packageStateHandler.open();
- mbeansHandlers.add(packageStateHandler);
MBeanHandler permissionAdminHandler = new
PermissionAdminMBeanHandler(agentContext);
+ mbeansHandlers.put(permissionAdminHandler, Boolean.FALSE);
permissionAdminHandler.open();
- mbeansHandlers.add(permissionAdminHandler);
MBeanHandler userAdminHandler = new
UserAdminMBeanHandler(agentContext);
+ mbeansHandlers.put(userAdminHandler, Boolean.FALSE);
userAdminHandler.open();
- mbeansHandlers.add(userAdminHandler);
MBeanHandler configAdminHandler = new
ConfigurationAdminMBeanHandler(agentContext);
+ mbeansHandlers.put(configAdminHandler, Boolean.FALSE);
configAdminHandler.open();
- mbeansHandlers.add(configAdminHandler);
MBeanHandler provServiceHandler = new
ProvisioningServiceMBeanHandler(agentContext);
+ mbeansHandlers.put(provServiceHandler, Boolean.FALSE);
provServiceHandler.open();
- mbeansHandlers.add(provServiceHandler);
mbeanServiceTracker = new MBeanServiceTracker(agentContext);
mbeanServiceTracker.open();
}
@@ -122,55 +122,60 @@ public class JMXAgentImpl implements JMX
/**
* @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);
+ public synchronized void registerMBeans(final MBeanServer server) {
+ for (MBeanHandler mbeanHandler : mbeansHandlers.keySet()) {
+ if (mbeansHandlers.get(mbeanHandler) == Boolean.FALSE) {
+ 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));
+ mbeansHandlers.put(mbeanHandler, Boolean.TRUE);
+ } 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) {
- try
- {
- String name = mBeanHandler.getName();
- StandardMBean mbean = mBeanHandler.getMbean();
- if (mbean != null) {
- 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);
- } catch (Exception e) {
- logger.log(LogService.LOG_ERROR, "Cannot unregister MBean: " +
mBeanHandler, e);
+ public synchronized void unregisterMBeans(final MBeanServer server) {
+ for (MBeanHandler mBeanHandler : mbeansHandlers.keySet()) {
+ if (mbeansHandlers.get(mBeanHandler) == Boolean.TRUE) {
+ try
+ {
+ String name = mBeanHandler.getName();
+ StandardMBean mbean = mBeanHandler.getMbean();
+ if (mbean != null) {
+ logger.log(LogService.LOG_INFO, "Unregistering " +
mbean.getMBeanInterface().getName()
+ + " to MBeanServer " + server + " with name " +
name);
+ server.unregisterMBean(new ObjectName(name));
+ mbeansHandlers.put(mBeanHandler, Boolean.FALSE);
+ }
+ } catch (MBeanRegistrationException e) {
+ logger.log(LogService.LOG_ERROR, "Can't unregister MBean",
e);
+ } catch (InstanceNotFoundException e) {
+ logger.log(LogService.LOG_ERROR, "MBean 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);
+ } catch (Exception e) {
+ logger.log(LogService.LOG_ERROR, "Cannot unregister MBean:
" + mBeanHandler, e);
+ }
}
}
}
@@ -178,7 +183,7 @@ public class JMXAgentImpl implements JMX
/**
* @see
org.apache.aries.jmx.agent.JMXAgent#registerMBean(org.apache.aries.jmx.MBeanHandler)
*/
- public void registerMBean(final MBeanHandler mBeanHandler) {
+ public synchronized 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");
@@ -193,6 +198,7 @@ public class JMXAgentImpl implements JMX
+ " to MBeanServer " + server + " with name " + name);
((MBeanServer) server).registerMBean(mbean, new
ObjectName(name));
+ mbeansHandlers.put(mBeanHandler, Boolean.TRUE);
} catch (InstanceAlreadyExistsException e) {
logger.log(LogService.LOG_ERROR, "MBean is already
registered", e);
} catch (MBeanRegistrationException e) {
@@ -208,16 +214,41 @@ public class JMXAgentImpl implements JMX
return;
}
}
+ }
+
+ /**
+ * @see
org.apache.aries.jmx.agent.JMXAgent#unregisterMBean(org.apache.aries.jmx.MBeanHandler)
+ */
+ public synchronized void unregisterMBean(final MBeanHandler mBeanHandler) {
+ Object[] servers = getMBeanServers();
+ for (Object server : servers) {
+ String name = mBeanHandler.getName();
+ try {
+ logger.log(LogService.LOG_INFO, "Unregistering mbean " + " to
MBeanServer " + server + " with name "
+ + name);
+ ((MBeanServer) server).unregisterMBean(new ObjectName(name));
+ mbeansHandlers.put(mBeanHandler, Boolean.FALSE);
+ } catch (MBeanRegistrationException e) {
+ logger.log(LogService.LOG_ERROR, "Can't register MBean", e);
+ } catch (InstanceNotFoundException e) {
+ logger.log(LogService.LOG_ERROR, "MBean 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#unregisterMBean(java.lang.String)
*/
- public void unregisterMBean(final String name) {
+ public synchronized 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);
@@ -225,7 +256,7 @@ public class JMXAgentImpl implements JMX
} 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);
+ logger.log(LogService.LOG_ERROR, "MBean 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;
@@ -233,17 +264,16 @@ public class JMXAgentImpl implements JMX
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() {
+ public synchronized void stop() {
logger.log(LogService.LOG_INFO, "Stopping JMX OSGi agent");
mbeanServiceTracker.close();
- for (MBeanHandler mBeanHandler : mbeansHandlers) {
+ for (MBeanHandler mBeanHandler : mbeansHandlers.keySet()) {
mBeanHandler.close();
}
if (registrationExecutor != null &&
!registrationExecutor.isShutdown()) {
Modified:
aries/trunk/sandbox/jmx-next/jmx-core/src/test/java/org/apache/aries/jmx/CompendiumHandlerTest.java
URL:
http://svn.apache.org/viewvc/aries/trunk/sandbox/jmx-next/jmx-core/src/test/java/org/apache/aries/jmx/CompendiumHandlerTest.java?rev=1341868&r1=1341867&r2=1341868&view=diff
==============================================================================
---
aries/trunk/sandbox/jmx-next/jmx-core/src/test/java/org/apache/aries/jmx/CompendiumHandlerTest.java
(original)
+++
aries/trunk/sandbox/jmx-next/jmx-core/src/test/java/org/apache/aries/jmx/CompendiumHandlerTest.java
Wed May 23 14:06:29 2012
@@ -112,7 +112,7 @@ public class CompendiumHandlerTest {
//service unget
verify(bundleContext).ungetService(reference);
//unregister is invoked on context
- verify(agentContext).unregisterMBean(name);
+ verify(agentContext).unregisterMBean(target);
}