Return-Path: Delivered-To: apmail-db-derby-commits-archive@www.apache.org Received: (qmail 14833 invoked from network); 28 Feb 2008 17:11:23 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 28 Feb 2008 17:11:23 -0000 Received: (qmail 3185 invoked by uid 500); 28 Feb 2008 17:11:18 -0000 Delivered-To: apmail-db-derby-commits-archive@db.apache.org Received: (qmail 3166 invoked by uid 500); 28 Feb 2008 17:11:18 -0000 Mailing-List: contact derby-commits-help@db.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: "Derby Development" List-Id: Delivered-To: mailing list derby-commits@db.apache.org Received: (qmail 3155 invoked by uid 99); 28 Feb 2008 17:11:18 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 28 Feb 2008 09:11:18 -0800 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 28 Feb 2008 17:10:52 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id F1F651A9832; Thu, 28 Feb 2008 09:11:01 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r632059 - in /db/derby/code/trunk/java: engine/org/apache/derby/impl/services/jmx/ engine/org/apache/derby/impl/services/jmxnone/ engine/org/apache/derby/mbeans/ testing/org/apache/derbyTesting/functionTests/tests/management/ Date: Thu, 28 Feb 2008 17:10:58 -0000 To: derby-commits@db.apache.org From: djd@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080228171101.F1F651A9832@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: djd Date: Thu Feb 28 09:10:55 2008 New Revision: 632059 URL: http://svn.apache.org/viewvc?rev=632059&view=rev Log: DERBY-3466 Add a system identifier to the ObjectName of MBeans registered by Derby to allow disambiguating Derby's MBeans when multiple systems are loaded through different class loaders. Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/services/jmx/JMXManagementService.java db/derby/code/trunk/java/engine/org/apache/derby/impl/services/jmxnone/NoManagementService.java db/derby/code/trunk/java/engine/org/apache/derby/mbeans/JDBCMBean.java db/derby/code/trunk/java/engine/org/apache/derby/mbeans/Management.java db/derby/code/trunk/java/engine/org/apache/derby/mbeans/ManagementMBean.java db/derby/code/trunk/java/engine/org/apache/derby/mbeans/VersionMBean.java db/derby/code/trunk/java/engine/org/apache/derby/mbeans/package.html db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/JMXTest.java db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/MBeanTest.java db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/ManagementMBeanTest.java db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/VersionMBeanTest.java Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/services/jmx/JMXManagementService.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/services/jmx/JMXManagementService.java?rev=632059&r1=632058&r2=632059&view=diff ============================================================================== --- db/derby/code/trunk/java/engine/org/apache/derby/impl/services/jmx/JMXManagementService.java (original) +++ db/derby/code/trunk/java/engine/org/apache/derby/impl/services/jmx/JMXManagementService.java Thu Feb 28 09:10:55 2008 @@ -18,6 +18,7 @@ package org.apache.derby.impl.services.jmx; import java.lang.management.ManagementFactory; +import java.security.AccessControlException; import java.security.AccessController; import java.security.PrivilegedAction; import java.security.PrivilegedActionException; @@ -42,6 +43,7 @@ import org.apache.derby.iapi.services.property.PropertyUtil; import org.apache.derby.mbeans.ManagementMBean; import org.apache.derby.mbeans.VersionMBean; +import org.apache.derby.security.SystemPermission; /** * This class implements the ManagementService interface and provides a simple @@ -79,6 +81,14 @@ private ObjectName myManagementBean; private MBeanServer myManagementServer; + + /** + * Runtime value to disambiguate + * multiple Derby systems in the same virtual machine but + * different class loaders. Set as the system attribute in + * the ObjectName for all MBeans registered. + */ + private String systemIdentifier; public JMXManagementService() { @@ -98,6 +108,9 @@ registeredMbeans = new HashMap(); + systemIdentifier = + Monitor.getMonitor().getUUIDFactory().createUUID().toString(); + findServer(); myManagementBean = (ObjectName) registerMBean(this, @@ -186,7 +199,8 @@ try { final ObjectName beanName = new ObjectName( - DERBY_JMX_DOMAIN + ":" + keyProperties); + DERBY_JMX_DOMAIN + ":" + keyProperties + + ",system=" + systemIdentifier); final StandardMBean standardMBean = new StandardMBean(bean, beanInterface) { @@ -307,6 +321,8 @@ if (registeredMbeans == null) return; + checkJMXControl(); + // Already active? if (isManagementActive()) return; @@ -339,6 +355,8 @@ if (registeredMbeans == null) return; + checkJMXControl(); + if (isManagementActive()) { for (ObjectName mbeanName : registeredMbeans.keySet()) { @@ -351,5 +369,22 @@ } mbeanServer = null; } + } + + private void checkJMXControl() { + /* FUTURE DERBY-3462 + try { + AccessController.checkPermission(new SystemPermission("jmxControl")); + } catch (AccessControlException e) { + // Need to throw a simplified version as AccessControlException + // will have a reference to Derby's SystemPermission which most likely + // will not be available on the client. + throw new SecurityException(e.getMessage()); + } + */ + } + + public String getSystemIdentifier() { + return systemIdentifier; } } Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/services/jmxnone/NoManagementService.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/services/jmxnone/NoManagementService.java?rev=632059&r1=632058&r2=632059&view=diff ============================================================================== --- db/derby/code/trunk/java/engine/org/apache/derby/impl/services/jmxnone/NoManagementService.java (original) +++ db/derby/code/trunk/java/engine/org/apache/derby/impl/services/jmxnone/NoManagementService.java Thu Feb 28 09:10:55 2008 @@ -41,4 +41,7 @@ } public void stopManagement() { } + public String getSystemIdentifier() { + return null; + } } Modified: db/derby/code/trunk/java/engine/org/apache/derby/mbeans/JDBCMBean.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/mbeans/JDBCMBean.java?rev=632059&r1=632058&r2=632059&view=diff ============================================================================== --- db/derby/code/trunk/java/engine/org/apache/derby/mbeans/JDBCMBean.java (original) +++ db/derby/code/trunk/java/engine/org/apache/derby/mbeans/JDBCMBean.java Thu Feb 28 09:10:55 2008 @@ -26,7 +26,8 @@ *

