Author: meerajk
Date: Sat Jan  6 04:44:04 2007
New Revision: 493457

URL: http://svn.apache.org/viewvc?view=rev&rev=493457
Log:
Moved JMX management service from core to jmx-host.

Added:
    
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/JmxHostException.java
   (with props)
    
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/info/
    
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/info/JmxRuntimeInfo.java
   (with props)
    
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/info/JmxRuntimeInfoImpl.java
   (with props)
    
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/
    
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/JmxException.java
   (with props)
    
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/JmxManagementService.java
   (with props)
    
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/
    
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/AnnotationDrivenDynamicMBean.java
   (with props)
    
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/InstrumentationException.java
   (with props)
    
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/InstrumentedComponent.java
   (with props)
    
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/ReflectedDynamicMBean.java
   (with props)
Modified:
    
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/JmxRuntimeImpl.java

Added: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/JmxHostException.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/JmxHostException.java?view=auto&rev=493457
==============================================================================
--- 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/JmxHostException.java
 (added)
+++ 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/JmxHostException.java
 Sat Jan  6 04:44:04 2007
@@ -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 org.apache.tuscany.runtime.standalone.jmx;
+
+import org.apache.tuscany.api.TuscanyRuntimeException;
+
+/**
+ * Maps JMX exceptions to runtime exceptions.
+ * 
+ * @version $Revision$ $Date$
+ */
[EMAIL PROTECTED]("serial")
+public class JmxHostException extends TuscanyRuntimeException {
+
+    /**
+     * Initializes the root cause.
+     * @param cause Initializes the root cause.
+     */
+    public JmxHostException(Throwable cause) {
+        super(cause);
+    }
+
+}

Propchange: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/JmxHostException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/JmxHostException.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/JmxRuntimeImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/JmxRuntimeImpl.java?view=diff&rev=493457&r1=493456&r2=493457
==============================================================================
--- 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/JmxRuntimeImpl.java
 (original)
+++ 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/JmxRuntimeImpl.java
 Sat Jan  6 04:44:04 2007
@@ -22,6 +22,8 @@
 
 import org.osoa.sca.SCA;
 
+import org.apache.tuscany.runtime.standalone.jmx.info.JmxRuntimeInfo;
+import 
org.apache.tuscany.runtime.standalone.jmx.management.JmxManagementService;
 import org.apache.tuscany.spi.bootstrap.ComponentNames;
 import org.apache.tuscany.spi.bootstrap.RuntimeComponent;
 import org.apache.tuscany.spi.builder.BuilderException;
@@ -42,9 +44,6 @@
 import org.apache.tuscany.host.MonitorFactory;
 import org.apache.tuscany.host.RuntimeInfo;
 import org.apache.tuscany.host.runtime.InitializationException;
-
-import org.apache.tuscany.core.services.management.jmx.JmxManagementService;
-import org.apache.tuscany.core.services.management.jmx.runtime.JmxRuntimeInfo;
 
 /**
  * JMX runtime implementation.

Added: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/info/JmxRuntimeInfo.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/info/JmxRuntimeInfo.java?view=auto&rev=493457
==============================================================================
--- 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/info/JmxRuntimeInfo.java
 (added)
+++ 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/info/JmxRuntimeInfo.java
 Sat Jan  6 04:44:04 2007
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.runtime.standalone.jmx.info;
+
+import javax.management.MBeanServer;
+
+import org.apache.tuscany.runtime.standalone.StandaloneRuntimeInfo;
+
+/**
+ * Runtime info that gives access to the underlying JMX MBean server.
+ * 
+ * @version $Revision$ $Date$
+ *
+ */
+public interface JmxRuntimeInfo extends StandaloneRuntimeInfo {
+    
+    /** Component name. */
+    String COMPONENT_NAME = "JmxRuntimeInfo";
+    
+    /**
+     * Returns a reference to the mbean server used by the host.
+     * @return A reference to the host mbean server.
+     */
+    MBeanServer getMBeanServer();
+    
+    /**
+     * Returns the management domain used by the runtime.
+     * @return Management domain used by the runtime.
+     */
+    String getManagementDomain();
+
+}

Propchange: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/info/JmxRuntimeInfo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/info/JmxRuntimeInfo.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/info/JmxRuntimeInfoImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/info/JmxRuntimeInfoImpl.java?view=auto&rev=493457
==============================================================================
--- 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/info/JmxRuntimeInfoImpl.java
 (added)
