You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2014/04/25 07:34:12 UTC
[14/51] [partial] BlazeDS Donation from Adobe Systems Inc
http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/7a58369c/modules/core/build.xml
----------------------------------------------------------------------
diff --git a/modules/core/build.xml b/modules/core/build.xml
new file mode 100755
index 0000000..8812542
--- /dev/null
+++ b/modules/core/build.xml
@@ -0,0 +1,244 @@
+<?xml version="1.0"?>
+<!--
+
+ 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.
+
+-->
+<project name="modules/core/build.xml" default="main" basedir="../..">
+
+ <!-- properties -->
+ <property file="${basedir}/build.properties"/>
+ <property name="module.dir" value="${basedir}/modules/core"/>
+ <property name="test.dir" value="${module.dir}/test/src"/>
+
+ <!-- to exclude tests, add test.excludes to local.properties -->
+ <property file="${test.dir}/local.properties"/>
+ <!-- Set up feature to can run subset of tests -->
+ <property file="${qa.dir}/features/${feature}.properties" /> <!-- includes only feature -->
+ <property file="${qa.dir}/features/full.properties" /> <!-- includes all filesets -->
+
+ <property name="lib.dir" value="${basedir}/lib"/>
+ <property name="module.lib.dir" location="${module.dir}/lib"/>
+ <property name="tomcat.lib.dir" location="${basedir}/servers/apache-tomcat-6.0.29/lib" />
+ <property name="module.src" value="${module.dir}/src"/>
+ <property name="module.classes" value="${module.dir}/classes"/>
+ <property name="module.jar" value="${lib.dir}/flex-messaging-core.jar"/>
+ <property name="module.test.src" value="${module.dir}/test/src"/>
+ <property name="module.test.classes" value="${module.dir}/test/classes"/>
+ <property name="module.dist.dir" value="${basedir}/dist/source"/>
+ <property name="common.src" value="${basedir}/modules/common/src"/>
+
+ <property name="remoting.src" value="${basedir}/modules/remoting/src"/>
+ <property name="proxy.src" value="${basedir}/modules/proxy/src"/>
+ <property name="opt.src" value="${basedir}/modules/opt/src"/>
+
+ <property name="build.number" value=""/>
+
+ <!-- j2ee apis required to compile -->
+ <path id="classpath">
+ <fileset dir="${lib.dir}" includes="**/*.jar"/>
+ <fileset dir="${module.lib.dir}" includes="**/*.jar"/>
+ <fileset dir="${tomcat.lib.dir}" includes="**/*.jar"/>
+ </path>
+
+ <path id="test.classpath">
+ <fileset dir="${lib.dir}" includes="**/*.jar" excludes="adt.jar" />
+ <pathelement location="${module.test.classes}"/>
+ </path>
+
+ <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
+
+ <target name="main" depends="clean,prepare,run-depend,jar" description="cleans and runs the full build"/>
+ <target name="dev" depends="prepare,run-depend,jar" description="runs src.depend build for development"/>
+
+ <target name="prepare">
+ <mkdir dir="${lib.dir}"/>
+ <mkdir dir="${module.classes}"/>
+ </target>
+
+ <target name="run-depend" if="src.depend">
+ <echo message="Removing class files that changed and dependent class files."/>
+ <depend cache="${module.classes}" srcdir="${module.src}" destdir="${module.classes}"/>
+ </target>
+
+ <target name="compile" depends="prepare" description="compile">
+ <javac debug="${src.debug}" destdir="${module.classes}"
+ srcdir="${module.src}" classpathref="classpath" >
+ <include name="**/*.java" />
+ <exclude name="flex/messaging/cluster/JGroupsCluster.java" />
+ <exclude name="flex/messaging/cluster/ClusterNode.java" />
+ <exclude name="flex/messaging/cluster/ClusterMembershipListener.java" />
+ </javac>
+ <echo file="${module.classes}/flex/messaging/version.properties" append="false">build=${build.number}</echo>
+
+ <copy todir="${module.classes}/flex/messaging" overwrite="true">
+ <fileset dir="${module.src}/flex/messaging" includes="*.properties"/>
+ </copy>
+ <copy toDir="${module.classes}" file="${module.dir}/AdobeInfo.xml" />
+ </target>
+
+ <!-- only compile jgroups code if jgroups present -->
+ <condition property="jgroups.available">
+ <available classname="org.jgroups.Channel" classpathref="classpath"/>
+ </condition>
+
+ <target name="compile-jgroups" depends="prepare" if="jgroups.available">
+ <echo >-== Found JGroups, compiling JGroups cluster implementation ==-</echo>
+ <javac debug="${src.debug}" destdir="${module.classes}" srcdir="${module.src}"
+ classpathref="classpath" >
+ <include name= "flex/messaging/cluster/JGroupsCluster.java" />
+ <include name= "flex/messaging/cluster/ClusterNode.java" />
+ <include name= "flex/messaging/cluster/ClusterMembershipListener.java" />
+ </javac>
+ </target>
+
+ <!-- jar containing messaging core infrastructure -->
+ <target name="jar" depends="compile,compile-jgroups">
+
+ <jar destfile="${module.jar}" basedir="${module.classes}">
+ <include name="AdobeInfo.xml"/>
+ <include name="flex/management/**"/>
+ <include name="flex/messaging/**"/>
+ <include name="flex/core/**"/>
+ <exclude name=".dependency-info/**"/>
+ <manifest>
+ <attribute name="Sealed" value="${manifest.sealed}"/>
+ <attribute name="Implementation-Title" value="${manifest.Implementation-Title} - Community Edition"/>
+ <attribute name="Implementation-Version" value="${manifest.Implementation-Version}.${build.number}"/>
+ <attribute name="Implementation-Vendor" value="${manifest.Implementation-Vendor}"/>
+ </manifest>
+ </jar>
+
+ <delete failonerror="false">
+ <fileset dir="${module.classes}/flex/messaging" includes="*.properties"/>
+ </delete>
+
+ </target>
+
+ <target name="clean" description="clean">
+ <delete file="${module.jar}" failonerror="false"/>
+ <delete failonerror="false" includeEmptyDirs="true">
+ <fileset dir="${module.classes}">
+ <include name="**/*"/>
+ <exclude name="dependencies.txt"/>
+ <exclude name=".dependency-info/**"/>
+ </fileset>
+ </delete>
+ <delete dir="${module.test.classes}" failonerror="false" includeEmptyDirs="true"/>
+ <delete dir="${module.classes}" failonerror="false" includeEmptyDirs="true"/>
+ </target>
+
+ <!-- only run unit tests if junit present -->
+ <condition property="junit.available">
+ <available file="${junit.jar}" />
+ </condition>
+
+ <target name="startserver" description="Start Tomcat Server">
+ <ant antfile="${basedir}/build.xml" target="startserver"/>
+ </target>
+
+ <target name="stopserver" description="Stop Tomcat Server">
+ <ant antfile="${basedir}/build.xml" target="stopserver"/>
+ </target>
+
+ <target name="waitforAppserverToStart">
+ <ant antfile="${basedir}/build.xml" target="waitforAppserverToStart"/>
+ </target>
+
+ <target name="unit" depends="startserver, waitforAppserverToStart, runtests, stopserver, check-test-results" description="runs unit tests">
+ <if>
+ <not>
+ <equals arg1="${junit.available}" arg2="true"/>
+ </not>
+ <then>
+ <echo>Unit test can not be run as junit.jar was not found in ${ant.home}/lib. See http://www.junit.org</echo>
+ </then>
+ </if>
+ </target>
+
+ <target name="compile-tests" if="junit.available">
+ <echo message="Compiling test code..."/>
+ <mkdir dir="${module.test.classes}"/>
+
+ <javac srcdir="${module.test.src}" destdir="${module.test.classes}" debug="true">
+ <classpath refid="classpath"/>
+ </javac>
+
+ <copy todir="${module.test.classes}">
+ <fileset dir="${module.test.src}" includes="**/*.xml,**/*.xsd"/>
+ </copy>
+ </target>
+
+ <target name="runtests" depends="compile-tests" if="junit.available">
+ <junit printsummary="yes" dir="${test.dir}" fork="yes" maxmemory="1024m" timeout="90000" showoutput="yes"
+ haltonerror="false"
+ haltonfailure="false"
+ failureproperty="test-failed">
+ <sysproperty key="royale.home" value="${basedir}"/>
+ <classpath refid="test.classpath"/>
+ <formatter type="xml" usefile="true"/>
+ <batchtest fork="yes">
+ <fileset dir="${module.test.src}"
+ includes="${junit.core.includes}"
+ excludes="${junit.core.excludes}"/>
+ </batchtest>
+ </junit>
+ </target>
+
+ <!-- If one of more unit tests fail, runtests sets unit-test-failed property
+ which gets checked by this target and reported
+ -->
+ <target name="check-test-results">
+ <fail if="test-failed" message="One or more unit tests failed."/>
+ </target>
+
+ <target name="javadoc">
+
+ <path id="javadoc.classpath">
+ <path refid="classpath"/>
+ <fileset dir="${basedir}/modules/opt/lib" includes="*.jar" excludes="catalina-708.jar"/>
+ </path>
+
+ <mkdir dir="${basedir}/docs"/>
+ <mkdir dir="${basedir}/docs/api"/>
+ <javadoc
+ access="public"
+ destdir="${basedir}/docs/api"
+ doclet="ExcludeDoclet"
+ docletpathref="javadoc.classpath"
+ author="false"
+ version="true"
+ use="true"
+ sourcePath="${common.src};${module.src};${remoting.src};${proxy.src};${opt.src}/jrun;${opt.src}/oracle;${opt.src}/tomcat;${opt.src}/weblogic;${opt.src}/websphere"
+ classpathref="javadoc.classpath"
+ packageNames="flex.*"
+ failonerror="true"
+ windowtitle="${manifest.Implementation-Title} - Public APIs">
+
+ <doctitle><![CDATA[<h1>${manifest.Implementation-Title} - Public APIs</h1><h2>Build: ${manifest.Implementation-Version}.${build.number}</h2>]]></doctitle>
+ <bottom><![CDATA[<i>Copyright © 2008 Adobe Systems Inc. All Rights Reserved.</i>]]></bottom>
+ <group title="Messaging APIs" packages="flex.messaging:flex.messaging.services"/>
+ <group title="AMF Serialization APIs" packages="flex.messaging.io.amf"/>
+ <group title="Logging and Debugging APIs" packages="flex.messaging.log"/>
+ <group title="Configuration APIs" packages="flex.messaging.config:flex.messaging.security"/>
+ <group title="Management APIs" packages="flex.management, flex.management.jmx, flex.management.runtime.*"/>
+ <link offline="false" href="http://java.sun.com/j2se/1.5.0/docs/api/" packagelistLoc="C:\tmp"/>
+</javadoc>
+ <zip destfile="${basedir}/docs/javadoc.zip" basedir="${basedir}/docs/api" />
+</target>
+
+</project>
+
http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/7a58369c/modules/core/pom.xml
----------------------------------------------------------------------
diff --git a/modules/core/pom.xml b/modules/core/pom.xml
new file mode 100755
index 0000000..8488733
--- /dev/null
+++ b/modules/core/pom.xml
@@ -0,0 +1,101 @@
+<!--
+
+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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>com.adobe.blazeds</groupId>
+ <artifactId>blazeds</artifactId>
+ <version>4.5.0.0-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>flex-messaging-core</artifactId>
+ <name>${project.artifactId}</name>
+ <description>${project.groupId} ${project.artifactId}</description>
+
+ <dependencies>
+ <dependency>
+ <groupId>com.adobe.blazeds</groupId>
+ <artifactId>flex-messaging-common</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>jgroups</groupId>
+ <artifactId>jgroups</artifactId>
+ <version>2.9.0.GA</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ <version>2.5</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>javax.jms</groupId>
+ <artifactId>jms</artifactId>
+ <version>1.1</version>
+ <scope>provided</scope>
+ </dependency>
+
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.2</version>
+ <scope>test</scope>
+ </dependency>
+
+
+ </dependencies>
+
+ <build>
+ <sourceDirectory>src</sourceDirectory>
+ <testSourceDirectory>test/src</testSourceDirectory>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>javacc-maven-plugin</artifactId>
+ <version>2.5</version>
+ <executions>
+ <execution>
+ <phase>generate-sources</phase>
+ <id>javacc</id>
+ <goals>
+ <goal>javacc</goal>
+ </goals>
+ <configuration>
+ <sourceDirectory>${project.build.sourceDirectory}</sourceDirectory>
+ <outputDirectory>${project.build.sourceDirectory}</outputDirectory>
+ <!--
+ it will generate the source in the same folder, the generated
+ files need to be added to .svn:ignore
+ -->
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/7a58369c/modules/core/src/flex/management/BaseControl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/flex/management/BaseControl.java b/modules/core/src/flex/management/BaseControl.java
new file mode 100755
index 0000000..321649f
--- /dev/null
+++ b/modules/core/src/flex/management/BaseControl.java
@@ -0,0 +1,512 @@
+/*
+ * 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 flex.management;
+
+import flex.management.runtime.AdminConsoleDisplayRegistrar;
+import flex.messaging.FlexContext;
+
+import java.util.Date;
+import java.util.List;
+import java.util.ArrayList;
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.InstanceNotFoundException;
+import javax.management.MalformedObjectNameException;
+import javax.management.MBeanRegistration;
+import javax.management.MBeanRegistrationException;
+import javax.management.MBeanServer;
+import javax.management.NotCompliantMBeanException;
+import javax.management.ObjectName;
+import javax.servlet.ServletConfig;
+
+/**
+ * The implementation of the <code>BaseControlMBean</code> interface. This
+ * abstract class provides the core functionality that all Flex control MBeans
+ * require.
+ * <p>
+ * Defining concrete implementations of <code>getId()</code> and
+ * <code>getType()</code> are left to subclasses, but this base class does
+ * provide access to the parent MBean for each instance. This class also
+ * implements the <code>MBeanRegistration</code> interface, and it
+ * automatically stores a reference to the MBean server in each instance upon
+ * registration. Subclasses may choose to override none, any, or all of the
+ * methods defined by the <code>MBeanRegistration</code> interface, but any
+ * overrides should be sure to invoke the overridden method with a call to their
+ * superclass.
+ * </p><p>
+ * The <code>register()</code> method provides a simple and consistent way to
+ * register instances with the MBean server, and the
+ * <code>getObjectName()</code> method gaurantees consistent, well-formed
+ * <code>ObjectName</code>s for all MBean instances.</p>
+ *
+ * @author shodgson
+ */
+public abstract class BaseControl implements BaseControlMBean,
+ MBeanRegistration
+{
+ /**
+ * The prefix used for the domain part of control MBean names.
+ */
+ public static final String DOMAIN_PREFIX = "flex.runtime";
+ private static final int MALFORMED_OBJECTNAME = 10400;
+ private static final int UNREG_EXCEPTION = 10401;
+ private static final int UNREG_NOTFOUND = 10402;
+ private static final int REG_EXCEPTION = 10403;
+ private static final int REG_ALREADYEXISTS = 10404;
+ private static final int REG_NOTCOMPLIANT = 10405;
+ private static final int DISABLE_MANAGEMENT = 10426;
+
+ protected Date startTimestamp;
+ private BaseControl parent;
+ private ObjectName objectName;
+ private ObjectName registeredObjectName;
+ private MBeanServer server;
+ private boolean registered = false;
+
+ private AdminConsoleDisplayRegistrar registrar;
+
+ // Implements flex.management.BaseControlMBean.getId; inherits javadoc
+ // specification.
+ public abstract String getId();
+
+ // Implements flex.management.BaseControlMBean.getType; inherits javadoc
+ // specification.
+ public abstract String getType();
+
+ // Implements flex.management.BaseControlMBean.getParent; inherits javadoc
+ // specification.
+ public final ObjectName getParent()
+ {
+ return (parent != null) ? parent.getObjectName() : null;
+ }
+
+ /**
+ * Returns an identifier for the application that hosts the component that
+ * this control manages.
+ *
+ * @return An identifier for the application that hosts the component this
+ * control manages.
+ */
+ public String getApplicationId()
+ {
+ String id = null;
+ // Our base implementation attempts to use the current servlet context
+ // name as our application identifier.
+ ServletConfig config = FlexContext.getServletConfig();
+ if (config != null)
+ {
+ id = config.getServletContext().getServletContextName();
+ }
+ return (id != null) ? id.replace(":", "") : "";
+ }
+
+ /**
+ * Set the register object.
+ * @param registar the registrar to set
+ */
+ protected void setRegistrar(AdminConsoleDisplayRegistrar registrar)
+ {
+ this.registrar = registrar;
+ }
+
+ /**
+ * Return the registar object.
+ * @return the registrar
+ */
+ public AdminConsoleDisplayRegistrar getRegistrar()
+ {
+ if ((parent == null) && (this.registrar == null))
+ {
+ return new AdminConsoleDisplayRegistrar(null);
+ }
+
+ return (this.registrar != null) ? this.registrar : parent.getRegistrar();
+ }
+
+ /**
+ * Constructs a <code>BaseControl</code> instance that references its
+ * parent; the parent may be null for root control MBeans.
+ *
+ * @param parent The parent <code>BaseControl</code> for this instance or
+ * null if this instance is the root of a control hierarchy.
+ */
+ public BaseControl(BaseControl parent)
+ {
+ this.parent = parent;
+ }
+
+ /**
+ * Returns the parent <code>BaseControl</code> of this instance.
+ *
+ * @return The parent <code>BaseControl</code>.
+ */
+ public final BaseControl getParentControl()
+ {
+ return parent;
+ }
+
+ /**
+ * The <code>MBeanServer</code> that this instance is registered with. If
+ * this instance has not been registered this method returns
+ * <code>null</code>.
+ *
+ * @return The <code>MBeanServer</code> that this instance is registered
+ * with.
+ */
+ public final MBeanServer getMBeanServer()
+ {
+ return server;
+ }
+
+ /**
+ * Registers this instance with the MBean server.
+ *
+ * It may throw ManagementException If an <code>MBeanRegistrationException</code>
+ * or <code>InstanceAlreadyExistsException</code> is thrown while
+ * registering this MBean, the typed exception is wrapped in a
+ * runtime <code>ManagementException</code> and rethrown.
+ */
+ public final void register()
+ {
+ if (!registered)
+ {
+ MBeanServer server = MBeanServerLocatorFactory.getMBeanServerLocator().getMBeanServer();
+ ObjectName name = getObjectName();
+ try
+ {
+ if (server.isRegistered(name))
+ {
+ server.unregisterMBean(name);
+ }
+
+ registeredObjectName = server.registerMBean(this, name).getObjectName();
+ registered = true;
+ onRegistrationComplete();
+
+ }
+ catch (ManagementException me)
+ {
+ throw me;
+ }
+ catch (MBeanRegistrationException mre)
+ {
+ // Rethrow with useful message if this ever happens.
+ ManagementException me = new ManagementException();
+ me.setMessage(REG_EXCEPTION, new Object[] {name.toString()});
+ me.setRootCause(mre);
+ throw me;
+ }
+ catch (InstanceAlreadyExistsException iaee)
+ {
+ // If registration is not working at all, inform the user that
+ // they may
+ // work around the issue by disabling management (no MBeans will
+ // be registered).
+ if (!server.isRegistered(name))
+ {
+ ManagementException me = new ManagementException();
+ me.setMessage(DISABLE_MANAGEMENT, new Object[] {name.toString()});
+ throw me;
+ }
+ else
+ {
+ // Rethrow with useful message if this ever happens.
+ ManagementException me = new ManagementException();
+ me.setMessage(REG_ALREADYEXISTS, new Object[] {name.toString()});
+ throw me;
+ }
+ }
+ catch (NotCompliantMBeanException ncme)
+ {
+ // Rethrow with useful message if this ever happens.
+ ManagementException me = new ManagementException();
+ me.setMessage(REG_NOTCOMPLIANT, new Object[] {name.toString()});
+ throw me;
+ }
+ catch (InstanceNotFoundException infe)
+ {
+ // Rethrow with useful message if this ever happens.
+ ManagementException me = new ManagementException();
+ me.setMessage(UNREG_NOTFOUND, new Object[] {name.toString()});
+ throw me;
+ }
+ }
+ }
+
+ /**
+ * This method is called after the MBean has been registered and after the
+ * MBean server has returned the registeredObjectName. Classes that need
+ * access to the actual Object name should override this method rather than
+ * the postRegister method.
+ */
+ protected void onRegistrationComplete()
+ {
+
+ }
+
+ /**
+ * Unregisters this instance from the MBean server if it has been registered
+ * previously.
+ */
+ public final void unregister()
+ {
+ if (registered)
+ {
+ // This method may be called when the JVM is being unloaded, so if
+ // our
+ // external error strings are loaded as missing, fall back to
+ // hard-coded
+ // strings.
+ try
+ {
+ if (server.isRegistered(registeredObjectName))
+ {
+ server.unregisterMBean(registeredObjectName);
+ }
+
+ registeredObjectName = null;
+ registered = false;
+ }
+ catch (ManagementException me)
+ {
+ throw me;
+ }
+ catch (MBeanRegistrationException mre)
+ {
+ // Rethrow with useful message if this ever happens.
+ ManagementException me = new ManagementException();
+ me.setMessage(UNREG_EXCEPTION, new Object[] {registeredObjectName.toString()});
+ if (me.getMessage().indexOf(Integer.toString(UNREG_EXCEPTION)) != -1)
+ {
+ me.setMessage("The MBean named, '" + registeredObjectName.toString() + "', could not be unregistered because its preDeregister() method threw an exception.");
+ }
+ me.setRootCause(mre);
+ throw me;
+ }
+ catch (InstanceNotFoundException infe)
+ {
+ // Rethrow with useful message if this ever happens.
+ ManagementException me = new ManagementException();
+ me.setMessage(UNREG_NOTFOUND, new Object[] {registeredObjectName.toString()});
+ if (me.getMessage().indexOf(Integer.toString(UNREG_NOTFOUND)) != -1)
+ {
+ me.setMessage("The MBean named, '" + registeredObjectName.toString() + "', could not be unregistered because it is not currently registered.");
+ }
+ throw me;
+ }
+ }
+ }
+
+ /**
+ * Returns the <code>ObjectName</code> for this instance, according to the
+ * following format:
+ * <code>{domain}[&#46;{appId}]:type={type}[&#44;{parent type}={parent id}]*[&#44;server={server}]&#63;&#44;id={id}</code>.
+ * <ul>
+ * <li><code>domain</code>: The domain specified by the DOMAIN_PREFIX
+ * constant followed by the application identifier if one is available.</li>
+ * <li><code>type</code>: The short type name of the resource managed by
+ * the MBean.<br /> - The <code>MessageBrokerControlMBean</code> manages
+ * the <code>flex.messaging.MessageBroker</code> so:
+ * <code>type=MessageBroker</code> </li>
+ * <li><code>id</code>: The id value for the resource managed by this
+ * MBean. If no name or id is available on the resource, an id will be
+ * fabricated according to this strategy:<br />
+ * <em>id = {type} + N</em> (where N is a numeric increment for instances
+ * of this type) </li>
+ * <li>* optional containment keys</li>
+ * </ul>
+ * The runtime MBean model is hierarchical, with all MBeans ultimately
+ * contained by the root <code>MessageBrokerControlMBean</code>. The
+ * <code>ObjectName</code>s used for these MBeans describe this
+ * containment in the following fashion. First, the 'type' key for a
+ * contained MBean indicates the containment hierarchy for the bean. So, the
+ * <code>ObjectName</code> for an <code>RTMPEndpointControlMBean</code>
+ * would be: <code>type=MessageBroker.RTMPEndpoint</code><br />
+ * In addition to the hierarchical 'type' key, the full
+ * <code>ObjectName</code> for this <code>RTMPEndpointControlMBean</code>
+ * also contains a containment key:
+ * <code>MessageBroker=MessageBroker1</code><br />
+ * Optional containment keys have the format:
+ * <em>{parent type}={parent name}</em>. A containment key is added for
+ * each ancestor up to the root of the hierarchy and these keys allow the
+ * <code>ObjectName</code> for any MBean instance to fully describe its
+ * specific location in the hierarchy. To complete the example, the full
+ * <code>ObjectName</code> for the example
+ * <code>RTMPEndpointControlMBean</code> would be:
+ * <code>flex:type=MessageBroker.RTMPEndpoint,MessageBroker=MessageBroker1,id=RTMPEndpoint1</code>
+ * <p>
+ * If the MBean is registered with the MBean server, this method returns the
+ * <code>ObjectName</code> that the MBean was registered under and this
+ * value may contain additional key-value pairs injected by the container or
+ * MBean server.
+ * </p>
+ *
+ * @return The <code>ObjectName</code> for this instance.
+ */
+ public final ObjectName getObjectName()
+ {
+ if (registered)
+ return registeredObjectName;
+
+ if (objectName == null)
+ {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append(DOMAIN_PREFIX);
+ String appId = getApplicationId();
+ if (appId != null && appId.length() > 0)
+ {
+ buffer.append('.');
+ buffer.append(appId);
+ }
+ buffer.append(":type=");
+ // Build hierarchical type value.
+ List types = new ArrayList();
+ List ids = new ArrayList();
+ types.add(getType());
+ ids.add(getId());
+ BaseControl ancestor = parent;
+ while (ancestor != null)
+ {
+ types.add(ancestor.getType());
+ ids.add(ancestor.getId());
+ ancestor = ancestor.getParentControl();
+ }
+ for (int i = types.size() - 1; i >= 0; --i)
+ {
+ buffer.append((String)types.get(i));
+ if (i > 0)
+ {
+ buffer.append('.');
+ }
+ }
+ buffer.append(',');
+ // Add containment keys.
+ for (int i = ids.size() - 1; i >= 1; --i)
+ {
+ buffer.append((String)types.get(i));
+ buffer.append('=');
+ buffer.append((String)ids.get(i));
+ buffer.append(',');
+ }
+ buffer.append("id=");
+ buffer.append(getId());
+ String name = buffer.toString();
+ // TODO: Seth: add server identifier key if we're running in a
+ // cluster?
+ try
+ {
+ objectName = new ObjectName(name);
+ }
+ catch (MalformedObjectNameException mone)
+ {
+ // Rethrow with useful message if this ever happens.
+ ManagementException me = new ManagementException();
+ me.setMessage(MALFORMED_OBJECTNAME, new Object[] {name});
+ throw me;
+ }
+ }
+ return objectName;
+ }
+
+ /**
+ * Implements <code>javax.management.MBeanRegistration.preRegister</code>.
+ * Allows the MBean to perform any operations it needs before being
+ * registered in the MBean server. This base implementation stores a
+ * reference to the MBean server that may be accessed via
+ * <code>getMBeanServer()</code>. If subclasses override, they must call
+ * <code>super.preRegister()</code>.
+ *
+ * @param server The Mbean server in which the MBean will be registered.
+ * @param name The object name of the MBean.
+ * @return The name the MBean will be registered under.
+ * @throws Exception when the process failed
+ */
+ public ObjectName preRegister(MBeanServer server, ObjectName name)
+ throws Exception
+ {
+ this.server = server;
+ return (name == null) ? getObjectName() : name;
+ }
+
+ /**
+ * Implements <code>javax.management.MBeanRegistration.postRegister</code>.
+ * Allows the MBean to perform any operations needed after having been
+ * registered in the MBean server or after the registration has failed. This
+ * base implementation is a no-op that may be overridden.
+ *
+ * @param registrationDone Indicates whether or not the MBean was
+ * successfully registered in the MBean server.
+ */
+ public void postRegister(Boolean registrationDone)
+ {
+ // No-op.
+ }
+
+ /**
+ * Implements <code>javax.management.MBeanRegistration.preDeregister</code>.
+ * Allows the MBean to perform any operations needed after having been
+ * unregistered in the MBean server. This base implementation is a no-op
+ * that may be overridden.
+ * @throws Exception when the process failed
+ */
+ public void preDeregister() throws Exception
+ {
+ // No-op.
+ }
+
+ /**
+ * Implements <code>javax.management.MBeanRegistration.postDeregister</code>.
+ * Allows the MBean to perform any operations it needs before being
+ * unregistered by the MBean server. This base implementation is a no-op
+ * that may be overridden.
+ */
+ public void postDeregister()
+ {
+ // No-op.
+ }
+
+ /**
+ * Sets the start timestamp for the managed component.
+ *
+ * @param value The start timestamp for the managed component.
+ */
+ public void setStartTimestamp(Date value)
+ {
+ startTimestamp = value;
+ }
+
+ /**
+ * @exclude Returns the difference between a start and end timestamps in
+ * minutes. Differences of less than one minute are rounded up to
+ * one minute to avoid frequency calculations reporting infinite
+ * message frequencies.
+ * @param startTime The start timestamp in milliseconds.
+ * @param endTime The end timestamp in milliseconds.
+ * @return The difference between a start and end timestamps in minutes.
+ */
+ protected double differenceInMinutes(long startTime, long endTime)
+ {
+ double minutes = (endTime - startTime) / 60000d;
+ if (minutes > 1d)
+ {
+ return minutes;
+ }
+ else
+ {
+ return 1d;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/7a58369c/modules/core/src/flex/management/BaseControlMBean.java
----------------------------------------------------------------------
diff --git a/modules/core/src/flex/management/BaseControlMBean.java b/modules/core/src/flex/management/BaseControlMBean.java
new file mode 100755
index 0000000..09ab6fe
--- /dev/null
+++ b/modules/core/src/flex/management/BaseControlMBean.java
@@ -0,0 +1,57 @@
+/*
+ * 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 flex.management;
+
+import java.io.IOException;
+import javax.management.ObjectName;
+
+/**
+ * The base MBean interface for management beans that control aspects of
+ * Flex behavior on the server.
+ *
+ * @author shodgson
+ */
+public interface BaseControlMBean
+{
+ /**
+ * Returns the id for this MBean. This is the value that is set for the
+ * <code>id</code> key in the <code>ObjectName</code> for this MBean.
+ *
+ * @return The MBean instance id.
+ * @throws IOException Throws IOException.
+ */
+ String getId() throws IOException;
+
+ /**
+ * Returns the type for this MBean. This is the value that is set for the
+ * <code>type</code> key in the <code>ObjectName</code> for this MBean.
+ *
+ * @return The MBean instance type.
+ * @throws IOException Throws IOException.
+ */
+ String getType() throws IOException;
+
+ /**
+ * Returns the parent for this MBean. The value is the <code>ObjectName</code>
+ * for the parent MBean that conceptually contains this MBean instance. If no
+ * parent exists, this method returns <code>null</code>.
+ *
+ * @return The <code>ObjectName</code> for the parent of this MBean instance.
+ * @throws IOException Throws IOException.
+ */
+ ObjectName getParent() throws IOException;
+}
http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/7a58369c/modules/core/src/flex/management/MBeanLifecycleManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/flex/management/MBeanLifecycleManager.java b/modules/core/src/flex/management/MBeanLifecycleManager.java
new file mode 100755
index 0000000..4bbfea9
--- /dev/null
+++ b/modules/core/src/flex/management/MBeanLifecycleManager.java
@@ -0,0 +1,65 @@
+/*
+ * 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 flex.management;
+
+import flex.messaging.MessageBroker;
+
+import java.util.Iterator;
+import java.util.Set;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+/**
+ * Helper class for managing MBean lifecycles externally from the core server
+ * components where necessary.
+ *
+ * @author shodgson
+ */
+public class MBeanLifecycleManager
+{
+ /**
+ * Unregisters all runtime MBeans that are registered in the same domain as the
+ * MessageBrokerControl for the target MessageBroker.
+ *
+ * @param broker The MessageBroker component that has been stopped.
+ */
+ public static void unregisterRuntimeMBeans(MessageBroker broker)
+ {
+ MBeanServer server = MBeanServerLocatorFactory.getMBeanServerLocator().getMBeanServer();
+ ObjectName brokerMBean = broker.getControl().getObjectName();
+ String domain = brokerMBean.getDomain();
+ try
+ {
+ ObjectName pattern = new ObjectName(domain + ":*");
+ Set names = server.queryNames(pattern, null);
+ Iterator iter = names.iterator();
+ while (iter.hasNext())
+ {
+ ObjectName on = (ObjectName)iter.next();
+ server.unregisterMBean(on);
+ }
+ }
+ catch (Exception e)
+ {
+ // We're generally unregistering these during shutdown (possibly JVM shutdown)
+ // so there's nothing to really do here because we aren't guaranteed access to
+ // resources like system log files, localized messaging, etc.
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/7a58369c/modules/core/src/flex/management/MBeanServerLocator.java
----------------------------------------------------------------------
diff --git a/modules/core/src/flex/management/MBeanServerLocator.java b/modules/core/src/flex/management/MBeanServerLocator.java
new file mode 100755
index 0000000..af3676f
--- /dev/null
+++ b/modules/core/src/flex/management/MBeanServerLocator.java
@@ -0,0 +1,35 @@
+/*
+ * 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 flex.management;
+
+import javax.management.MBeanServer;
+
+/**
+ * Interface for classes that locate MBeanServers to register MBeans with.
+ *
+ * @author shodgson
+ */
+public interface MBeanServerLocator
+{
+ /**
+ * Returns the MBeanServer to register our management MBeans with.
+ *
+ * @return The MBeanServer to register our management MBeans with.
+ */
+ MBeanServer getMBeanServer();
+
+}
http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/7a58369c/modules/core/src/flex/management/MBeanServerLocatorFactory.java
----------------------------------------------------------------------
diff --git a/modules/core/src/flex/management/MBeanServerLocatorFactory.java b/modules/core/src/flex/management/MBeanServerLocatorFactory.java
new file mode 100755
index 0000000..f69da6d
--- /dev/null
+++ b/modules/core/src/flex/management/MBeanServerLocatorFactory.java
@@ -0,0 +1,125 @@
+/*
+ * 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 flex.management;
+
+import flex.messaging.log.Log;
+import flex.messaging.log.LogCategories;
+import flex.messaging.util.ClassUtil;
+
+/**
+ * Factory to get a <code>MBeanServerLocator</code>.
+ *
+ * @author shodgson
+ */
+public class MBeanServerLocatorFactory
+{
+ //--------------------------------------------------------------------------
+ //
+ // Private Static Variables
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * The MBeanServerLocator impl to use; lazily init'ed on first access.
+ */
+ private static MBeanServerLocator locator;
+
+ //--------------------------------------------------------------------------
+ //
+ // Public Static Methods
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Returns a <code>MBeanServerLocator</code> that exposes the <code>MBeanServer</code> to register MBeans with.
+ *
+ * @return The <code>MBeanServerLocator</code> that exposes the <code>MBeanServer</code> to register MBeans with.
+ */
+ public static synchronized MBeanServerLocator getMBeanServerLocator()
+ {
+ if (locator == null)
+ {
+ // Try app-server specific locators.
+ // WebSphere provides access to its MBeanServer via a custom admin API.
+ instantiateLocator("flex.management.WebSphereMBeanServerLocator", new String[] {"com.ibm.websphere.management.AdminServiceFactory"});
+
+ // Sun JRE 1.5 based implementation
+ if (locator == null)
+ locator = new PlatformMBeanServerLocator();
+
+ if (Log.isDebug())
+ Log.getLogger(LogCategories.MANAGEMENT_GENERAL).debug("Using MBeanServerLocator: " + locator.getClass().getName());
+ }
+ return locator;
+ }
+
+ /**
+ * Release static MBeanServerLocator
+ * Called on MessageBroker shutdown.
+ */
+ public static void clear()
+ {
+ locator = null;
+ }
+
+ //--------------------------------------------------------------------------
+ //
+ // Private Static Methods
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Helper method that attempts to load a specific MBeanServerLocator.
+ *
+ * @param locatorClassName The classname of the desired MBeanServerLocator.
+ * @param dependencyClassNames Any additional dependent classnames that the desired locator depends upon
+ * that should also be tested for availability.
+ */
+ private static void instantiateLocator(String locatorClassName, String[] dependencyClassNames)
+ {
+ try
+ {
+ if (dependencyClassNames != null)
+ {
+ for (int i = 0; i < dependencyClassNames.length; i++)
+ ClassUtil.createClass(dependencyClassNames[i]);
+ }
+
+ Class locatorClass = ClassUtil.createClass(locatorClassName);
+ locator = (MBeanServerLocator)locatorClass.newInstance();
+ }
+ catch (Throwable t)
+ {
+ if (Log.isDebug())
+ Log.getLogger(LogCategories.MANAGEMENT_MBEANSERVER).debug("Not using MBeanServerLocator: " + locatorClassName + ". Reason: " + t.getMessage());
+ }
+ }
+
+ //--------------------------------------------------------------------------
+ //
+ // Constructor
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Direct instantiation is not allowed.
+ * Use <code>getMBeanServerLocator()</code> to obtain a <code>MBeanServerLocator</code>
+ * instance to lookup the proper MBean server to use.
+ */
+ private MBeanServerLocatorFactory() {}
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/7a58369c/modules/core/src/flex/management/Manageable.java
----------------------------------------------------------------------
diff --git a/modules/core/src/flex/management/Manageable.java b/modules/core/src/flex/management/Manageable.java
new file mode 100755
index 0000000..0da2890
--- /dev/null
+++ b/modules/core/src/flex/management/Manageable.java
@@ -0,0 +1,55 @@
+/*
+ * 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 flex.management;
+
+/**
+ * Manageability of a class is enabled by implementing this interface. The
+ * specific level of manageability is defined by the relationship between
+ * a manageable component and its corresponding control.
+ *
+ * @author shodgson
+ */
+public interface Manageable
+{
+ /**
+ * Returns <code>true</code> if the component is enabled for management.
+ *
+ * @return <code>true</code> if the component is enabled for management.
+ */
+ boolean isManaged();
+
+ /**
+ * Enables or disables management for the component.
+ *
+ * @param enableManagement <code>true</code> to enable management, <code>false</code> to disable management.
+ */
+ void setManaged(boolean enableManagement);
+
+ /**
+ * Returns the control MBean used to manage the component.
+ *
+ * @return The control MBean used to manage the component.
+ */
+ BaseControl getControl();
+
+ /**
+ * Set the control MBean used to manage the component.
+ *
+ * @param control The <code>BaseControl</code> MBean used to manage the component.
+ */
+ void setControl(BaseControl control);
+}
http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/7a58369c/modules/core/src/flex/management/ManageableComponent.java
----------------------------------------------------------------------
diff --git a/modules/core/src/flex/management/ManageableComponent.java b/modules/core/src/flex/management/ManageableComponent.java
new file mode 100755
index 0000000..71d07de
--- /dev/null
+++ b/modules/core/src/flex/management/ManageableComponent.java
@@ -0,0 +1,421 @@
+/*
+ * 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 flex.management;
+
+import java.util.Date;
+
+import flex.messaging.FlexComponent;
+import flex.messaging.config.ConfigMap;
+import flex.messaging.config.ConfigurationException;
+import flex.messaging.log.Log;
+
+/**
+ * An abstract base class that implements the <code>Manageable</code> and <code>FlexComponent</code> interfaces.
+ * This is an excellent starting point for a server component that may be instantiated, initialized, started and
+ * stopped, as well as exposing an optional management interface via a peer MBean.
+ * <p>Support for changing component properties while the component is
+ * started should be determined on a per-property basis, and the started property is volatile to ensure consistent
+ * reads of the start state of the component across threads. This class performs no synchronization and is not safe for modification by multiple concurrent threads
+ * in the absence of external synchronization.
+ * </p>
+ */
+public abstract class ManageableComponent implements Manageable, FlexComponent
+{
+ //--------------------------------------------------------------------------
+ //
+ // Protected Static Constants
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Error code for attempting to change a property after starting.
+ */
+ protected static final int PROPERTY_CHANGE_AFTER_STARTUP = 11115;
+
+ /**
+ * Error code to alert the user that a required component property is null.
+ */
+ protected static final int NULL_COMPONENT_PROPERTY = 11116;
+
+ //--------------------------------------------------------------------------
+ //
+ // Constructor
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Constructs a <code>ManageableComponent</code> instance, specifying
+ * whether to enable management.
+ * Enabling management will trigger the creation of a peer MBean that exposes the
+ * management interface for this component.
+ *
+ * @param enableManagement <code>true</code> to enable management, <code>false</code> to disable
+ * management.
+ */
+ public ManageableComponent(boolean enableManagement)
+ {
+ setManaged(enableManagement);
+ }
+
+ //--------------------------------------------------------------------------
+ //
+ // Public Properties
+ //
+ //--------------------------------------------------------------------------
+
+ //----------------------------------
+ // control
+ //----------------------------------
+
+ /**
+ * The peer MBean of the <code>ManageableComponent</code> that exposes a management interface.
+ */
+ protected BaseControl control;
+
+ /**
+ * (non-JavaDoc)
+ * @see Manageable#getControl()
+ */
+ public BaseControl getControl()
+ {
+ return control;
+ }
+
+ /**
+ * (non-JavaDoc)
+ * @see Manageable#setControl(BaseControl)
+ */
+ public void setControl(BaseControl control)
+ {
+ this.control = control;
+ }
+
+ //----------------------------------
+ // id
+ //----------------------------------
+
+ /**
+ * The internal id value of the <code>ManageableComponent</code>.
+ */
+ protected String id;
+
+ /**
+ * Returns the id of the <code>ManageableComponent</code>.
+ *
+ * @return The id of the <code>ManageableComponent</code>.
+ */
+ public String getId()
+ {
+ return id;
+ }
+
+ /**
+ * Sets the id of the <code>ManageableComponent</code>. The id cannot be
+ * null and it cannot be changed after startup.
+ *
+ * @param id The id of the <code>ManageableComponent</code>.
+ */
+ public void setId(String id)
+ {
+ if (isStarted())
+ {
+ blockAssignmentWhileStarted("id");
+ }
+ if (id == null)
+ {
+ // Id of a component cannot be null.
+ blockNullAssignment("id");
+ }
+ this.id = id;
+ }
+
+ //----------------------------------
+ // managed
+ //----------------------------------
+
+ /**
+ * The internal managed flag of the <code>ManageableComponent</code>.
+ */
+ protected volatile boolean managed;
+
+ /**
+ * (non-JavaDoc)
+ * @see Manageable#isManaged()
+ */
+ public boolean isManaged()
+ {
+ return managed;
+ }
+
+ /**
+ * Enables or disables management for the component. Management cannot be
+ * changed once the component is started and management cannot be
+ * <code>true</code> if the parent of the component is not managed.
+ *
+ * @param enableManagement <code>true</code> to enable management, <code>false</code> to disable management.
+ */
+ public void setManaged(boolean enableManagement)
+ {
+ if (isStarted() && control != null)
+ {
+ blockAssignmentWhileStarted("managed");
+ }
+ if (enableManagement && parent != null && !parent.isManaged())
+ {
+ if (Log.isWarn())
+ {
+ Log.getLogger(getLogCategory()).warn("Component: '" + id + "' cannot be managed" +
+ " since its parent is unmanaged.");
+ }
+ return;
+ }
+ managed = enableManagement;
+ }
+
+ //----------------------------------
+ // parent
+ //----------------------------------
+
+ /**
+ * The internal reference to the parent component (if any) of the <code>ManageableComponent</code>.
+ */
+ protected Manageable parent;
+
+ /**
+ * Returns the parent of the component.
+ *
+ * @return The parent of the component.
+ */
+ public Manageable getParent()
+ {
+ return parent;
+ }
+
+ /**
+ * Sets the parent of the component. The parent cannot be changed
+ * after component startup and it cannot be null.
+ *
+ * @param parent The parent of the component.
+ */
+ public void setParent(Manageable parent)
+ {
+ if (isStarted())
+ {
+ blockAssignmentWhileStarted("parent");
+ }
+ if (parent == null)
+ {
+ // Parent of a component cannot be null.
+ blockNullAssignment("parent");
+ }
+ if (!parent.isManaged() && isManaged())
+ {
+ if (Log.isWarn())
+ {
+ Log.getLogger(getLogCategory()).warn("Component: '" + id + "' cannot be managed" +
+ " since its parent is unmanaged.");
+ }
+ setManaged(false);
+ }
+ this.parent = parent;
+ }
+
+ //----------------------------------
+ // started
+ //----------------------------------
+
+ /**
+ * The internal started flag of the <code>ManageableComponent</code>.
+ */
+ protected volatile boolean started;
+
+ /**
+ * Returns if the component is started or not.
+ *
+ * @return <code>true</code> if the component is started.
+ */
+ public boolean isStarted()
+ {
+ return started;
+ }
+
+ /**
+ * Sets if the component is started.
+ *
+ * @param started
+ */
+ protected void setStarted(boolean started)
+ {
+ if (this.started != started)
+ {
+ this.started = started;
+ if (started && control != null)
+ {
+ control.setStartTimestamp(new Date());
+ }
+ }
+ }
+
+ //----------------------------------
+ // valid
+ //----------------------------------
+
+ /**
+ * The internal valid flag of the <code>ManageableComponent</code>.
+ */
+ protected boolean valid;
+
+ /**
+ * Returns if the component is valid.
+ *
+ * @return <code>true</code> if the component is valid.
+ */
+ public boolean isValid()
+ {
+ return valid;
+ }
+
+ /**
+ * Sets if the component is valid.
+ *
+ * @param valid
+ */
+ protected void setValid(boolean valid)
+ {
+ this.valid = valid;
+ }
+
+ //----------------------------------
+ // logCategory
+ //----------------------------------
+
+ /**
+ * Returns the log category of the component. Subclasses must provide an
+ * implementation that returns their desired log category.
+ *
+ * @return The log category of the component.
+ */
+ protected abstract String getLogCategory();
+
+ //--------------------------------------------------------------------------
+ //
+ // Public Methods
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Invoked to initialize the <code>ManageableComponent</code>.
+ * This base implementation calls <code>setId()</code> passing the provided
+ * id and ignores the properties map argument.
+ * Subclasses should call <code>super.initialize()</code>.
+ *
+ * @param id Id of the <code>ManageableComponent</code>.
+ * @param properties Properties for the <code>ManageableComponent</code>.
+ */
+ public void initialize(String id, ConfigMap properties)
+ {
+ setId(id);
+ }
+
+ /**
+ * Validates and starts the component.
+ *
+ * Subclasses should call <code>super.start()</code>.
+ */
+ public void start()
+ {
+ validate();
+ setStarted(true);
+ }
+
+ /**
+ * Invalidates and stops the component.
+ *
+ * Subclasses should call <code>super.stop()</code>.
+ */
+ public void stop()
+ {
+ invalidate();
+ setStarted(false);
+ }
+
+ //--------------------------------------------------------------------------
+ //
+ // Protocted Methods
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Convenience method that may be used to generate and throw an Exception for an attempt to set the specified property if the
+ * component is started.
+ *
+ * @param propertyName The name of the property being incorrectly assigned; included in the Exception message.
+ */
+ protected void blockAssignmentWhileStarted(String propertyName)
+ {
+ ConfigurationException ce = new ConfigurationException();
+ ce.setMessage(PROPERTY_CHANGE_AFTER_STARTUP, new Object[]{propertyName});
+ throw ce;
+ }
+
+ /**
+ * Convenience method that may be used to generate and throw an Exception for an attempt to assign a null value to a property that
+ * requires non-null values.
+ *
+ * @param propertyName The name of the property being incorrectly assigned.
+ */
+ protected void blockNullAssignment(String propertyName)
+ {
+ ConfigurationException ce = new ConfigurationException();
+ ce.setMessage(NULL_COMPONENT_PROPERTY, new Object[]{propertyName});
+ throw ce;
+ }
+
+ /**
+ * Invoked from within the <code>stop()</code> method to invalidate the component as part of shutdown.
+ * This base implementation sets the valid property to false.
+ * Subclasses should call <code>super.invalidate()</code>.
+ */
+ protected void invalidate()
+ {
+ setValid(false);
+ }
+
+ /**
+ * Hook method invoked from within the <code>start()</code> method to validate that the component is in a
+ * startable state.
+ * This base implementation validates the component by ensuring it has an id and a parent and then sets
+ * the valid property to true.
+ * If the component is not in a valid, startable state an Exception is thrown.
+ * Subclasses should call <code>super.validate()</code>.
+ */
+ protected void validate()
+ {
+ if (getId() == null)
+ {
+ // Id of a component cannot be null.
+ blockNullAssignment("id");
+ }
+ if (getParent() == null)
+ {
+ // Parent of a component cannot be null.
+ blockNullAssignment("parent");
+ }
+ setValid(true);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/7a58369c/modules/core/src/flex/management/ManagementException.java
----------------------------------------------------------------------
diff --git a/modules/core/src/flex/management/ManagementException.java b/modules/core/src/flex/management/ManagementException.java
new file mode 100755
index 0000000..93157ed
--- /dev/null
+++ b/modules/core/src/flex/management/ManagementException.java
@@ -0,0 +1,32 @@
+/*
+ * 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 flex.management;
+
+import flex.messaging.MessageException;
+
+/**
+ * This exception type is thrown when errors occur generating
+ * <code>ObjectName</code>s for MBeans, or when registering them or
+ * accessing them via the MBean server.
+ *
+ * @author shodgson
+ */
+public class ManagementException extends MessageException
+{
+ // Inherits all functionality from MessageException.
+ static final long serialVersionUID = 1296149563830613956L;
+}
http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/7a58369c/modules/core/src/flex/management/PlatformMBeanServerLocator.java
----------------------------------------------------------------------
diff --git a/modules/core/src/flex/management/PlatformMBeanServerLocator.java b/modules/core/src/flex/management/PlatformMBeanServerLocator.java
new file mode 100755
index 0000000..ae7f528
--- /dev/null
+++ b/modules/core/src/flex/management/PlatformMBeanServerLocator.java
@@ -0,0 +1,39 @@
+/*
+ * 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 flex.management;
+
+import java.lang.management.ManagementFactory;
+import javax.management.MBeanServer;
+
+import flex.messaging.log.Log;
+import flex.messaging.log.LogCategories;
+
+/**
+ * The platform implementation of an MBeanServerLocator for Java 1.5+.
+ * This locator exposes the platform MBeanServer.
+ *
+ * @author shodgson
+ */
+public class PlatformMBeanServerLocator implements MBeanServerLocator
+{
+ /** {@inheritDoc} */
+ public synchronized MBeanServer getMBeanServer()
+ {
+ return ManagementFactory.getPlatformMBeanServer();
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/7a58369c/modules/core/src/flex/management/jmx/Attribute.java
----------------------------------------------------------------------
diff --git a/modules/core/src/flex/management/jmx/Attribute.java b/modules/core/src/flex/management/jmx/Attribute.java
new file mode 100755
index 0000000..f4cce01
--- /dev/null
+++ b/modules/core/src/flex/management/jmx/Attribute.java
@@ -0,0 +1,63 @@
+/*
+ * 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 flex.management.jmx;
+
+/**
+ * Remotable <code>Attribute</code> class that complies with Flash serialization requirements.
+ *
+ * @author shodgson
+ */
+public class Attribute
+{
+ /**
+ * The name of the attribute.
+ */
+ public String name;
+
+ /**
+ * The value of the attribute.
+ */
+ public Object value;
+
+ /**
+ * Constructs an empty <code>Attribute</code> instance.
+ *
+ */
+ public Attribute()
+ {}
+
+ /**
+ * Constructs an <code>Attribute</code> instance based upon a <code>javax.management.Attribute</code> instance.
+ *
+ * @param attribute The JMX <code>Attribute</code> to base this instance on.
+ */
+ public Attribute(javax.management.Attribute attribute)
+ {
+ name = attribute.getName();
+ value = attribute.getValue();
+ }
+
+ /**
+ * Utility method to convert this <code>Attribute</code> instance to a <code>javax.management.Attribute</code> instance.
+ *
+ * @return A JMX <code>Attribute</code> based upon this instance.
+ */
+ public javax.management.Attribute toAttribute()
+ {
+ return new javax.management.Attribute(name, value);
+ }
+}
http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/7a58369c/modules/core/src/flex/management/jmx/MBeanAttributeInfo.java
----------------------------------------------------------------------
diff --git a/modules/core/src/flex/management/jmx/MBeanAttributeInfo.java b/modules/core/src/flex/management/jmx/MBeanAttributeInfo.java
new file mode 100755
index 0000000..a60937e
--- /dev/null
+++ b/modules/core/src/flex/management/jmx/MBeanAttributeInfo.java
@@ -0,0 +1,96 @@
+/*
+ * 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 flex.management.jmx;
+
+/**
+ * Remotable <code>MBeanAttributeInfo</code> class that complies with Flash serialization requirements.
+ * The <code>isIs</code> property is not named <code>is</code> because <code>is</code> is
+ * an ActionScript keyword.
+ *
+ * @author shodgson
+ */
+public class MBeanAttributeInfo
+{
+ /**
+ * The name of the attribute.
+ */
+ public String name;
+
+ /**
+ * The class name of the attribute.
+ */
+ public String type;
+
+ /**
+ * The description of the attribute.
+ */
+ public String description;
+
+ /**
+ * Whether the attribute can be read.
+ */
+ public boolean readable;
+
+ /**
+ * Whether the attribute can be written.
+ */
+ public boolean writable;
+
+ /**
+ * Whether the attribute has an "is" getter.
+ */
+ public boolean isIs;
+
+ /**
+ * Constructs an empty <code>MBeanAttributeInfo</code> instance.
+ */
+ public MBeanAttributeInfo()
+ {}
+
+ /**
+ * Constructs a <code>MBeanAttributeInfo</code> instance based upon a
+ * <code>javax.management.MBeanAttributeInfo</code> instance.
+ *
+ * @param mbeanAttributeInfo The JMX <code>MBeanAttributeInfo</code> instance to base this instance on.
+ */
+ public MBeanAttributeInfo(javax.management.MBeanAttributeInfo mbeanAttributeInfo)
+ {
+ name = mbeanAttributeInfo.getName();
+ type = mbeanAttributeInfo.getType();
+ description = mbeanAttributeInfo.getDescription();
+ readable = mbeanAttributeInfo.isReadable();
+ writable = mbeanAttributeInfo.isWritable();
+ isIs = mbeanAttributeInfo.isIs();
+ }
+
+ /**
+ * Utility method to convert this <code>MBeanAttributeInfo</code> to a
+ * <code>javax.management.MBeanAttributeInfo</code> instance.
+ *
+ * @return A JMX <code>MBeanAttributeInfo</code> based upon this instance.
+ */
+ public javax.management.MBeanAttributeInfo toMBeanAttributeInfo()
+ {
+ return new javax.management.MBeanAttributeInfo(name,
+ type,
+ description,
+ readable,
+ writable,
+ isIs);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/7a58369c/modules/core/src/flex/management/jmx/MBeanConstructorInfo.java
----------------------------------------------------------------------
diff --git a/modules/core/src/flex/management/jmx/MBeanConstructorInfo.java b/modules/core/src/flex/management/jmx/MBeanConstructorInfo.java
new file mode 100755
index 0000000..105a25f
--- /dev/null
+++ b/modules/core/src/flex/management/jmx/MBeanConstructorInfo.java
@@ -0,0 +1,106 @@
+/*
+ * 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 flex.management.jmx;
+
+/**
+ * Remotable <code>MBeanConstructorInfo</code> class that complies with Flash serialization requirements.
+ *
+ * @author shodgson
+ */
+public class MBeanConstructorInfo
+{
+ /**
+ * The name of the constructor.
+ */
+ public String name;
+
+ /**
+ * The description of the constructor.
+ */
+ public String description;
+
+ /**
+ * The constructor's parameter signature.
+ */
+ public MBeanParameterInfo[] signature;
+
+ /**
+ * Constructs an empty <code>MBeanConstructorInfo</code> instance.
+ *
+ */
+ public MBeanConstructorInfo()
+ {}
+
+ /**
+ * Constructs a <code>MBeanConstructorInfo</code> instance based upon a
+ * <code>javax.management.MBeanConstructorInfo</code> instance.
+ *
+ * @param mbeanConstructorInfo The <code>javax.management.MBeanConstructorInfo</code> to base this instance on.
+ */
+ public MBeanConstructorInfo(javax.management.MBeanConstructorInfo mbeanConstructorInfo)
+ {
+ name = mbeanConstructorInfo.getName();
+ description = mbeanConstructorInfo.getDescription();
+ signature = convertSignature(mbeanConstructorInfo.getSignature());
+ }
+
+ /**
+ * Utility method to convert this <code>MBeanConstructorInfo</code> instance to a
+ * <code>javax.management.MBeanConstructorInfo</code> instance.
+ *
+ * @return A JMX <code>MBeanConstructorInfo</code> based upon this instance.
+ */
+ public javax.management.MBeanConstructorInfo toMBeanConstructorInfo()
+ {
+ return new javax.management.MBeanConstructorInfo(name,
+ description,
+ convertSignature(signature));
+ }
+
+ /**
+ * Utility method to convert the JMX constructor signature to our Flash friendly param type.
+ *
+ * @param source The JMX constructor signature params.
+ * @return Flash friendly signature params.
+ */
+ private MBeanParameterInfo[] convertSignature(javax.management.MBeanParameterInfo[] source)
+ {
+ MBeanParameterInfo[] signature = new MBeanParameterInfo[source.length];
+ for (int i = 0; i < source.length; i++)
+ {
+ signature[i] = new MBeanParameterInfo(source[i]);
+ }
+ return signature;
+ }
+
+ /**
+ * Utility method to convert a Flash friendly construtor param signature to the JMX params.
+ *
+ * @param source The Flash friendly signature params.
+ * @return The JMX constructor signature params.
+ */
+ private javax.management.MBeanParameterInfo[] convertSignature(MBeanParameterInfo[] source)
+ {
+ javax.management.MBeanParameterInfo[] signature = new javax.management.MBeanParameterInfo[source.length];
+ for (int i = 0; i < source.length; i++)
+ {
+ signature[i] = source[i].toMBeanParameterInfo();
+ }
+ return signature;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/7a58369c/modules/core/src/flex/management/jmx/MBeanInfo.java
----------------------------------------------------------------------
diff --git a/modules/core/src/flex/management/jmx/MBeanInfo.java b/modules/core/src/flex/management/jmx/MBeanInfo.java
new file mode 100755
index 0000000..bc3eb44
--- /dev/null
+++ b/modules/core/src/flex/management/jmx/MBeanInfo.java
@@ -0,0 +1,186 @@
+/*
+ * 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 flex.management.jmx;
+
+/**
+ * Remotable MBeanInfo class that complies with Flash serialization requirements.
+ * MBean Notifications are not currently supported.
+ *
+ * @author shodgson
+ */
+public class MBeanInfo
+{
+ /**
+ * The Java class name for the MBean object.
+ */
+ public String className;
+
+ /**
+ * The description of the MBean.
+ */
+ public String description;
+
+ /**
+ * The attributes exposed for management.
+ */
+ public MBeanAttributeInfo[] attributes;
+
+ /**
+ * The public constructors for the MBean.
+ */
+ public MBeanConstructorInfo[] constructors;
+
+ /**
+ * The operations exposed by the MBean.
+ */
+ public MBeanOperationInfo[] operations;
+
+ /**
+ * Constructs an empty <code>MBeanInfo</code> instance.
+ */
+ public MBeanInfo()
+ {}
+
+ /**
+ * Constructs a <code>MBeanInfo</code> instance based upon a
+ * <code>javax.management.MBeanInfo</code> instance.
+ *
+ * @param mbeanInfo The JMX <code>MBeanInfo</code> instance to base this instance on.
+ */
+ public MBeanInfo(javax.management.MBeanInfo mbeanInfo)
+ {
+ className = mbeanInfo.getClassName();
+ description = mbeanInfo.getDescription();
+ attributes = convertAttributes(mbeanInfo.getAttributes());
+ constructors = convertConstructors(mbeanInfo.getConstructors());
+ operations = convertOperations(mbeanInfo.getOperations());
+ }
+
+ /**
+ * Utility method to convert this <code>MBeanInfo</code> to a
+ * <code>javax.management.MBeanInfo</code> instance.
+ *
+ * @return A JMX <code>MBeanInfo</code> based upon this instance.
+ */
+ public javax.management.MBeanInfo toMBeanInfo()
+ {
+ return new javax.management.MBeanInfo(className,
+ description,
+ convertAttributes(attributes),
+ convertConstructors(constructors),
+ convertOperations(operations),
+ null);
+ }
+
+ /**
+ * Utility method to convert JMX attribute info instances to Flash friendly instances.
+ *
+ * @param source JMX attribute info instances.
+ * @return Flash friendly attribute info instances.
+ */
+ private MBeanAttributeInfo[] convertAttributes(javax.management.MBeanAttributeInfo[] source)
+ {
+ MBeanAttributeInfo[] attributes = new MBeanAttributeInfo[source.length];
+ for (int i = 0; i < source.length; i++)
+ {
+ attributes[i] = new MBeanAttributeInfo(source[i]);
+ }
+ return attributes;
+ }
+
+ /**
+ * Utility method to convert Flash friendly attribute info instances to JMX attribute info instances.
+ *
+ * @param source Flash friendly attribute info instances.
+ * @return JMX attribute info instances.
+ */
+ private javax.management.MBeanAttributeInfo[] convertAttributes(MBeanAttributeInfo[] source)
+ {
+ javax.management.MBeanAttributeInfo[] attributes = new javax.management.MBeanAttributeInfo[source.length];
+ for (int i = 0; i < source.length; i++)
+ {
+ attributes[i] = source[i].toMBeanAttributeInfo();
+ }
+ return attributes;
+ }
+
+ /**
+ * Utility method to convert JMX constructor info instances to Flash friendly constructor info
+ * instances.
+ *
+ * @param source JMX constructor info instances.
+ * @return Flash friendly constructor info instances.
+ */
+ private MBeanConstructorInfo[] convertConstructors(javax.management.MBeanConstructorInfo[] source)
+ {
+ MBeanConstructorInfo[] constructors = new MBeanConstructorInfo[source.length];
+ for (int i = 0; i < source.length; i++)
+ {
+ constructors[i] = new MBeanConstructorInfo(source[i]);
+ }
+ return constructors;
+ }
+
+ /**
+ * Utility method to convert Flash friendly constructor info instances to JMX constructor info instances.
+ *
+ * @param source Flash friendly constructor info instances.
+ * @return JMX constructor info instances.
+ */
+ private javax.management.MBeanConstructorInfo[] convertConstructors(MBeanConstructorInfo[] source)
+ {
+ javax.management.MBeanConstructorInfo[] constructors = new javax.management.MBeanConstructorInfo[source.length];
+ for (int i = 0; i < source.length; i++)
+ {
+ constructors[i] = source[i].toMBeanConstructorInfo();
+ }
+ return constructors;
+ }
+
+ /**
+ * Utility method to convert JMX operation info instances to Flash friendly operation info instances.
+ *
+ * @param source JMX opereration info instances.
+ * @return Flash friendly operation info instances.
+ */
+ private MBeanOperationInfo[] convertOperations(javax.management.MBeanOperationInfo[] source)
+ {
+ MBeanOperationInfo[] operations = new MBeanOperationInfo[source.length];
+ for (int i = 0; i < source.length; i++)
+ {
+ operations[i] = new MBeanOperationInfo(source[i]);
+ }
+ return operations;
+ }
+
+ /**
+ * Utility method to convert Flash friendly operation info instances to JMX operation info instances.
+ *
+ * @param source Flash friendly operation info instances.
+ * @return JMX operation info instances.
+ */
+ private javax.management.MBeanOperationInfo[] convertOperations(MBeanOperationInfo[] source)
+ {
+ javax.management.MBeanOperationInfo[] operations = new javax.management.MBeanOperationInfo[source.length];
+ for (int i = 0; i < source.length; i++)
+ {
+ operations[i] = source[i].toMBeanOperationInfo();
+ }
+ return operations;
+ }
+
+}