* Key properties for registered MBean: *

    - *
  • type=JDBC + *
  • type=JDBC + *
  • system=runtime system identifier (see overview) *
*/ public interface JDBCMBean { Modified: db/derby/code/trunk/java/engine/org/apache/derby/mbeans/Management.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/mbeans/Management.java?rev=632059&r1=632058&r2=632059&view=diff ============================================================================== --- db/derby/code/trunk/java/engine/org/apache/derby/mbeans/Management.java (original) +++ db/derby/code/trunk/java/engine/org/apache/derby/mbeans/Management.java Thu Feb 28 09:10:55 2008 @@ -73,4 +73,15 @@ return false; return mgmtService.isManagementActive(); } + + /** + * Return the system identifier that this MBean is managing. + * @see ManagementMBean#getSystemIdentifier() + */ + public String getSystemIdentifier() { + ManagementMBean mgmtService = getManagementService(); + if (mgmtService == null) + return null; + return mgmtService.getSystemIdentifier(); + } } Modified: db/derby/code/trunk/java/engine/org/apache/derby/mbeans/ManagementMBean.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/mbeans/ManagementMBean.java?rev=632059&r1=632058&r2=632059&view=diff ============================================================================== --- db/derby/code/trunk/java/engine/org/apache/derby/mbeans/ManagementMBean.java (original) +++ db/derby/code/trunk/java/engine/org/apache/derby/mbeans/ManagementMBean.java Thu Feb 28 09:10:55 2008 @@ -33,10 +33,12 @@ *

* Key properties for registered MBean when registered by Derby: *

    - *
  • type=Management + *
  • type=Management + *
  • system=runtime system identifier (see overview) *
* * @see Management + * @see ManagementMBean#getSystemIdentifier() */ public interface ManagementMBean { @@ -47,6 +49,15 @@ * registered any beans. */ public boolean isManagementActive(); + + /** + * Get the system identifier that this MBean is managing. + * The system identifier is a runtime value to disambiguate + * multiple Derby systems in the same virtual machine but + * different class loaders. + * @return Runtime identifier for the system, null if Derby is not running. + */ + public String getSystemIdentifier(); /** * Inform Derby to start its JMX management by registering Modified: db/derby/code/trunk/java/engine/org/apache/derby/mbeans/VersionMBean.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/mbeans/VersionMBean.java?rev=632059&r1=632058&r2=632059&view=diff ============================================================================== --- db/derby/code/trunk/java/engine/org/apache/derby/mbeans/VersionMBean.java (original) +++ db/derby/code/trunk/java/engine/org/apache/derby/mbeans/VersionMBean.java Thu Feb 28 09:10:55 2008 @@ -32,8 +32,9 @@ *

* Key properties for registered MBean: *

    - *
  • type=Version - *
  • jar={derby.jar|derbynet.jar} + *
  • type=Version + *
  • jar={derby.jar|derbynet.jar} + *
  • system=runtime system identifier (see overview) *