+++ 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/info/JmxRuntimeInfoImpl.java
 Sat Jan  6 04:44:04 2007
@@ -0,0 +1,121 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.runtime.standalone.jmx.info;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Properties;
+
+import javax.management.MBeanServer;
+
+import org.apache.tuscany.runtime.standalone.DirectoryHelper;
+import org.apache.tuscany.runtime.standalone.StandaloneRuntimeInfoImpl;
+import org.apache.tuscany.runtime.standalone.jmx.JmxHostException;
+import org.apache.tuscany.runtime.standalone.jmx.management.JmxException;
+
+/**
+ * Implementation for the <code>JmxRuntimeInfo</code> interface.
+ *
+ * @version $Revision$ $Date$
+ */
+public class JmxRuntimeInfoImpl extends StandaloneRuntimeInfoImpl implements 
JmxRuntimeInfo {
+
+    /**
+     * MBean server reference.
+     */
+    private final MBeanServer mBeanServer;
+
+    /**
+     * Management domain.
+     */
+    private final String managementDomain;
+
+    /**
+     * Initializes the runtime info instance.
+     *
+     * @param profileName              the runtime's profile name
+     * @param installDirectory         directory containing the standalone 
installation
+     * @param profileDirectory         directory containing this runtime's 
profile
+     * @param online                   true if this runtime should consider 
itself online
+     * @param properties               properties for this runtime
+     * @param mBeanServer              mbean server.
+     * @param managementDomain         management domain for the runtime.
+     */
+    private JmxRuntimeInfoImpl(final String profileName,
+                               final File installDirectory,
+                               final File profileDirectory,
+                               final boolean online,
+                               final Properties properties,
+                               final MBeanServer mBeanServer,
+                               final String managementDomain) {
+        super(profileName, installDirectory, profileDirectory, null, online, 
properties);
+        this.mBeanServer = mBeanServer;
+        this.managementDomain = managementDomain;
+    }
+    
+    /**
+     * Initializes the runtime info instance.
+     *
+     * @param profileName              the runtime's profile name
+     * @param installDirectory         directory containing the standalone 
installation
+     * @param online                   true if this runtime should consider 
itself online
+     * @param mBeanServer              mbean server.
+     * @param managementDomain         management domain for the runtime.
+     */
+    public static JmxRuntimeInfoImpl newInstance(String profileName,
+                              File installDirectory,
+                              boolean online,
+                              final MBeanServer mBeanServer,
+                              final String managementDomain)
+    throws JmxException {
+        
+        // TODO This logic should move to super class's constructor
+        File profileDirectory;
+        try {
+            profileDirectory = 
DirectoryHelper.getProfileDirectory(installDirectory, profileName);
+            
+            // Load properties for this runtime
+            File propFile = new File(profileDirectory, 
"etc/runtime.properties");
+            Properties props = DirectoryHelper.loadProperties(propFile, 
System.getProperties());
+            
+            return new JmxRuntimeInfoImpl(profileName, installDirectory, 
profileDirectory, online, props, mBeanServer, managementDomain);
+        } catch (IOException ex) {
+            throw new JmxHostException(ex);
+        }
+        
+    }
+
+    /**
+     * @see 
org.apache.tuscany.core.services.management.jmx.runtime.JmxRuntimeInfo#getMBeanServer()
+     */
+    public final MBeanServer getMBeanServer() {
+        return mBeanServer;
+    }
+
+    /**
+     * Returns the default domain used by the host.
+     *
+     * @return Default domain used by the host.
+     */
+    public final String getManagementDomain() {
+        return managementDomain;
+    }
+
+}

Propchange: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/info/JmxRuntimeInfoImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/info/JmxRuntimeInfoImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/JmxException.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/JmxException.java?view=auto&rev=493457
==============================================================================
--- 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/JmxException.java
 (added)
+++ 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/JmxException.java
 Sat Jan  6 04:44:04 2007
