Return-Path: Delivered-To: apmail-incubator-felix-commits-archive@www.apache.org Received: (qmail 93649 invoked from network); 9 Sep 2006 16:06:51 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 9 Sep 2006 16:06:51 -0000 Received: (qmail 82937 invoked by uid 500); 9 Sep 2006 16:06:51 -0000 Delivered-To: apmail-incubator-felix-commits-archive@incubator.apache.org Received: (qmail 82894 invoked by uid 500); 9 Sep 2006 16:06:51 -0000 Mailing-List: contact felix-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: felix-dev@incubator.apache.org Delivered-To: mailing list felix-commits@incubator.apache.org Received: (qmail 82882 invoked by uid 99); 9 Sep 2006 16:06:51 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 09 Sep 2006 09:06:51 -0700 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received-SPF: pass (asf.osuosl.org: local policy) Received: from [140.211.166.113] (HELO eris.apache.org) (140.211.166.113) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 09 Sep 2006 09:06:49 -0700 Received: by eris.apache.org (Postfix, from userid 65534) id 09A5C1A981A; Sat, 9 Sep 2006 09:06:29 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r441807 - in /incubator/felix/trunk/jmxintrospector: ./ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/felix/ src/main/java/org/apache/felix/jmxintrospector/ src/main/java/org/apache/feli... Date: Sat, 09 Sep 2006 16:06:28 -0000 To: felix-commits@incubator.apache.org From: santillan@apache.org X-Mailer: svnmailer-1.1.0 Message-Id: <20060909160629.09A5C1A981A@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: santillan Date: Sat Sep 9 09:06:26 2006 New Revision: 441807 URL: http://svn.apache.org/viewvc?view=rev&rev=441807 Log: jmx introspector is a small bundle that creates dynamic proxies for remote mbeans. See README.txt for details Added: incubator/felix/trunk/jmxintrospector/README.txt incubator/felix/trunk/jmxintrospector/pom.xml incubator/felix/trunk/jmxintrospector/src/ incubator/felix/trunk/jmxintrospector/src/main/ incubator/felix/trunk/jmxintrospector/src/main/java/ incubator/felix/trunk/jmxintrospector/src/main/java/org/ incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/ incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/ incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/ incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/MBean.java incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/MBeanProxyFactory.java incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/MBeanProxyManager.java incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/Server.java incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/classbean/ incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/classbean/TypeGetter.java incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/classbean/TypeGetterMBean.java incubator/felix/trunk/jmxintrospector/src/test/ incubator/felix/trunk/jmxintrospector/src/test/java/ incubator/felix/trunk/jmxintrospector/src/test/java/org/ incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/ incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/ incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/ incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/IntrospectorTestHarness.java incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/MBeanProxyFactoryTestCase.java incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/OutOfProcessTestHarness.java incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/RemoteMBeanProxyFactoryTestCase.java incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/ScriptTestCase.java Added: incubator/felix/trunk/jmxintrospector/README.txt URL: http://svn.apache.org/viewvc/incubator/felix/trunk/jmxintrospector/README.txt?view=auto&rev=441807 ============================================================================== --- incubator/felix/trunk/jmxintrospector/README.txt (added) +++ incubator/felix/trunk/jmxintrospector/README.txt Sat Sep 9 09:06:26 2006 @@ -0,0 +1,27 @@ +JMX introspector is a small library bundle that +uses the Javassist library, the reflection API and +the metadata provided by JMX on the managed objects +to dynamically proxy remote MBeans, without having +the classes in your classpath. +It can be used to create management consoles that do not +need to have the remote mbeans classes in its classpath to +use dynamic proxies. + +It is used by the org.apache.felix.mishell project to create management clients +for felix jmood, but it can be used to manage any JMX agent. + +It currently uses Javassist version 3.3 for the generation +of the interface classes, which is part of JBoss and +can be downloaded from http://www.jboss.org +or directly from https://sourceforge.net/project/showfiles.php?group_id=22866&package_id=80766 +Javassist is licensed under the Mozilla Public License and the LGPL. +IMPORTANT: +You need to install Javassist manually to your local maven repository +in order to build this bundle, as it is not available at the repositories yet: + +mvn install:install-file -Dfile= -DgroupId=javassist \ + -DartifactId=javassist -Dversion=3.3 -Dpackaging=jar + +//TODO + + Added: incubator/felix/trunk/jmxintrospector/pom.xml URL: http://svn.apache.org/viewvc/incubator/felix/trunk/jmxintrospector/pom.xml?view=auto&rev=441807 ============================================================================== --- incubator/felix/trunk/jmxintrospector/pom.xml (added) +++ incubator/felix/trunk/jmxintrospector/pom.xml Sat Sep 9 09:06:26 2006 @@ -0,0 +1,62 @@ + + + org.apache.felix + felix + 0.8.0-SNAPSHOT + + 4.0.0 + JMXIntrospector + osgi-bundle + ${groupId}.jmxintrospector + + + junit + junit + 3.8.1 + test + + + javassist + javassist + 3.3 + + + + + + org.apache.felix.plugins + maven-osgi-plugin + ${pom.version} + true + + + javassist + + + ${name} + ${artifactId} + + org.apache.felix.jmxintrospector + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.6 + 1.6 + + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + + Added: incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/MBean.java URL: http://svn.apache.org/viewvc/incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/MBean.java?view=auto&rev=441807 ============================================================================== --- incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/MBean.java (added) +++ incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/MBean.java Sat Sep 9 09:06:26 2006 @@ -0,0 +1,31 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.felix.jmxintrospector; + +import javax.management.MBeanInfo; +import javax.management.MBeanServerConnection; + +/** + * Proxies returned implement this interface, to ease handling of mbeans (filtering and so on) + * + */ +public interface MBean { + public String getObjectName(); + public MBeanServerConnection getMBeanServer(); + public MBeanInfo getMBeanInfo(); +} Added: incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/MBeanProxyFactory.java URL: http://svn.apache.org/viewvc/incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/MBeanProxyFactory.java?view=auto&rev=441807 ============================================================================== --- incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/MBeanProxyFactory.java (added) +++ incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/MBeanProxyFactory.java Sat Sep 9 09:06:26 2006 @@ -0,0 +1,192 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.felix.jmxintrospector; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.ArrayList; +import java.util.List; + +import javassist.CannotCompileException; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; +import javassist.NotFoundException; + +import javax.management.MBeanAttributeInfo; +import javax.management.MBeanInfo; +import javax.management.MBeanNotificationInfo; +import javax.management.MBeanOperationInfo; +import javax.management.MBeanServerConnection; +import javax.management.MBeanServerInvocationHandler; +import javax.management.NotificationEmitter; +import javax.management.ObjectName; + +import org.apache.felix.jmxintrospector.classbean.TypeGetterMBean; + +public class MBeanProxyFactory { + private MBeanServerConnection mbeanServer; + + public MBeanProxyFactory(){ + } + + public MBeanProxyFactory(MBeanServerConnection mbeanServer) { + super(); + this.mbeanServer = mbeanServer; + + } + + private Class getInterface(String oname)throws Exception{ + ObjectName objectName=ObjectName.getInstance(oname); + + String ifaceName=mbeanServer.getObjectInstance(objectName).getClassName().replace('.', '_'); + CtClass ctIface=null; + try{ + ctIface=javassist.ClassPool.getDefault().get(ifaceName); + return this.getClass().getClassLoader().loadClass(ifaceName); + }catch (Exception e) { + ctIface=javassist.ClassPool.getDefault().makeInterface(ifaceName); + for (CtMethod m : addMethods(ctIface, objectName)) { + ctIface.addMethod(m); + } + try { + return ctIface.toClass(this.getClass().getClassLoader(), this.getClass().getProtectionDomain()); + } catch (CannotCompileException cce) { + System.out.println(cce.getCause()); + throw cce; + } + } + + } + private List addMethods(CtClass ctIface, ObjectName objectName)throws Exception{ + ClassPool pool=javassist.ClassPool.getDefault(); + List methods=new ArrayList(); + MBeanInfo minfo =mbeanServer.getMBeanInfo(objectName); + CtMethod m=null; + + for (MBeanAttributeInfo info : minfo.getAttributes()) { + String name=info.getName().substring(0, 1).toUpperCase()+info.getName().substring(1); + if(info.isReadable()){ + if(info.isIs()){ + m=new CtMethod(CtClass.booleanType, "is"+ name,null, ctIface); + methods.add(m); + } + else{ +// try { + m=new CtMethod(pool.get(info.getType()), "get"+ name,null, ctIface); +// }catch (NotFoundException nfe) { +// String n=nfe.getMessage(); +// String notFoundName=n.startsWith("[")?n.substring(1, n.length()):n; +// Class notFound=(Class)mbeanServer.invoke(ObjectName.getInstance(TypeGetterMBean.MBEAN_NAME), "getType", new Object[] {notFoundName}, new String[] {String.class.getName()}); +// +// m=new CtMethod(pool.get(info.getType()), "get"+ name,null, ctIface); +// } + methods.add(m); + } + + } + + if(info.isWritable()){ + m=new CtMethod(CtClass.voidType, "set"+ name,new CtClass[]{pool.get(info.getType())} , ctIface); + methods.add(m); + } + } + for (MBeanOperationInfo info : minfo.getOperations()) { + CtClass[] params=new CtClass[info.getSignature().length]; + for (int i = 0; i < params.length; i++) { + params[i]=pool.get(info.getSignature()[i].getType()); + } + m=new CtMethod(pool.get(info.getReturnType()), info.getName(),params, ctIface); + methods.add(m); + + } + return methods; + } + /** + * Returns a proxy object for the MBean specified by the object name oname in the + * mbean server associated with this factory. This proxy object implements + * @param oname + * @return + * @throws Exception + */ + public Object newProxyInstance(String oname)throws Exception{ + ObjectName objectName=ObjectName.getInstance(oname); + Class iface=getInterface(oname); + MBeanInfo info=mbeanServer.getMBeanInfo(objectName); + boolean isBroadcaster=false; + MBeanNotificationInfo[] notifs=info.getNotifications(); + if (notifs!=null && notifs.length!=0) isBroadcaster=true; + Object proxy=MBeanServerInvocationHandler.newProxyInstance(mbeanServer, objectName, iface, isBroadcaster); + InvocationHandler h=Proxy.getInvocationHandler(proxy); + InvocationHandler wrapper=new JMXInvocationHandler(oname,mbeanServer, mbeanServer.getMBeanInfo(objectName), h); + Class[] ifaces; + if (isBroadcaster) { + ifaces=new Class[]{iface, NotificationEmitter.class, MBean.class}; + }else ifaces=new Class[]{iface, MBean.class}; + Object mbeanProxy=Proxy.newProxyInstance(proxy.getClass().getClassLoader(), ifaces, wrapper); + return mbeanProxy; + } + private class JMXInvocationHandler implements InvocationHandler, MBean{ + private String objectName; + private MBeanServerConnection mBeanServer; + private InvocationHandler mbeanHandler; + private MBeanInfo mbeanInfo; + + public JMXInvocationHandler(String objectName, MBeanServerConnection mbeanServer, MBeanInfo mBeanInfo, InvocationHandler mbeanHandler) { + super(); + this.objectName = objectName; + this.mBeanServer = mbeanServer; + this.mbeanHandler = mbeanHandler; + this.mbeanInfo =mBeanInfo; + + } + + //FIXME: hashCode() and equals do not work if not exposed in management interface + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + if(method.getDeclaringClass().equals(MBean.class)){ + return this.getClass().getMethod(method.getName(), null).invoke(this, args); + } + else return mbeanHandler.invoke(proxy, method, args); + } + + public MBeanServerConnection getMBeanServer() { + return mBeanServer; + } + + public String getObjectName() { + return objectName; + } + + public MBeanInfo getMBeanInfo() { + return mbeanInfo; + } + + + + } + + public MBeanServerConnection getMbeanServer() { + return mbeanServer; + } + + public void setMbeanServer(MBeanServerConnection mbs) { + this.mbeanServer = mbs; + } + +} Added: incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/MBeanProxyManager.java URL: http://svn.apache.org/viewvc/incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/MBeanProxyManager.java?view=auto&rev=441807 ============================================================================== --- incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/MBeanProxyManager.java (added) +++ incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/MBeanProxyManager.java Sat Sep 9 09:06:26 2006 @@ -0,0 +1,136 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.felix.jmxintrospector; + +import java.lang.management.ManagementFactory; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.management.MBeanServerConnection; +import javax.management.MBeanServerFactory; +import javax.management.ObjectName; +import javax.management.remote.JMXConnectorFactory; +import javax.management.remote.JMXServiceURL; + +public class MBeanProxyManager { + //FIXME: mixing up Server and MBeanServerConnections is dirty and error-prone + private List servers = new ArrayList(); + + private List objects = new ArrayList(); + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public void addRMIServer(String host, String path) throws Exception { + addRMIServer(host, path, 1099); + } + + public void addRMIServer(String host, String path, int port) + throws Exception { + addRemoteServer("service:jmx:rmi:///jndi/rmi://" + host + ":" + port + path); + } + + public void addRemoteServer(String url) throws Exception { + JMXServiceURL u = new JMXServiceURL(url); + MBeanServerConnection s = JMXConnectorFactory.connect(u) + .getMBeanServerConnection(); + add(url, s); + } + + public void addLocalServer() throws Exception { + MBeanServerConnection s=ManagementFactory.getPlatformMBeanServer(); + add(s.getDefaultDomain(), s); + } + + private void add(String id, MBeanServerConnection s) throws Exception { + Server server=new Server(s,id); + servers.add(server); + Set onames = s.queryNames(ObjectName.WILDCARD, null); + MBeanProxyFactory introspector = new MBeanProxyFactory(server); + for (ObjectName name : onames) { + try { + objects.add(introspector.newProxyInstance(name + .toString())); + } catch (javassist.NotFoundException nfe) { + + logger.warning("ERROR"+nfe); + continue; + } + } + } + + public void removeServer(Server server) { + servers.remove(server); + for (Object o : objects) { + if (((MBean)o).getMBeanServer().equals(server)) objects.remove(o); + } + } + /////////// + //Finders// + /////////// + public List getObjects() { + return objects; + } + public Object findFirst(String substring){ + return findFirst(substring, null); + } + public Object findFirst(String substring, Server server){ + for (Object o :objects){ + MBean bean=(MBean)o; + if (isTheServer(bean, server)&&bean.getObjectName().contains(substring)){ + return o; + } + } + return null; + } + private boolean isTheServer(MBean bean, MBeanServerConnection server){ + return server==null?true:bean.getMBeanServer().equals(server); + } + public List findAll(String substring){ + return findAll(substring, null); + } + + public List findAll(String substring, MBeanServerConnection server){ + List matches=new ArrayList(); + for (Object o :objects){ + MBean bean=(MBean)o; + if (isTheServer(bean, server)&&bean.getObjectName().contains(substring)){ + matches.add(o); + } + } + return matches; + } + + public List findMatches(String regex){ + List matches=new ArrayList(); + for (Object o :objects){ + if (((MBean)o).getObjectName().matches(regex)){ + matches.add(o); + } + } + return matches; + } + + public List getServers() { + return servers; + } +} Added: incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/Server.java URL: http://svn.apache.org/viewvc/incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/Server.java?view=auto&rev=441807 ============================================================================== --- incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/Server.java (added) +++ incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/Server.java Sat Sep 9 09:06:26 2006 @@ -0,0 +1,110 @@ +package org.apache.felix.jmxintrospector; + +import java.io.IOException; +import java.util.Set; + +import javax.management.Attribute; +import javax.management.AttributeList; +import javax.management.AttributeNotFoundException; +import javax.management.InstanceAlreadyExistsException; +import javax.management.InstanceNotFoundException; +import javax.management.IntrospectionException; +import javax.management.InvalidAttributeValueException; +import javax.management.ListenerNotFoundException; +import javax.management.MBeanException; +import javax.management.MBeanInfo; +import javax.management.MBeanRegistrationException; +import javax.management.MBeanServerConnection; +import javax.management.NotCompliantMBeanException; +import javax.management.NotificationFilter; +import javax.management.NotificationListener; +import javax.management.ObjectInstance; +import javax.management.ObjectName; +import javax.management.QueryExp; +import javax.management.ReflectionException; + +public class Server implements MBeanServerConnection { + private MBeanServerConnection server; + private String id; + public Server(MBeanServerConnection server, String id){ + this.server=server; + this.id=id; + } + + //Delegates + public void addNotificationListener(ObjectName name, NotificationListener listener, NotificationFilter filter, Object handback) throws InstanceNotFoundException, IOException { + server.addNotificationListener(name, listener, filter, handback); + } + public void addNotificationListener(ObjectName name, ObjectName listener, NotificationFilter filter, Object handback) throws InstanceNotFoundException, IOException { + server.addNotificationListener(name, listener, filter, handback); + } + public ObjectInstance createMBean(String className, ObjectName name, Object[] params, String[] signature) throws ReflectionException, InstanceAlreadyExistsException, MBeanRegistrationException, MBeanException, NotCompliantMBeanException, IOException { + return server.createMBean(className, name, params, signature); + } + public ObjectInstance createMBean(String className, ObjectName name, ObjectName loaderName, Object[] params, String[] signature) throws ReflectionException, InstanceAlreadyExistsException, MBeanRegistrationException, MBeanException, NotCompliantMBeanException, InstanceNotFoundException, IOException { + return server.createMBean(className, name, loaderName, params, signature); + } + public ObjectInstance createMBean(String className, ObjectName name, ObjectName loaderName) throws ReflectionException, InstanceAlreadyExistsException, MBeanRegistrationException, MBeanException, NotCompliantMBeanException, InstanceNotFoundException, IOException { + return server.createMBean(className, name, loaderName); + } + public ObjectInstance createMBean(String className, ObjectName name) throws ReflectionException, InstanceAlreadyExistsException, MBeanRegistrationException, MBeanException, NotCompliantMBeanException, IOException { + return server.createMBean(className, name); + } + public Object getAttribute(ObjectName name, String attribute) throws MBeanException, AttributeNotFoundException, InstanceNotFoundException, ReflectionException, IOException { + return server.getAttribute(name, attribute); + } + public AttributeList getAttributes(ObjectName name, String[] attributes) throws InstanceNotFoundException, ReflectionException, IOException { + return server.getAttributes(name, attributes); + } + public String getDefaultDomain() throws IOException { + return server.getDefaultDomain(); + } + public String[] getDomains() throws IOException { + return server.getDomains(); + } + public Integer getMBeanCount() throws IOException { + return server.getMBeanCount(); + } + public MBeanInfo getMBeanInfo(ObjectName name) throws InstanceNotFoundException, IntrospectionException, ReflectionException, IOException { + return server.getMBeanInfo(name); + } + public ObjectInstance getObjectInstance(ObjectName name) throws InstanceNotFoundException, IOException { + return server.getObjectInstance(name); + } + public Object invoke(ObjectName name, String operationName, Object[] params, String[] signature) throws InstanceNotFoundException, MBeanException, ReflectionException, IOException { + return server.invoke(name, operationName, params, signature); + } + public boolean isInstanceOf(ObjectName name, String className) throws InstanceNotFoundException, IOException { + return server.isInstanceOf(name, className); + } + public boolean isRegistered(ObjectName name) throws IOException { + return server.isRegistered(name); + } + public Set queryMBeans(ObjectName name, QueryExp query) throws IOException { + return server.queryMBeans(name, query); + } + public Set queryNames(ObjectName name, QueryExp query) throws IOException { + return server.queryNames(name, query); + } + public void removeNotificationListener(ObjectName name, NotificationListener listener, NotificationFilter filter, Object handback) throws InstanceNotFoundException, ListenerNotFoundException, IOException { + server.removeNotificationListener(name, listener, filter, handback); + } + public void removeNotificationListener(ObjectName name, NotificationListener listener) throws InstanceNotFoundException, ListenerNotFoundException, IOException { + server.removeNotificationListener(name, listener); + } + public void removeNotificationListener(ObjectName name, ObjectName listener, NotificationFilter filter, Object handback) throws InstanceNotFoundException, ListenerNotFoundException, IOException { + server.removeNotificationListener(name, listener, filter, handback); + } + public void removeNotificationListener(ObjectName name, ObjectName listener) throws InstanceNotFoundException, ListenerNotFoundException, IOException { + server.removeNotificationListener(name, listener); + } + public void setAttribute(ObjectName name, Attribute attribute) throws InstanceNotFoundException, AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException, IOException { + server.setAttribute(name, attribute); + } + public AttributeList setAttributes(ObjectName name, AttributeList attributes) throws InstanceNotFoundException, ReflectionException, IOException { + return server.setAttributes(name, attributes); + } + public void unregisterMBean(ObjectName name) throws InstanceNotFoundException, MBeanRegistrationException, IOException { + server.unregisterMBean(name); + } +} \ No newline at end of file Added: incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/classbean/TypeGetter.java URL: http://svn.apache.org/viewvc/incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/classbean/TypeGetter.java?view=auto&rev=441807 ============================================================================== --- incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/classbean/TypeGetter.java (added) +++ incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/classbean/TypeGetter.java Sat Sep 9 09:06:26 2006 @@ -0,0 +1,45 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.felix.jmxintrospector.classbean; + +import java.util.Collection; + +import sun.security.krb5.internal.tools.Klist; + +import javassist.ClassPool; +import javassist.CtClass; + +public class TypeGetter implements TypeGetterMBean { + + public Class getType(String name) throws Exception{ + CtClass cl=ClassPool.getDefault().get(name); + Collection classes=cl.getRefClasses(); + CtClass[] all=ClassPool.getDefault().get((String[])classes.toArray(new String[classes.size()])); + for (CtClass klazz : all) { + klazz.toBytecode(); + + } + ClassLoader loader=this.getClass().getClassLoader(); + try { + return loader.loadClass(name); + } catch (ClassNotFoundException e) { + return null; //FIXME: should we implement an searching mechanism? + } + } + +} Added: incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/classbean/TypeGetterMBean.java URL: http://svn.apache.org/viewvc/incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/classbean/TypeGetterMBean.java?view=auto&rev=441807 ============================================================================== --- incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/classbean/TypeGetterMBean.java (added) +++ incubator/felix/trunk/jmxintrospector/src/main/java/org/apache/felix/jmxintrospector/classbean/TypeGetterMBean.java Sat Sep 9 09:06:26 2006 @@ -0,0 +1,23 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.felix.jmxintrospector.classbean; + +public interface TypeGetterMBean { + public static final String MBEAN_NAME="org.apache.felix:class=TypeGetterMBean"; + public Class getType (String name) throws Exception; +} Added: incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/IntrospectorTestHarness.java URL: http://svn.apache.org/viewvc/incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/IntrospectorTestHarness.java?view=auto&rev=441807 ============================================================================== --- incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/IntrospectorTestHarness.java (added) +++ incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/IntrospectorTestHarness.java Sat Sep 9 09:06:26 2006 @@ -0,0 +1,65 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.felix.jmxintrospector; + +import java.lang.management.ManagementFactory; +import java.rmi.registry.LocateRegistry; +import java.rmi.registry.Registry; +import java.rmi.server.UnicastRemoteObject; +import java.util.logging.Logger; + +import javax.management.MBeanServer; +import javax.management.MBeanServerConnection; +import javax.management.ObjectName; +import javax.management.remote.JMXConnectorServer; +import javax.management.remote.JMXConnectorServerFactory; +import javax.management.remote.JMXServiceURL; + + + +import junit.framework.TestCase; + +public class IntrospectorTestHarness extends TestCase { + Logger logger=Logger.getLogger(this.getClass().getName()); + MBeanServerConnection mbs; + MBeanProxyManager proxyManager; + JMXConnectorServer jmxServer; + Registry registry; + ObjectName testName; + @Override + protected void setUp() throws Exception { + super.setUp(); + mbs = ManagementFactory.getPlatformMBeanServer(); + JMXServiceURL u=new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/server"); + registry=LocateRegistry.createRegistry(1099); + jmxServer=JMXConnectorServerFactory.newJMXConnectorServer(u, null, (MBeanServer)mbs); + testName=ObjectName.getInstance("test:name="+this.getClass().getName()); + ((MBeanServer)mbs).registerMBean(jmxServer, testName); + jmxServer.start(); + proxyManager=new MBeanProxyManager(); + proxyManager.addRemoteServer(u.toString()); + + } + @Override + protected void tearDown() throws Exception { + super.tearDown(); + jmxServer.stop(); + ((MBeanServer)mbs).unregisterMBean(testName); + UnicastRemoteObject.unexportObject(registry, true); + } +} Added: incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/MBeanProxyFactoryTestCase.java URL: http://svn.apache.org/viewvc/incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/MBeanProxyFactoryTestCase.java?view=auto&rev=441807 ============================================================================== --- incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/MBeanProxyFactoryTestCase.java (added) +++ incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/MBeanProxyFactoryTestCase.java Sat Sep 9 09:06:26 2006 @@ -0,0 +1,47 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.felix.jmxintrospector; + +import java.lang.management.ManagementFactory; +import java.util.Set; +import java.util.logging.Logger; + +import javax.management.MBeanServerConnection; +import javax.management.ObjectName; + +import junit.framework.TestCase; + +public class MBeanProxyFactoryTestCase extends IntrospectorTestHarness { + + MBeanProxyFactory factory; + + @Override + protected void setUp() throws Exception { + super.setUp(); + factory = new MBeanProxyFactory(mbs); + } + + public void testNewProxyInstance() throws Exception{ + Set onames = mbs.queryNames(ObjectName.WILDCARD, null); + for (ObjectName name : onames) { + Object mbean=factory.newProxyInstance(name.toString()); + assertTrue(mbean instanceof MBean); + logger.info(((MBean)mbean).getObjectName()); + } + } +} Added: incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/OutOfProcessTestHarness.java URL: http://svn.apache.org/viewvc/incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/OutOfProcessTestHarness.java?view=auto&rev=441807 ============================================================================== --- incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/OutOfProcessTestHarness.java (added) +++ incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/OutOfProcessTestHarness.java Sat Sep 9 09:06:26 2006 @@ -0,0 +1,54 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.felix.jmxintrospector; + +import java.lang.management.ManagementFactory; +import java.rmi.registry.LocateRegistry; +import java.rmi.registry.Registry; +import java.rmi.server.UnicastRemoteObject; +import java.util.logging.Logger; + +import javax.management.MBeanServer; +import javax.management.MBeanServerConnection; +import javax.management.ObjectName; +import javax.management.remote.JMXConnectorFactory; +import javax.management.remote.JMXConnectorServer; +import javax.management.remote.JMXConnectorServerFactory; +import javax.management.remote.JMXServiceURL; + +import junit.framework.TestCase; + +public class OutOfProcessTestHarness extends TestCase { + Logger logger=Logger.getLogger(this.getClass().getName()); + MBeanServerConnection mbs; + MBeanProxyManager proxyManager; + ObjectName testName; + @Override + protected void setUp() throws Exception { + super.setUp(); + JMXServiceURL u=new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1199/server"); + mbs=JMXConnectorFactory.connect(u).getMBeanServerConnection(); + proxyManager=new MBeanProxyManager(); + proxyManager.addRemoteServer(u.toString()); + + } + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } +} Added: incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/RemoteMBeanProxyFactoryTestCase.java URL: http://svn.apache.org/viewvc/incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/RemoteMBeanProxyFactoryTestCase.java?view=auto&rev=441807 ============================================================================== --- incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/RemoteMBeanProxyFactoryTestCase.java (added) +++ incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/RemoteMBeanProxyFactoryTestCase.java Sat Sep 9 09:06:26 2006 @@ -0,0 +1,45 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.felix.jmxintrospector; + +/** + * @author mili + * + */ +public class RemoteMBeanProxyFactoryTestCase extends MBeanProxyFactoryTestCase{ + + /* (non-Javadoc) + * @see org.apache.felix.jmxintrospector.MBeanProxyFactoryTestCase#setUp() + */ + @Override + protected void setUp() throws Exception { + OutOfProcessTestHarness t=new OutOfProcessTestHarness(); + t.setUp(); + mbs=t.mbs; + factory=new MBeanProxyFactory(mbs); + + } + + /* (non-Javadoc) + * @see org.apache.felix.jmxintrospector.IntrospectorTestHarness#tearDown() + */ + @Override + protected void tearDown() throws Exception { + } + + +} Added: incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/ScriptTestCase.java URL: http://svn.apache.org/viewvc/incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/ScriptTestCase.java?view=auto&rev=441807 ============================================================================== --- incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/ScriptTestCase.java (added) +++ incubator/felix/trunk/jmxintrospector/src/test/java/org/apache/felix/jmxintrospector/ScriptTestCase.java Sat Sep 9 09:06:26 2006 @@ -0,0 +1,63 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.felix.jmxintrospector; + +import java.lang.management.ManagementFactory; +import java.util.List; +import java.util.logging.Logger; + +import javax.management.MBeanServerConnection; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; + +import junit.framework.TestCase; + +public class ScriptTestCase extends IntrospectorTestHarness { + Logger logger=Logger.getLogger(this.getClass().getName()); + ScriptEngineManager engineManager; + @Override + protected void setUp() throws Exception { + super.setUp(); + engineManager=new ScriptEngineManager(); + engineManager.put("manager", proxyManager); + } + public void testRuby() throws Exception{ + fail("Not implemented"); + } + public void testJavascript() throws Exception{ + ScriptEngine js=engineManager.getEngineByName("javascript"); + //results are the same, but may have different hash + List objectsInJava=proxyManager.getObjects(); + List objectsInJS=(List) js.eval("manager.getObjects()"); + for (Object objectJS : objectsInJS) { + Object javaPeer=null; + for (Object objectJava : objectsInJava) { + if (((MBean)objectJava).getObjectName().equals(((MBean)objectJS).getObjectName())) + javaPeer=objectJava; + } + assertNotNull(javaPeer); + System.out.println(javaPeer+";"+ objectJS); + assertEquals(javaPeer.getClass(), objectJS.getClass()); + assertEquals(javaPeer, objectJS);//BUG in MBeanProxyFactory$JMXInvocationHandler + + } + + + } + +}