*/ public interface VersionMBean { Modified: db/derby/code/trunk/java/engine/org/apache/derby/mbeans/package.html URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/mbeans/package.html?rev=632059&r1=632058&r2=632059&view=diff ============================================================================== --- db/derby/code/trunk/java/engine/org/apache/derby/mbeans/package.html (original) +++ db/derby/code/trunk/java/engine/org/apache/derby/mbeans/package.html Thu Feb 28 09:10:55 2008 @@ -21,8 +21,20 @@ a number of MBeans to monitor and manage Derby.

Derby registers its JMX MBeans in the org.apache.derby domain and -always includes a value for type in the MBean's ObjectName's key +always includes values for type and system in the MBean's ObjectName's key properties. Other key properties are described in the interface class for the MBean. +

    +
  • type Set to the class name of the MBean's interface class without +the package and without MBean. E.g. for org.apache.derby.mbeans.VersionMBean +the key property type will be set to Version. The javadoc for each MBean +also indicates what type will be set to. +
  • system Set to a runtime identifier that allows Derby and applications +to disambiguate multiple Derby systems in the same virtual machine but different class loaders. +Currently a new value is created each time Derby is booted. An application may discover the +value of the identifier by registering the MBean org.apache.derby.mbeans.Management +and accessing the SystemIdentifier. This application created ManagementMBean +must be running in the same class loader as Derby. +

Derby registers the class name for any MBean to be the interface class for the MBean (i.e. org.apache.derby.mbeans.*MBean) to hide the implementation class Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/JMXTest.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/JMXTest.java?rev=632059&r1=632058&r2=632059&view=diff ============================================================================== --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/JMXTest.java (original) +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/JMXTest.java Thu Feb 28 09:10:55 2008 @@ -21,11 +21,15 @@ package org.apache.derbyTesting.functionTests.tests.management; +import java.net.URL; +import java.net.URLClassLoader; +import java.sql.SQLException; import java.util.Set; import javax.management.MBeanInfo; import javax.management.MBeanServerConnection; import javax.management.ObjectName; +import javax.sql.DataSource; import junit.framework.Test; @@ -71,6 +75,15 @@ // Is the class name in the public api assertTrue(mbeanClassName.startsWith("org.apache.derby.mbeans.")); + // See if it was the application created ManagementMBean + // This will have the implementation class registered + // as the class name since it is not registered by Derby. + if ("Management".equals(type) + && "org.apache.derby.mbeans.Management".equals(mbeanClassName)) + { + continue; + } + // and is a Derby specific MBean. assertTrue(mbeanClassName.endsWith("MBean")); Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/MBeanTest.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/MBeanTest.java?rev=632059&r1=632058&r2=632059&view=diff ============================================================================== --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/MBeanTest.java (original) +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/MBeanTest.java Thu Feb 28 09:10:55 2008 @@ -23,6 +23,7 @@ import java.io.InputStream; import java.util.ArrayList; +import java.util.Hashtable; import java.util.Set; import javax.management.MBeanServerConnection; @@ -225,6 +226,24 @@ } return mgmtObjName; + } + + /** + * Get the ObjectName for an MBean registered by Derby for a set of + * key properties. The ObjectName has the org.apache.derby and + * the key property system will be set to the system identifier + * for the Derby system under test (if Derby is running). + * @param keyProperties Set of key properties, may be modified by this call. + * @return ObjectName to access MBean. + */ + protected ObjectName getDerbyMBeanName(Hashtable keyProperties) + throws Exception + { + String systemIdentifier = (String) + getAttribute(getApplicationManagementMBean(), "SystemIdentifier"); + if (systemIdentifier != null) + keyProperties.put("system", systemIdentifier); + return new ObjectName("org.apache.derby", keyProperties); } /** Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/ManagementMBeanTest.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/ManagementMBeanTest.java?rev=632059&r1=632058&r2=632059&view=diff ============================================================================== --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/ManagementMBeanTest.java (original) +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/ManagementMBeanTest.java Thu Feb 28 09:10:55 2008 @@ -79,9 +79,11 @@ invokeOperation(mbean, "stopManagement"); assertBooleanAttribute(false, mbean, "ManagementActive"); - // leaving only management MBeans. + // leaving only management MBeans, the one registered + // by this test and the one registered by Derby + // (which has the system key property). Set managementOnly = getDerbyDomainMBeans(); - assertEquals(1, managementOnly.size()); + assertEquals(2, managementOnly.size()); for (ObjectName name : managementOnly) { assertEquals("Management", name.getKeyProperty("type")); Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/VersionMBeanTest.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/VersionMBeanTest.java?rev=632059&r1=632058&r2=632059&view=diff ============================================================================== --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/VersionMBeanTest.java (original) +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/VersionMBeanTest.java Thu Feb 28 09:10:55 2008 @@ -74,13 +74,13 @@ * @throws MalformedObjectNameException if the object name is not valid */ private ObjectName getDerbyJarObjectName() - throws MalformedObjectNameException { + throws Exception { // get a reference to the VersionMBean instance for derby.jar Hashtable keyProps = new Hashtable(); keyProps.put("type", "Version"); keyProps.put("jar", "derby.jar"); - return new ObjectName("org.apache.derby", keyProps); + return getDerbyMBeanName(keyProps); } //