@@ -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 org.apache.tuscany.runtime.standalone.jmx.management;
+
+import org.apache.tuscany.api.TuscanyRuntimeException;
+
+/**
+ * Maps JMX exceptions to runtime exceptions.
+ * 
+ * @version $Revision$ $Date$
+ */
[EMAIL PROTECTED]("serial")
+public class JmxException extends TuscanyRuntimeException {
+
+    /**
+     * Initializes the root cause.
+     * @param cause Initializes the root cause.
+     */
+    public JmxException(Throwable cause) {
+        super(cause);
+    }
+
+}

Propchange: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/JmxException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/JmxException.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/JmxManagementService.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/JmxManagementService.java?view=auto&rev=493457
==============================================================================
--- 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/JmxManagementService.java
 (added)
+++ 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/JmxManagementService.java
 Sat Jan  6 04:44:04 2007
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.runtime.standalone.jmx.management;
+
+import javax.management.JMException;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import 
org.apache.tuscany.runtime.standalone.jmx.management.instrument.InstrumentedComponent;
+import org.apache.tuscany.spi.component.Component;
+import org.apache.tuscany.spi.services.management.ManagementService;
+
+/**
+ * JMX implementation of the management service.
+ *
+ * @version $Revision$ $Date$
+ */
+public class JmxManagementService implements ManagementService {
+
+    /**
+     * MBean server used by the JMX management service.
+     */
+    private final MBeanServer mBeanServer;
+
+    /**
+     * Management domain used by the runtime.
+     */
+    private final String managementDomain;
+
+
+    /**
+     * Constructor that initializes the MBeanServer and domain to use for 
registering components.
+     *
+     * @param mBeanServer the MBeanServer components should be registered with
+     * @param managementDomain the JMX domain to use when generating 
ObjectNames
+     */
+    public JmxManagementService(MBeanServer mBeanServer, String 
managementDomain) {
+        this.mBeanServer = mBeanServer;
+        this.managementDomain = managementDomain;
+    }
+
+    /**
+     * @throws JmxException In case of an unexpected JMX exception.
+     * @see 
org.apache.tuscany.spi.services.management.ManagementService#registerComponent(
+     *java.lang.String,org.apache.tuscany.spi.component.Component)
+     */
+    public final void registerComponent(String name, Component component) 
throws JmxException {
+
+        try {
+            ObjectName on = new ObjectName(managementDomain + ":" + 
"type=component,name=" + name);
+            InstrumentedComponent mbean = new InstrumentedComponent(component);
+            mBeanServer.registerMBean(mbean, on);
+        } catch (JMException ex) {
+            throw new JmxException(ex);
+        }
+
+    }
+}

Propchange: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/JmxManagementService.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/JmxManagementService.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/AnnotationDrivenDynamicMBean.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/AnnotationDrivenDynamicMBean.java?view=auto&rev=493457
==============================================================================
--- 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/AnnotationDrivenDynamicMBean.java
 (added)
