You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by dj...@apache.org on 2003/12/30 09:25:32 UTC
cvs commit: incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/kernel/service GeronimoMBeanEndpointListener.java GeronimoMBean.java GeronimoMBeanEndpoint.java GeronimoMBeanEndpointConnection.java GeronimoMBeanInfo.java
djencks 2003/12/30 00:25:32
Modified: modules/kernel/src/java/org/apache/geronimo/kernel/deployment/service
MBeanMetadata.java
modules/kernel/src/java/org/apache/geronimo/kernel/service
GeronimoMBean.java GeronimoMBeanEndpoint.java
GeronimoMBeanEndpointConnection.java
GeronimoMBeanInfo.java
Added: modules/kernel/src/java/org/apache/geronimo/kernel/service
GeronimoMBeanEndpointListener.java
Log:
Add endpoints based on listeners rather than collection valued attributes. Also fix a serious bug with adding endpoints before they were started if they are GeronimoMBeans
Revision Changes Path
1.6 +2 -3 incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/kernel/deployment/service/MBeanMetadata.java
Index: MBeanMetadata.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/kernel/deployment/service/MBeanMetadata.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- MBeanMetadata.java 16 Nov 2003 00:51:24 -0000 1.5
+++ MBeanMetadata.java 30 Dec 2003 08:25:32 -0000 1.6
@@ -56,12 +56,11 @@
package org.apache.geronimo.kernel.deployment.service;
import java.net.URI;
-import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.List;
import java.util.Map;
import java.util.Set;
+
import javax.management.ObjectName;
import org.apache.geronimo.kernel.service.GeronimoMBeanInfo;
1.11 +28 -22 incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/kernel/service/GeronimoMBean.java
Index: GeronimoMBean.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/kernel/service/GeronimoMBean.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- GeronimoMBean.java 28 Dec 2003 19:28:58 -0000 1.10
+++ GeronimoMBean.java 30 Dec 2003 08:25:32 -0000 1.11
@@ -163,37 +163,20 @@
// @todo there is an issue here with restarted deployments
addManagedObjectMBeanInfo();
mbeanInfo = new GeronimoMBeanInfo(mbeanInfo);
- } finally {
- Thread.currentThread().setContextClassLoader(oldClassLoader);
- }
- return this.objectName;
- }
-
- public void postRegister(Boolean registrationDone) {
- if (!registrationDone.booleanValue()) {
- context = null;
- return;
- }
-
- ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
- try {
- // Set the class loader
- Thread.currentThread().setContextClassLoader(classLoader);
-
// build the attribute map
Set attributes = mbeanInfo.getAttributeSet();
for (Iterator iterator = attributes.iterator(); iterator.hasNext();) {
GeronimoAttributeInfo attributeInfo = (GeronimoAttributeInfo) iterator.next();
- final String name = attributeInfo.getName();
- attributeInfoMap.put(name, attributeInfo);
+ final String attributeName = attributeInfo.getName();
+ attributeInfoMap.put(attributeName, attributeInfo);
if (attributeInfo.isReadable()) {
String getterName = (attributeInfo.isIs() ? "is" : "get") +
- Character.toUpperCase(name.charAt(0)) + name.substring(1);
+ Character.toUpperCase(attributeName.charAt(0)) + attributeName.substring(1);
operationInfoMap.put(new MBeanOperationSignature(getterName, null), attributeInfo);
}
if (attributeInfo.isWritable()) {
- String setterName = "set" + Character.toUpperCase(name.charAt(0)) + name.substring(1);
+ String setterName = "set" + Character.toUpperCase(attributeName.charAt(0)) + attributeName.substring(1);
operationInfoMap.put(new MBeanOperationSignature(setterName, new String[]{attributeInfo.getType()}), attributeInfo);
}
}
@@ -220,6 +203,23 @@
GeronimoMBeanEndpoint endpoint = (GeronimoMBeanEndpoint) i.next();
endpoint.setMBeanContext(context);
}
+ } finally {
+ Thread.currentThread().setContextClassLoader(oldClassLoader);
+ }
+ return this.objectName;
+ }
+
+ public void postRegister(Boolean registrationDone) {
+ if (!registrationDone.booleanValue()) {
+ context = null;
+ return;
+ }
+
+ ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
+ try {
+ // Set the class loader
+ Thread.currentThread().setContextClassLoader(classLoader);
+
super.postRegister(registrationDone);
} finally {
Thread.currentThread().setContextClassLoader(oldClassLoader);
@@ -527,6 +527,12 @@
MBeanOperationSignature key = new MBeanOperationSignature(methodName, types);
Object info = operationInfoMap.get(key);
if (info == null) {
+ log.info("Operation not found on mbean" + this.objectName + ", method: " + methodName + ", paramtypes: " + types);
+ log.info("MBeanInfo is immutable: " + mbeanInfo.immutable + " on mbeanInfo: " + mbeanInfo);
+ for (Iterator iterator = operationInfoMap.keySet().iterator(); iterator.hasNext();) {
+ MBeanOperationSignature mBeanOperationSignature = (MBeanOperationSignature) iterator.next();
+ log.info("Operation: " + mBeanOperationSignature);
+ }
throw new ReflectionException(new NoSuchMethodException("Unknown operation " + key));
}
1.6 +64 -31 incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/kernel/service/GeronimoMBeanEndpoint.java
Index: GeronimoMBeanEndpoint.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/kernel/service/GeronimoMBeanEndpoint.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- GeronimoMBeanEndpoint.java 16 Nov 2003 23:32:29 -0000 1.5
+++ GeronimoMBeanEndpoint.java 30 Dec 2003 08:25:32 -0000 1.6
@@ -63,6 +63,7 @@
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
+
import javax.management.AttributeNotFoundException;
import javax.management.InstanceNotFoundException;
import javax.management.JMException;
@@ -121,12 +122,12 @@
private final Class iface;
/**
- * The object name patters for object to communicate with
+ * The object name patterns for object(s) to communicate with
*/
private Collection peers;
/**
- * The connection to the other mbean
+ * The connections to the other mbeans
*/
private Map connections;
@@ -153,11 +154,16 @@
/**
* Name of the setter method.
- * The default is "set" + name. In the case of a defualt value we do a caseless search for the name.
+ * The default is "set" + name. In the case of a default value we do a caseless search for the name.
*/
private String setterName;
/**
+ * Listener for endpoint add/remove events.
+ */
+ private GeronimoMBeanEndpointListener endpointListener;
+
+ /**
* The object on which the getter and setter will be invoked
*/
private final Object target;
@@ -197,17 +203,25 @@
public GeronimoMBeanEndpoint(String name, Class type, ObjectName pattern) {
this(name, type.getName(), Collections.singleton(pattern), false);
}
-
+
+ public GeronimoMBeanEndpoint(GeronimoMBeanEndpointListener endpointListener, Class type, ObjectName pattern) {
+ this(null, endpointListener, type.getName(), Collections.singleton(pattern), false, null);
+ }
+
public GeronimoMBeanEndpoint(String name, String type, ObjectName pattern, boolean required) {
this(name, type, Collections.singleton(pattern), required);
}
public GeronimoMBeanEndpoint(String name, Class type, ObjectName pattern, boolean required) {
this(name, type.getName(), Collections.singleton(pattern), required);
- }
-
- public GeronimoMBeanEndpoint(String name, String type, ObjectName pattern, boolean required, String target) {
- this(name, type, Collections.singleton(pattern), required, target);
+ }
+
+ public GeronimoMBeanEndpoint(String name, String type, ObjectName pattern, boolean required, String targetName) {
+ this(name, type, Collections.singleton(pattern), required, targetName);
+ }
+
+ public GeronimoMBeanEndpoint(GeronimoMBeanEndpointListener endpointListener, String type, ObjectName pattern, boolean required, String targetName) {
+ this(null, endpointListener, type, Collections.singleton(pattern), required, targetName);
}
public GeronimoMBeanEndpoint(String name, String type, Collection peers) {
@@ -219,7 +233,12 @@
}
public GeronimoMBeanEndpoint(String name, String type, Collection peers, boolean required, String targetName) {
+ this(name, null, type, peers, required, targetName);
+ }
+
+ public GeronimoMBeanEndpoint(String name, GeronimoMBeanEndpointListener endpointListener, String type, Collection peers, boolean required, String targetName) {
this.name = name;
+ this.endpointListener = endpointListener;
this.type = type;
this.peers = new HashSet(peers);
this.required = required;
@@ -245,8 +264,8 @@
//
// name
- if (source.name == null) {
- throw new IllegalArgumentException("Source must have a name");
+ if (source.name == null && source.endpointListener == null) {
+ throw new IllegalArgumentException("Source must have a name or an endpoint listener");
}
name = source.name;
@@ -285,6 +304,7 @@
name = source.name;
description = source.description;
+ endpointListener = source.endpointListener;
//
// Optional (derived)
@@ -305,6 +325,11 @@
}
}
+ //initialize endpoint listener
+ if (endpointListener != null) {
+ endpointListener.setTarget(target);
+ }
+
// setter proxy
Method[] methods = target.getClass().getMethods();
Method setterJavaMethod = null;
@@ -330,20 +355,25 @@
}
if (setterJavaMethod == null) {
- throw new IllegalArgumentException("Setter method not found on target:" +
- " setterName=" + setterName +
- " targetClass=" + target.getClass().getName());
- }
-
- if (Collection.class == setterJavaMethod.getParameterTypes()[0]) {
+ if (endpointListener == null) {
+ throw new IllegalArgumentException("Setter method not found on target:" +
+ " setterName=" + setterName +
+ " targetClass=" + target.getClass().getName());
+ }
singleValued = false;
- } else if (setterJavaMethod.getParameterTypes()[0].isAssignableFrom(iface)) {
- singleValued = true;
+ setterMethod = null;
} else {
- throw new IllegalArgumentException("Setter parameter must be Collection or " + type);
- }
- setterMethod = parent.getTargetFastClass(targetName).getMethod(setterJavaMethod);
+ if (Collection.class == setterJavaMethod.getParameterTypes()[0]) {
+ singleValued = false;
+ } else if (setterJavaMethod.getParameterTypes()[0].isAssignableFrom(iface)) {
+ singleValued = true;
+ } else {
+ throw new IllegalArgumentException("Setter parameter must be Collection or " + type);
+ }
+
+ setterMethod = parent.getTargetFastClass(targetName).getMethod(setterJavaMethod);
+ }
}
public String getName() {
@@ -562,6 +592,7 @@
setEndpointProxy(connection.getProxy());
}
} else {
+ //Is this really live?
setEndpointProxy(Collections.unmodifiableCollection(proxies.values()));
}
}
@@ -597,14 +628,16 @@
}
private synchronized void setEndpointProxy(Object proxy) {
- try {
- setterMethod.invoke(target, new Object[]{proxy});
- } catch (RuntimeException e) {
- throw e;
- } catch (Error e) {
- throw e;
- } catch (Throwable t) {
- throw new AssertionError(t);
+ if (setterMethod != null) {
+ try {
+ setterMethod.invoke(target, new Object[]{proxy});
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Error e) {
+ throw e;
+ } catch (Throwable t) {
+ throw new AssertionError(t);
+ }
}
}
@@ -686,7 +719,7 @@
}
// create a connection
- final GeronimoMBeanEndpointConnection connection = new GeronimoMBeanEndpointConnection(iface, context.getServer(), peer);
+ final GeronimoMBeanEndpointConnection connection = new GeronimoMBeanEndpointConnection(iface, context.getServer(), peer, endpointListener);
connections.put(peer, connection);
// update running state
1.5 +14 -2 incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/kernel/service/GeronimoMBeanEndpointConnection.java
Index: GeronimoMBeanEndpointConnection.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/kernel/service/GeronimoMBeanEndpointConnection.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- GeronimoMBeanEndpointConnection.java 14 Nov 2003 02:59:17 -0000 1.4
+++ GeronimoMBeanEndpointConnection.java 30 Dec 2003 08:25:32 -0000 1.5
@@ -88,6 +88,8 @@
*/
private ObjectName objectName;
+ private final GeronimoMBeanEndpointListener endpointListener;
+
/**
* A factory to create instances
*/
@@ -120,7 +122,7 @@
* @param server the mbean server in which the component is registered
* @param objectName the name of the component
*/
- public GeronimoMBeanEndpointConnection(Class iface, MBeanServer server, ObjectName objectName) {
+ public GeronimoMBeanEndpointConnection(Class iface, MBeanServer server, ObjectName objectName, GeronimoMBeanEndpointListener endpointListener) {
assert iface != null: "iface can not be null";
assert server != null: "Server can not be null";
assert objectName != null: "Object name can not be null";
@@ -134,6 +136,7 @@
this.server = server;
this.objectName = objectName;
+ this.endpointListener = endpointListener;
MethodInterceptor dummyInterceptor = new MethodInterceptor() {
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
@@ -149,6 +152,9 @@
if(Modifier.isStatic(method.getModifiers())) {
return Callbacks.NO_OP;
}
+ if(Modifier.isFinal(method.getModifiers())) {
+ return Callbacks.NO_OP;
+ }
return Callbacks.INTERCEPT;
}
});
@@ -222,6 +228,9 @@
methodInterceptor = new ConnectionMethodInterceptor(methodTable, server, objectName);
proxy = factory.newInstance(methodInterceptor);
open = true;
+ if (endpointListener != null) {
+ endpointListener.endpointAdded(proxy);
+ }
}
/**
@@ -230,6 +239,9 @@
public synchronized void close() {
if (!open) {
throw new IllegalStateException("Connection is already closed");
+ }
+ if (endpointListener != null) {
+ endpointListener.endpointRemoved(proxy);
}
methodInterceptor.invalidate();
methodInterceptor = null;
1.13 +18 -3 incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/kernel/service/GeronimoMBeanInfo.java
Index: GeronimoMBeanInfo.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/kernel/service/GeronimoMBeanInfo.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- GeronimoMBeanInfo.java 26 Nov 2003 02:10:08 -0000 1.12
+++ GeronimoMBeanInfo.java 30 Dec 2003 08:25:32 -0000 1.13
@@ -104,7 +104,8 @@
private static final MBeanConstructorInfo[] NO_CONSTRUCTORS = new MBeanConstructorInfo[0];
private boolean autostart = false;
- private final boolean immutable;
+ //private
+ final boolean immutable;
private final int hashCode = System.identityHashCode(this);
private String name;
private String description;
@@ -480,6 +481,20 @@
}
public String toString() {
- return "[GeronimoMBeanInfo: name=" + name + " description=" + description + "]";
+ StringBuffer result = new StringBuffer("[GeronimoMBeanInfo: id=").append(super.toString()).append(" name=").append(name).append(" description=").append(description).append(" immutable=").append(immutable);
+ for (Iterator iterator = attributes.iterator(); iterator.hasNext();) {
+ GeronimoAttributeInfo geronimoAttributeInfo = (GeronimoAttributeInfo) iterator.next();
+ result.append("\n attribute: ").append(geronimoAttributeInfo);
+ }
+ for (Iterator iterator = operations.iterator(); iterator.hasNext();) {
+ GeronimoOperationInfo geronimoOperationInfo = (GeronimoOperationInfo) iterator.next();
+ result.append("\n operation: ").append(geronimoOperationInfo);
+ }
+ for (Iterator iterator = endpoints.iterator(); iterator.hasNext();) {
+ GeronimoMBeanEndpoint geronimoMBeanEndpoint = (GeronimoMBeanEndpoint) iterator.next();
+ result.append("\n endpoint: ").append(geronimoMBeanEndpoint);
+ }
+ result.append("]");
+ return result.toString();
}
}
1.1 incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/kernel/service/GeronimoMBeanEndpointListener.java
Index: GeronimoMBeanEndpointListener.java
===================================================================
package org.apache.geronimo.kernel.service;
/**
*
*
* @version $Revision: 1.1 $ $Date: 2003/12/30 08:25:32 $
*
* */
public interface GeronimoMBeanEndpointListener {
void setTarget(Object target);
void endpointAdded(Object endpoint);
void endpointRemoved(Object endpoint);
}