Author: tross Date: Fri Jul 17 19:05:49 2009 New Revision: 795198 URL: http://svn.apache.org/viewvc?rev=795198&view=rev Log: QPID-1938 - Make the Java Agent more friendly for inclusion by JBoss Deployer Patch from Bryan Kearney
Added: qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFAgent.java Modified: qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/Agent.java qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/AgentException.java qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/ManagedEJB.java qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/ManagedPOJO.java qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFEvent.java qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFHide.java qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFObject.java qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFSeeAlso.java qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFType.java qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/binding/BindingContext.java qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/binding/EnumBinding.java qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/binding/ListBinding.java qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/binding/PropertyBinding.java Modified: qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/Agent.java URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/Agent.java?rev=795198&r1=795197&r2=795198&view=diff ============================================================================== --- qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/Agent.java (original) +++ qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/Agent.java Fri Jul 17 19:05:49 2009 @@ -54,33 +54,34 @@ import org.apache.qpid.transport.codec.Decoder; /** - * The main class for interacting with the QMF bus. Objects which are - * to be managed can be registered with the agent, as can classes - * to be exposed via the schema. + * The main class for interacting with the QMF bus. Objects which are to be + * managed can be registered with the agent, as can classes to be exposed via + * the schema. */ public class Agent implements MessageListener { // The following are settings to configure the Agent - private AMQConnection connection; - private boolean sessionTransacted = false; - private int acknowledgeMode = Session.AUTO_ACKNOWLEDGE; - private String label; - private UUID systemId; + protected AMQConnection connection; + protected boolean sessionTransacted = false; + protected int acknowledgeMode = Session.AUTO_ACKNOWLEDGE; + protected String label; + protected UUID systemId; // this list holds the objects until the agent is started - private List managedObjects = new ArrayList(); - private List registeredClasses = new ArrayList(); + protected List managedObjects = new ArrayList(); + protected List registeredClasses = new ArrayList(); // The following instance variables are not // able to be set by the end user. - private Session session; - private MessageProducer prod; - private MessageConsumer cons; - private Queue reply; - private BindingContext bctx = new BindingContext(); - private Map<Long, ManagedObject> objects = new Hashtable<Long, ManagedObject>(); - private long bbank; - private long abank; - private static Log log = LogFactory.getLog(Agent.class); - private volatile boolean inside = false; + protected Session session; + protected MessageProducer prod; + protected MessageConsumer cons; + protected Queue reply; + protected BindingContext bctx = new BindingContext(); + protected Map<Long, ManagedObject> objects = new Hashtable<Long, ManagedObject>(); + protected long bbank; + protected long abank; + protected static Log log = LogFactory.getLog(Agent.class); + protected volatile boolean inside = false; + protected ClassLoader classLoader = null; public Agent() { @@ -97,7 +98,6 @@ systemId.toString())); } - public void register(ManagedObject managedObject) { Class managedClass = managedObject.getObjectClass(); @@ -123,8 +123,26 @@ } /** - * Starts up the agent. Many bean containers may call this by - * default which aids in deployment + * Stops the agents connection to the bus + */ + public void stop() + { + try + { + cons.close(); + prod.close(); + connection.stop(); + connection.close(); + session.close(); + } catch (JMSException e) + { + log.error("Exception:", e); + } + } + + /** + * Starts up the agent. Many bean containers may call this by default which + * aids in deployment */ public void start() { @@ -134,7 +152,14 @@ { try { - Class cls = Class.forName(clsName.toString()); + Class cls = null; + if (String.class.isAssignableFrom(clsName.getClass())) + { + cls = getClass(clsName.toString()); + } else + { + cls = (Class) clsName; + } this.registerClass(cls); } catch (Exception e) { @@ -149,7 +174,11 @@ { session = connection.createSession(sessionTransacted, acknowledgeMode); - reply = session.createQueue(String.format("direct://amq.direct//%s-%s?exclusive='True'&autodelete='True'",label,systemId)); + reply = session + .createQueue(String + .format( + "direct://amq.direct//%s-%s?exclusive='True'&autodelete='True'", + label, systemId)); cons = session.createConsumer(reply); cons.setMessageListener(this); prod = session.createProducer(null); @@ -360,10 +389,11 @@ } catch (BindingException ex) { log - .error(String - .format( - "An exception occured invoking method %s. Stack trace sent to console.", - method.getName())); + .error( + String + .format( + "An exception occured invoking method %s. Stack trace sent to console.", + method.getName()), ex); StringWriter str = new StringWriter(); PrintWriter writer = new PrintWriter(str); ex.printStackTrace(writer); @@ -492,7 +522,7 @@ } } - private void attachRequest(String label, UUID systemId) + protected void attachRequest(String label, UUID systemId) { BBEncoder enc = init('A'); enc.writeStr8(label); @@ -502,14 +532,14 @@ send(enc); } - private void packageIndication(String pkg) + protected void packageIndication(String pkg) { BBEncoder enc = init('p'); enc.writeStr8(pkg); send(enc); } - private void classIndication(ClassBinding cb) + protected void classIndication(ClassBinding cb) { BBEncoder enc = init('q'); enc.writeUint8(cb.getKind()); @@ -519,14 +549,14 @@ send(enc); } - private void schemaResponse(long seq, ClassBinding cb) + protected void schemaResponse(long seq, ClassBinding cb) { BBEncoder enc = init('s', seq); cb.encode(enc); send(enc); } - private void content(char c, long seq, Destination dest, ManagedObject mo) + protected void content(char c, long seq, Destination dest, ManagedObject mo) { BBEncoder enc = init(c, seq); ClassBinding cb = getClassBinding(mo); @@ -555,7 +585,7 @@ } } - private void complete(long seq, Destination dest) + protected void complete(long seq, Destination dest) { BBEncoder enc = init('z', seq); enc.writeUint32(0); @@ -563,13 +593,13 @@ send(dest, enc); } - private void methodResponse(long seq, Destination dest, int status, + protected void methodResponse(long seq, Destination dest, int status, String text) { methodResponse(seq, dest, status, text, null, null); } - private void methodResponse(long seq, Destination dest, int status, + protected void methodResponse(long seq, Destination dest, int status, String text, MethodBinding method, Object[] result) { BBEncoder enc = init('m', seq); @@ -586,6 +616,24 @@ send(dest, enc); } + protected Class getClass(String className) + { + try + { + if (classLoader != null) + { + return classLoader.loadClass(className); + } else + { + return Class.forName(className); + } + } catch (ClassNotFoundException e) + { + throw new AgentException(String.format( + "No class named %s was found", className), e); + } + } + public String getLabel() { return label; Modified: qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/AgentException.java URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/AgentException.java?rev=795198&r1=795197&r2=795198&view=diff ============================================================================== --- qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/AgentException.java (original) +++ qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/AgentException.java Fri Jul 17 19:05:49 2009 @@ -22,10 +22,12 @@ /** * AgentException - * + * */ public class AgentException extends RuntimeException { + private static final long serialVersionUID = 1L; + public AgentException(String msg) { super(msg); Modified: qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/ManagedEJB.java URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/ManagedEJB.java?rev=795198&r1=795197&r2=795198&view=diff ============================================================================== --- qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/ManagedEJB.java (original) +++ qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/ManagedEJB.java Fri Jul 17 19:05:49 2009 @@ -23,30 +23,42 @@ import javax.naming.InitialContext; import javax.naming.NamingException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.qpid.agent.binding.BindingUtils; import org.apache.qpid.agent.binding.MethodBinding; import org.apache.qpid.agent.binding.PropertyBinding; /** - * Wrapper classe for adding EJBS which are to be - * managed by the QMF Agent. The jndi location and the - * public interface to exposed are used to generate the schema. + * Wrapper classe for adding EJBS which are to be managed by the QMF Agent. The + * jndi location and the public interface to exposed are used to generate the + * schema. */ public class ManagedEJB extends ManagedObjectBase { + private Log log = LogFactory.getLog(ManagedEJB.class); protected String className; protected String jndiLocation; + protected ClassLoader classLoader; protected Object getEJB() { + ClassLoader previousCL = Thread.currentThread().getContextClassLoader(); try { + if (classLoader != null) + { + Thread.currentThread().setContextClassLoader(classLoader); + } InitialContext ctx = new InitialContext(); return ctx.lookup(jndiLocation); } catch (NamingException e) { throw new AgentException("Error looking up EJB at " + jndiLocation, e); + } finally + { + Thread.currentThread().setContextClassLoader(previousCL); } } @@ -67,7 +79,14 @@ { try { - return Class.forName(className); + if (classLoader != null) + { + log.debug("Using the classloader"); + return classLoader.loadClass(className); + } else + { + return Class.forName(className); + } } catch (ClassNotFoundException e) { throw new AgentException(String.format( @@ -106,4 +125,14 @@ { this.jndiLocation = jndiLocation; } + + public ClassLoader getClassLoader() + { + return classLoader; + } + + public void setClassLoader(ClassLoader cloader) + { + this.classLoader = cloader; + } } Modified: qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/ManagedPOJO.java URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/ManagedPOJO.java?rev=795198&r1=795197&r2=795198&view=diff ============================================================================== --- qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/ManagedPOJO.java (original) +++ qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/ManagedPOJO.java Fri Jul 17 19:05:49 2009 @@ -27,8 +27,7 @@ import org.apache.qpid.agent.binding.PropertyBinding; /** - * Wrapper classe for adding POJOS which are to be - * managed by the QMF Agent. + * Wrapper classe for adding POJOS which are to be managed by the QMF Agent. */ public class ManagedPOJO extends ManagedObjectBase implements ManagedObject { Added: qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFAgent.java URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFAgent.java?rev=795198&view=auto ============================================================================== --- qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFAgent.java (added) +++ qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFAgent.java Fri Jul 17 19:05:49 2009 @@ -0,0 +1,34 @@ +/* + * + * 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.qpid.agent.annotations; + +import java.lang.annotation.Target; +import java.lang.annotation.Retention; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +...@target(ElementType.FIELD) +...@retention(RUNTIME) +...@documented +public @interface QMFAgent +{ +} Modified: qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFEvent.java URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFEvent.java?rev=795198&r1=795197&r2=795198&view=diff ============================================================================== --- qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFEvent.java (original) +++ qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFEvent.java Fri Jul 17 19:05:49 2009 @@ -28,9 +28,8 @@ import java.lang.annotation.Target; /** - * Tells the QMF Agent that this object will be passed as a - * QMF event. This will cause only properties to be sent across - * the wire. + * Tells the QMF Agent that this object will be passed as a QMF event. This will + * cause only properties to be sent across the wire. */ @Target(TYPE) @Retention(RUNTIME) Modified: qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFHide.java URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFHide.java?rev=795198&r1=795197&r2=795198&view=diff ============================================================================== --- qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFHide.java (original) +++ qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFHide.java Fri Jul 17 19:05:49 2009 @@ -28,8 +28,8 @@ import java.lang.annotation.Target; /** - * Causes the property which is annotated to not be added to the - * QMF schema when it is built. + * Causes the property which is annotated to not be added to the QMF schema when + * it is built. */ @Target(ElementType.METHOD) @Retention(RUNTIME) Modified: qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFObject.java URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFObject.java?rev=795198&r1=795197&r2=795198&view=diff ============================================================================== --- qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFObject.java (original) +++ qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFObject.java Fri Jul 17 19:05:49 2009 @@ -28,9 +28,8 @@ import java.lang.annotation.Target; /** - * Tells the QMF Agent that this object will be a managed - * object. This will allow users to query for it, as well as - * invoke methods on it. + * Tells the QMF Agent that this object will be a managed object. This will + * allow users to query for it, as well as invoke methods on it. */ @Target(TYPE) @Retention(RUNTIME) Modified: qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFSeeAlso.java URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFSeeAlso.java?rev=795198&r1=795197&r2=795198&view=diff ============================================================================== --- qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFSeeAlso.java (original) +++ qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFSeeAlso.java Fri Jul 17 19:05:49 2009 @@ -28,8 +28,8 @@ import java.lang.annotation.Target; /** - * Augements the schema generation process to look for known - * subclasses of a type. Modeled after the JAXB @XMLSeeAlso. + * Augements the schema generation process to look for known subclasses of a + * type. Modeled after the JAXB @XMLSeeAlso. */ @Target(TYPE) @Retention(RUNTIME) Modified: qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFType.java URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFType.java?rev=795198&r1=795197&r2=795198&view=diff ============================================================================== --- qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFType.java (original) +++ qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/annotations/QMFType.java Fri Jul 17 19:05:49 2009 @@ -28,9 +28,8 @@ import java.lang.annotation.Target; /** - * Tells the QMF Agent that this object will be a type only - * This will cause only properties to be sent across - * the wire. + * Tells the QMF Agent that this object will be a type only This will cause only + * properties to be sent across the wire. */ @Target(TYPE) @Retention(RUNTIME) Modified: qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/binding/BindingContext.java URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/binding/BindingContext.java?rev=795198&r1=795197&r2=795198&view=diff ============================================================================== --- qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/binding/BindingContext.java (original) +++ qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/binding/BindingContext.java Fri Jul 17 19:05:49 2009 @@ -33,8 +33,8 @@ import org.apache.qpid.agent.annotations.QMFType; /** - * Contains the mappings from java classes to QMF schema and back. - * There is one context per agent, and it contains all the metadata. + * Contains the mappings from java classes to QMF schema and back. There is one + * context per agent, and it contains all the metadata. */ public class BindingContext { Modified: qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/binding/EnumBinding.java URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/binding/EnumBinding.java?rev=795198&r1=795197&r2=795198&view=diff ============================================================================== --- qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/binding/EnumBinding.java (original) +++ qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/binding/EnumBinding.java Fri Jul 17 19:05:49 2009 @@ -65,17 +65,20 @@ { // FIXME This only works with POJOs Object instance = null; - String value = null ; + String value = null; try { value = dec.readStr16(); - if ((value != null ) && (!value.isEmpty())) { - instance = Enum.valueOf((Class<Enum>) this.getJavaClass(), value); - } + if ((value != null) && (!value.isEmpty())) + { + instance = Enum.valueOf((Class<Enum>) this.getJavaClass(), + value); + } } catch (Exception e) { - log.error(String.format("Could not create an enum of type %s with value %s", - this.javaClass.getName(),value )); + log.error(String.format( + "Could not create an enum of type %s with value %s", + this.javaClass.getName(), value)); throw new BindingException(e); } return instance; Modified: qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/binding/ListBinding.java URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/binding/ListBinding.java?rev=795198&r1=795197&r2=795198&view=diff ============================================================================== --- qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/binding/ListBinding.java (original) +++ qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/binding/ListBinding.java Fri Jul 17 19:05:49 2009 @@ -49,7 +49,8 @@ { List list = (List) value; BBEncoder newEncoder = new BBEncoder(10); - if (list != null) { + if (list != null) + { newEncoder.writeUint32(list.size()); for (Object obj : list) { @@ -57,9 +58,9 @@ newEncoder.writeUint8(type.getCode()); type.encode(newEncoder, obj); } - } - else { - newEncoder.writeUint32(0) ; + } else + { + newEncoder.writeUint32(0); } enc.writeVbin32(newEncoder.buffer().array()); } Modified: qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/binding/PropertyBinding.java URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/binding/PropertyBinding.java?rev=795198&r1=795197&r2=795198&view=diff ============================================================================== --- qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/binding/PropertyBinding.java (original) +++ qpid/trunk/qpid/java/management/agent/src/main/java/org/apache/qpid/agent/binding/PropertyBinding.java Fri Jul 17 19:05:49 2009 @@ -27,7 +27,6 @@ import org.apache.commons.logging.LogFactory; import org.apache.qpid.transport.codec.Encoder; - /** * Metadata for mapping a java property (getter/setter) to a QMF schema */ --------------------------------------------------------------------- Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:commits-subscr...@qpid.apache.org