+++ 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/AnnotationDrivenDynamicMBean.java
 Sat Jan  6 04:44:04 2007
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.runtime.standalone.jmx.management.instrument;
+
+import javax.management.Attribute;
+import javax.management.AttributeList;
+import javax.management.AttributeNotFoundException;
+import javax.management.DynamicMBean;
+import javax.management.InvalidAttributeValueException;
+import javax.management.MBeanException;
+import javax.management.MBeanInfo;
+import javax.management.ReflectionException;
+
+/**
+ * Dynamic MBean based on management annotations.
+ *
+ * @version $Revision$ $Date$
+ */
+public class AnnotationDrivenDynamicMBean implements DynamicMBean {
+
+    /**
+     * @see javax.management.DynamicMBean#getAttribute(java.lang.String)
+     */
+    public Object getAttribute(String attribute)
+        throws AttributeNotFoundException, MBeanException, ReflectionException 
{
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @see javax.management.DynamicMBean#getAttributes(java.lang.String[])
+     */
+    public AttributeList getAttributes(String[] attributes) {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @see javax.management.DynamicMBean#getMBeanInfo()
+     */
+    public MBeanInfo getMBeanInfo() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @see 
javax.management.DynamicMBean#invoke(java.lang.String,java.lang.Object[],java.lang.String[])
+     */
+    public Object invoke(String actionName, Object[] params, String[] 
signature) throws MBeanException,
+                                                                               
         ReflectionException {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @see 
javax.management.DynamicMBean#setAttribute(javax.management.Attribute)
+     */
+    public void setAttribute(Attribute attribute) throws 
AttributeNotFoundException, InvalidAttributeValueException,
+                                                         MBeanException, 
ReflectionException {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @see 
javax.management.DynamicMBean#setAttributes(javax.management.AttributeList)
+     */
+    public AttributeList setAttributes(AttributeList attributes) {
+        throw new UnsupportedOperationException();
+    }
+
+}

Propchange: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/AnnotationDrivenDynamicMBean.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/AnnotationDrivenDynamicMBean.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/InstrumentationException.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/InstrumentationException.java?view=auto&rev=493457
==============================================================================
--- 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/InstrumentationException.java
 (added)
+++ 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/InstrumentationException.java
 Sat Jan  6 04:44:04 2007
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.runtime.standalone.jmx.management.instrument;
+
+import org.apache.tuscany.api.TuscanyRuntimeException;
+
+/**
+ * Excpetion thrown when there is an instrumentation error.
+ * 
+ * @version $Revison$ $Date$
+ *
+ */
[EMAIL PROTECTED]("serial")
+public class InstrumentationException extends TuscanyRuntimeException {
+
+    /**
+     * Initializes the root cause.
+     * @param cause Initializes the root cause.
+     */
+    public InstrumentationException(Throwable cause) {
+        super(cause);
+    }
+
+    /**
+     * Initializes the message.
+     * @param message Initializes the message.
+     */
+    public InstrumentationException(String message) {
+        super(message);
+    }
+
+}

Propchange: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/InstrumentationException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/InstrumentationException.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/InstrumentedComponent.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/InstrumentedComponent.java?view=auto&rev=493457
==============================================================================
--- 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/InstrumentedComponent.java
 (added)
+++ 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/InstrumentedComponent.java
 Sat Jan  6 04:44:04 2007
@@ -0,0 +1,136 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.runtime.standalone.jmx.management.instrument;
+
+import java.util.Map;
+import javax.management.Attribute;
+import javax.management.AttributeList;
+import javax.management.AttributeNotFoundException;
+import javax.management.DynamicMBean;
+import javax.management.MBeanAttributeInfo;
+import javax.management.MBeanConstructorInfo;
+import javax.management.MBeanInfo;
+import javax.management.MBeanNotificationInfo;
+import javax.management.MBeanOperationInfo;
+
+import org.w3c.dom.Document;
+
+import org.apache.tuscany.spi.component.Component;
+import org.apache.tuscany.spi.model.PropertyValue;
+
+/**
+ * This is Ruscany component exposed as a dynamic MBean. Currently it only 
supports a read-only vew of all the
+ * properties on the component.
+ *
+ * @version $Revision$ $Date$
+ */
+public class InstrumentedComponent implements DynamicMBean {
+
+    /**
+     * Properties available on the component.
+     */
+    private final Map<String, PropertyValue<?>> properties;
+
+    /**
+     * Name of the component.
+     */
+    private String componentName;
+
+    /**
+     * Initializes the property values.
+     *
+     * @param component Component that is being managed.
+     */
+    @SuppressWarnings("unchecked")
+    public InstrumentedComponent(final Component component) {
+        this.properties = component.getDefaultPropertyValues();
+        this.componentName = component.getName();
+    }
+
+    /**
+     * @see javax.management.DynamicMBean#getAttribute(java.lang.String)
+     */
+    public final Object getAttribute(final String attribute) throws 
AttributeNotFoundException {
+        PropertyValue<?> propertyValue = properties.get(attribute);
+        if (propertyValue != null) {
+            return propertyValue.getValue();
+        }
+        throw new AttributeNotFoundException(attribute + " not found.");
+    }
+
+    /**
+     * @see javax.management.DynamicMBean#getAttributes(java.lang.String[])
+     */
+    public final AttributeList getAttributes(final String[] attributes) {
+
+        AttributeList list = new AttributeList();
+        for (String attribute : attributes) {
+            try {
+                list.add(new Attribute(attribute, getAttribute(attribute)));
+            } catch (AttributeNotFoundException ex) {
+                throw new InstrumentationException(ex);
+            }
+        }
+        return list;
+
+    }
+
+    /**
+     * @see javax.management.DynamicMBean#getMBeanInfo()
+     */
+    public final MBeanInfo getMBeanInfo() {
+
+        final MBeanConstructorInfo[] constructors = null;
+        final MBeanOperationInfo[] operations = null;
+        final MBeanNotificationInfo[] notifications = null;
+
+        final MBeanAttributeInfo[] attributes = new 
MBeanAttributeInfo[properties.size()];
+
+        int i = 0;
+        for (PropertyValue<?> propertyValue : properties.values()) {
+            attributes[i++] =
+                new MBeanAttributeInfo(propertyValue.getName(), 
Document.class.getName(), null, true, false, false);
+        }
+
+        return new MBeanInfo(componentName, null, attributes, constructors, 
operations, notifications);
+
+    }
+
+    /**
+     * @see 
javax.management.DynamicMBean#invoke(java.lang.String,java.lang.Object[],java.lang.String[])
+     */
+    public final Object invoke(final String actionName, final Object[] params, 
final String[] signature) {
+        throw new UnsupportedOperationException("Managed ops not supported");
+    }
+
+    /**
+     * @see 
javax.management.DynamicMBean#setAttribute(javax.management.Attribute)
+     */
+    public final void setAttribute(final Attribute attribute) {
+        throw new UnsupportedOperationException("Mutable props not supported");
+    }
+
+    /**
+     * @see 
javax.management.DynamicMBean#setAttributes(javax.management.AttributeList)
+     */
+    public final AttributeList setAttributes(final AttributeList attributes) {
+        throw new UnsupportedOperationException("Mutable props not supported");
+    }
+
+}

Propchange: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/InstrumentedComponent.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/InstrumentedComponent.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/ReflectedDynamicMBean.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/ReflectedDynamicMBean.java?view=auto&rev=493457
==============================================================================
--- 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/ReflectedDynamicMBean.java
 (added)
+++ 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/ReflectedDynamicMBean.java
 Sat Jan  6 04:44:04 2007
@@ -0,0 +1,353 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.runtime.standalone.jmx.management.instrument;
+
+import java.beans.BeanInfo;
+import java.beans.IntrospectionException;
+import java.beans.Introspector;
+import java.beans.MethodDescriptor;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.management.Attribute;
+import javax.management.AttributeList;
+import javax.management.AttributeNotFoundException;
+import javax.management.DynamicMBean;
+import javax.management.InvalidAttributeValueException;
+import javax.management.MBeanAttributeInfo;
+import javax.management.MBeanException;
+import javax.management.MBeanInfo;
+import javax.management.MBeanOperationInfo;
+import javax.management.ReflectionException;
+
+/**
+ * Uses JMX dynamic MBean to expose management information of a delegate 
instance using reflection. Currently
+ * constructor and notification metadata are not supported. Any attribute or 
operation that needs to be excluded from
+ * the management information can be specified optionally in the factory 
method.
+ * <p/>
+ * All the methods and properties on <code>java.lang.Object</code> are 
excluded by default. Also only public and
+ * non-static members are made available for management.
+ * <p/>
+ * TODO Find a homw other than server.start for this class. TODO Tidy up, unit 
tests
+ *
+ * @version $Revsion$ $Date$
+ */
+public class ReflectedDynamicMBean implements DynamicMBean {
+
+    /**
+     * Excluded methods.
+     */
+    private static final List<String> DEFAULT_EXCLUDED_METHODS =
+        Arrays.asList(new String[]{"wait", "toString", "hashCode", "notify", 
"equals", "notifyAll", "getClass"});
+
+    /**
+     * Excluded properties.
+     */
+    private static final List<String> DEFAULT_EXCLUDED_PROPERTIES = 
Arrays.asList(new String[]{"class"});
+
+    /**
+     * Proxied object that is managed.
+     */
+    private Object delegate;
+
+    /**
+     * Runtime type of the managed object.
+     */
+    private Class delegateClass;
+
+    /**
+     * Delegate class name.
+     */
+    private String delegateClassName;
+
+    /**
+     * Cache of property write methods.
+     */
+    private Map<String, Method> propertyWriteMethods = new HashMap<String, 
Method>();
+
+    /**
+     * Cache of property read methods.
+     */
+    private Map<String, Method> propertyReadMethods = new HashMap<String, 
Method>();
+
+    /**
+     * Managed operation cache.
+     */
+    private Map<String, Method> methods = new HashMap<String, Method>();
+
+    /**
+     * Property descriptor cache.
+     */
+    private Map<String, PropertyDescriptor> properties = new HashMap<String, 
PropertyDescriptor>();
+
+    /**
+     * Excluded methods.
+     */
+    private final List<String> excludedMethods = new ArrayList<String>();
+
+    /**
+     * Excluded properties.
+     */
+    private final List<String> excludedProperties = new ArrayList<String>();
+
+    /**
+     * Introspects the bean and populate meta information.
+     *
+     * @param delegate Proxied managed instance.
+     */
+    private ReflectedDynamicMBean(Object delegate) {
+        this(delegate, new ArrayList<String>(), new ArrayList<String>());
+    }
+
+    /**
+     * Introspects the bean and populate meta information.
+     *
+     * @param delegate           Proxied managed instance.
+     * @param excludedMethods    Operations excluded from managed view.
+     * @param excludedProperties Properties excluded from managed view.
+     */
+    private ReflectedDynamicMBean(Object delegate, List<String> 
excludedMethods, List<String> excludedProperties) {
+
+        this.delegate = delegate;
+        this.delegateClass = delegate.getClass();
+        this.delegateClassName = delegateClass.getName();
+
+        this.excludedMethods.addAll(excludedMethods);
+        this.excludedMethods.addAll(DEFAULT_EXCLUDED_METHODS);
+        this.excludedProperties.addAll(excludedProperties);
+        this.excludedProperties.addAll(DEFAULT_EXCLUDED_PROPERTIES);
+
+        BeanInfo beanInfo;
+        try {
+            beanInfo = Introspector.getBeanInfo(delegateClass);
+        } catch (IntrospectionException ex) {
+            throw new InstrumentationException(ex);
+        }
+
+        cacheProperties(beanInfo);
+
+        cacheMethods(beanInfo);
+    }
+
+    /**
+     * Factory method for creating the management view.
+     *
+     * @param delegate           Proxied managed instance.
+     * @param excludedMethods    Operations excluded from managed view.
+     * @param excludedProperties Properties excluded from managed view.
+     * @return Proxy for the managed instance.
+     */
+    public static ReflectedDynamicMBean newInstance(Object delegate, 
List<String> excludedMethods,
+                                                    List<String> 
excludedProperties) {
+        return new ReflectedDynamicMBean(delegate, excludedMethods, 
excludedProperties);
+    }
+
+    /**
+     * Factory method for creating the management view.
+     *
+     * @param delegate Proxied managed instance.
+     * @return Proxy for the managed instance.
+     */
+    public static ReflectedDynamicMBean newInstance(Object delegate) {
+        return new ReflectedDynamicMBean(delegate);
+    }
+
+    /**
+     * @see javax.management.DynamicMBean#getAttribute(java.lang.String)
+     */
+    public Object getAttribute(String attribute)
+        throws AttributeNotFoundException, MBeanException, ReflectionException 
{
+
+        Method readMethod = propertyReadMethods.get(attribute);
+        if (readMethod == null) {
+            throw new AttributeNotFoundException(attribute + " not found");
+        }
+        try {
+            return readMethod.invoke(delegate);
+        } catch (IllegalAccessException ex) {
+            throw new ReflectionException(ex);
+        } catch (InvocationTargetException ex) {
+            throw new ReflectionException(ex);
+        }
+
+    }
+
+    /**
+     * @see javax.management.DynamicMBean#getAttributes(java.lang.String[])
+     */
+    public AttributeList getAttributes(String[] attributes) {
+
+        AttributeList list = new AttributeList();
+        for (String attribute : attributes) {
+            try {
+                list.add(new Attribute(attribute, getAttribute(attribute)));
+            } catch (AttributeNotFoundException ex) {
+                throw new InstrumentationException(ex);
+            } catch (MBeanException ex) {
+                throw new InstrumentationException(ex);
+            } catch (ReflectionException ex) {
+                throw new InstrumentationException(ex);
+            }
+        }
+        return list;
+
+    }
+
+    /**
+     * @see javax.management.DynamicMBean#getMBeanInfo()
+     */
+    public MBeanInfo getMBeanInfo() {
+
+        try {
+
+            MBeanAttributeInfo[] attrs = new 
MBeanAttributeInfo[properties.keySet().size()];
+            int count = 0;
+            for (String property : properties.keySet()) {
+                Method readMethod = propertyReadMethods.get(property);
+                Method writeMethod = propertyWriteMethods.get(property);
+                attrs[count++] = new MBeanAttributeInfo(property, "", 
readMethod, writeMethod);
+            }
+
+            MBeanOperationInfo[] ops = new 
MBeanOperationInfo[methods.keySet().size()];
+            count = 0;
+            for (Method method : methods.values()) {
+                ops[count++] = new MBeanOperationInfo("", method);
+            }
+
+            MBeanInfo mBeanInfo = new MBeanInfo(delegateClassName, "", attrs, 
null, ops, null);
+            return mBeanInfo;
+
+        } catch (javax.management.IntrospectionException ex) {
+            throw new InstrumentationException(ex);
+        }
+
+    }
+
+    /**
+     * @see 
javax.management.DynamicMBean#invoke(java.lang.String,java.lang.Object[],java.lang.String[])
+     */
+    public Object invoke(String actionName, Object[] params, String[] 
signature) throws MBeanException,
+                                                                               
         ReflectionException {
+
+        Method method = methods.get(actionName);
+        if (method == null) {
+            throw new InstrumentationException("Operation not found: " + 
actionName);
+        }
+        try {
+            return method.invoke(delegate, params);
+        } catch (IllegalAccessException ex) {
+            throw new ReflectionException(ex);
+        } catch (InvocationTargetException ex) {
+            throw new ReflectionException(ex);
+        }
+
+    }
+
+    /**
+     * @see 
javax.management.DynamicMBean#setAttribute(javax.management.Attribute)
+     */
+    public void setAttribute(Attribute attribute) throws 
AttributeNotFoundException, InvalidAttributeValueException,
+                                                         MBeanException, 
ReflectionException {
+
+        Method writeMethod = propertyWriteMethods.get(attribute.getName());
+        if (writeMethod == null) {
+            throw new AttributeNotFoundException(attribute + " not found");
+        }
+        try {
+            writeMethod.invoke(delegate, attribute.getValue());
+        } catch (IllegalAccessException ex) {
+            throw new ReflectionException(ex);
+        } catch (InvocationTargetException ex) {
+            throw new ReflectionException(ex);
+        }
+
+    }
+
+    /**
+     * @see 
javax.management.DynamicMBean#setAttributes(javax.management.AttributeList)
+     */
+    public AttributeList setAttributes(AttributeList attributes) {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Caches managed operations.
+     *
+     * @param beanInfo Bean info for the managed instance.
+     */
+    private void cacheMethods(BeanInfo beanInfo) {
+
+        for (MethodDescriptor methodDescriptor : 
beanInfo.getMethodDescriptors()) {
+
+            Method method = methodDescriptor.getMethod();
+            String name = method.getName();
+
+            if (excludedMethods.contains(name)) {
+                continue;
+            }
+            int modifiers = method.getModifiers();
+            if (!Modifier.isPublic(modifiers) || Modifier.isStatic(modifiers)) 
{
+                continue;
+            }
+            if (propertyReadMethods.values().contains(method) || 
propertyWriteMethods.values().contains(method)) {
+                continue;
+            }
+
+            // TODO Add support for overloaded methods
+            methods.put(name, method);
+
+        }
+
+    }
+
+    /**
+     * Caches managed properties.
+     *
+     * @param beanInfo Bean info for the managed instance.
+     */
+    private void cacheProperties(BeanInfo beanInfo) {
+        for (PropertyDescriptor propertyDescriptor : 
beanInfo.getPropertyDescriptors()) {
+
+            String name = propertyDescriptor.getName();
+
+            if (excludedProperties.contains(name)) {
+                continue;
+            }
+            properties.put(name, propertyDescriptor);
+
+            Method readMethod = propertyDescriptor.getReadMethod();
+            if (readMethod != null && 
Modifier.isPublic(readMethod.getModifiers())) {
+                propertyReadMethods.put(name, readMethod);
+            }
+
+            Method writeMethod = propertyDescriptor.getWriteMethod();
+            if (writeMethod != null && 
Modifier.isPublic(writeMethod.getModifiers())) {
+                propertyWriteMethods.put(name, writeMethod);
+            }
+
+        }
+    }
+
+}

Propchange: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/ReflectedDynamicMBean.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/runtime/standalone/jmx-host/src/main/java/org/apache/tuscany/runtime/standalone/jmx/management/instrument/ReflectedDynamicMBean.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to