You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by da...@apache.org on 2004/01/15 01:45:55 UTC
cvs commit: incubator-geronimo/modules/kernel/src/test/org/apache/geronimo/kernel ConfigTest.java MockGBean.java
dain 2004/01/14 16:45:55
Modified: modules/kernel/src/java/org/apache/geronimo/gbean/jmx
AbstractManagedObject.java CollectionProxy.java
GBeanMBeanEndpoint.java ProxyMethodInterceptor.java
SingleProxy.java
modules/kernel/src/test/org/apache/geronimo/kernel
ConfigTest.java MockGBean.java
Log:
Added dependency registration to SingleProxy
SingleProxy will attempt a full start if it blocked the original start
Fixed a bunch of bugs in ProxyMethodInterceptor around construction of the method table
Got the start recurisve test in ConfigTest working
Revision Changes Path
1.2 +11 -1 incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/AbstractManagedObject.java
Index: AbstractManagedObject.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/AbstractManagedObject.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- AbstractManagedObject.java 12 Jan 2004 01:38:55 -0000 1.1
+++ AbstractManagedObject.java 15 Jan 2004 00:45:54 -0000 1.2
@@ -219,6 +219,14 @@
return objectName.toString();
}
+ public final ObjectName getObjectNameObject() {
+ return objectName;
+ }
+
+ public DependencyService2MBean getDependencyService() {
+ return dependencyService;
+ }
+
public final boolean isStateManageable() {
return true;
}
@@ -506,6 +514,7 @@
try {
doStart();
} catch (WaitingException e) {
+ log.debug("Waiting to start: objectName=\"" + objectName + "\" reason=\"" + e.getMessage() + "\"");
return;
}
setStateInstance(State.RUNNING);
@@ -576,6 +585,7 @@
try {
doStop();
} catch (WaitingException e) {
+ log.debug("Waiting to stop: objectName=\"" + objectName + "\" reason=\"" + e.getMessage() + "\"");
return;
}
setStateInstance(State.STOPPED);
1.3 +7 -16 incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/CollectionProxy.java
Index: CollectionProxy.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/CollectionProxy.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- CollectionProxy.java 14 Jan 2004 22:16:38 -0000 1.2
+++ CollectionProxy.java 15 Jan 2004 00:45:54 -0000 1.3
@@ -64,8 +64,8 @@
import java.util.Set;
import javax.management.ObjectName;
-import org.apache.geronimo.kernel.jmx.InterfaceCallbackFilter;
import org.apache.geronimo.gbean.WaitingException;
+import org.apache.geronimo.kernel.jmx.InterfaceCallbackFilter;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.Factory;
@@ -83,11 +83,6 @@
private final GBeanMBean gmbean;
/**
- * The proxy type
- */
- private final Class type;
-
- /**
* A map from object names to the proxy
*/
private final Map proxies = new HashMap();
@@ -109,7 +104,6 @@
public CollectionProxy(GBeanMBean gmbean, Class type) {
this.gmbean = gmbean;
- this.type = type;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Object.class);
enhancer.setInterfaces(new Class[]{type});
@@ -130,7 +124,7 @@
public synchronized void addTarget(ObjectName target) {
// if this is a new target...
if (!proxies.containsKey(target)) {
- ProxyMethodInterceptor interceptor = new ProxyMethodInterceptor(type);
+ ProxyMethodInterceptor interceptor = new ProxyMethodInterceptor(factory.getClass());
interceptor.connect(gmbean.getServer(), target, proxy.isStopped());
interceptors.put(target, interceptor);
proxies.put(target, factory.newInstance(interceptor));
@@ -138,13 +132,10 @@
}
public synchronized void removeTarget(ObjectName target) {
- // if this is one of our existing targets target...
- if (!proxies.containsKey(target)) {
- proxies.remove(target);
- ProxyMethodInterceptor interceptor = (ProxyMethodInterceptor) interceptors.remove(target);
- if (interceptor != null) {
- interceptor.disconnect();
- }
+ proxies.remove(target);
+ ProxyMethodInterceptor interceptor = (ProxyMethodInterceptor) interceptors.remove(target);
+ if (interceptor != null) {
+ interceptor.disconnect();
}
}
1.2 +2 -2 incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanMBeanEndpoint.java
Index: GBeanMBeanEndpoint.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanMBeanEndpoint.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- GBeanMBeanEndpoint.java 14 Jan 2004 22:16:38 -0000 1.1
+++ GBeanMBeanEndpoint.java 15 Jan 2004 00:45:54 -0000 1.2
@@ -194,7 +194,7 @@
public synchronized void online() throws ReflectionException {
// create the proxy
if (singleValued) {
- proxy = new SingleProxy(gmbean, name, type);
+ proxy = new SingleProxy(gmbean, name, type, patterns);
} else {
proxy = new CollectionProxy(gmbean, type);
}
1.2 +5 -6 incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/ProxyMethodInterceptor.java
Index: ProxyMethodInterceptor.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/ProxyMethodInterceptor.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ProxyMethodInterceptor.java 12 Jan 2004 01:38:55 -0000 1.1
+++ ProxyMethodInterceptor.java 15 Jan 2004 00:45:54 -0000 1.2
@@ -117,6 +117,7 @@
assert server != null && objectName != null;
this.server = server;
this.objectName = objectName;
+ this.stopped = stopped;
this.methodTable = ProxyMethodInterceptor.createMethodTable(server, objectName, proxyType);
}
@@ -186,9 +187,8 @@
Method[] methods = proxyType.getMethods();
for (int i = 0; i < methods.length; i++) {
Method method = methods[i];
- String superName = MethodProxy.getSuperName(proxyType, method);
- if (superName != null) {
- int index = fastClass.getIndex(superName, method.getParameterTypes());
+ int index = getSuperIndex(fastClass, method);
+ if (index >= 0) {
if (operations.containsKey(new MBeanOperationSignature(method))) {
methodTable[index] = new InvokeMBean(method, false, false);
} else if (method.getName().startsWith("get") && attributes.containsKey(method.getName().substring(3))) {
@@ -274,7 +274,6 @@
return enhancedClass.getIndex(name, parameterTypes);
}
}
- throw new IllegalArgumentException("Method not found on enhancedClass:" +
- " enhancedClass=" + enhancedClass.getJavaClass() + " method=" + method);
+ return -1;
}
}
1.3 +76 -17 incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/SingleProxy.java
Index: SingleProxy.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/SingleProxy.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- SingleProxy.java 14 Jan 2004 22:16:38 -0000 1.2
+++ SingleProxy.java 15 Jan 2004 00:45:54 -0000 1.3
@@ -55,17 +55,18 @@
*/
package org.apache.geronimo.gbean.jmx;
+import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;
import javax.management.ObjectName;
-import org.apache.geronimo.kernel.jmx.InterfaceCallbackFilter;
-import org.apache.geronimo.kernel.management.State;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.geronimo.gbean.WaitingException;
-import org.apache.geronimo.gbean.jmx.GBeanMBean;
-import org.apache.geronimo.gbean.jmx.Proxy;
-import org.apache.geronimo.gbean.jmx.ProxyMethodInterceptor;
+import org.apache.geronimo.kernel.management.State;
+import net.sf.cglib.proxy.CallbackFilter;
+import net.sf.cglib.proxy.Callbacks;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.Factory;
import net.sf.cglib.proxy.SimpleCallbacks;
@@ -76,6 +77,7 @@
* @version $Revision$ $Date$
*/
public class SingleProxy implements Proxy {
+ private static final Log log = LogFactory.getLog(SingleProxy.class);
/**
* The GBeanMBean to which this proxy belongs.
*/
@@ -87,6 +89,13 @@
private final String name;
/**
+ * The ObjectName patterns to which this proxy could be connected.
+ * This is used to block mbeans from starting that would match a
+ * pattern while we are running.
+ */
+ private final Set patterns;
+
+ /**
* A set of all targets matching the
*/
private final Set targets = new HashSet();
@@ -97,21 +106,31 @@
private final Object proxy;
/**
+ * Is the GBeanMBean waitng for me to start?
+ */
+ private boolean waitingForMe = false;
+
+ /**
* The interceptor for the proxy instance
*/
private ProxyMethodInterceptor methodInterceptor;
- public SingleProxy(GBeanMBean gmbean, String name, Class type) {
+ public SingleProxy(GBeanMBean gmbean, String name, Class type, Set patterns) {
this.gmbean = gmbean;
this.name = name;
+ this.patterns = patterns;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Object.class);
enhancer.setInterfaces(new Class[]{type});
- enhancer.setCallbackFilter(new InterfaceCallbackFilter(type));
+ enhancer.setCallbackFilter(new CallbackFilter() {
+ public int accept(Method method) {
+ return Callbacks.INTERCEPT;
+ }
+ });
enhancer.setCallbacks(new SimpleCallbacks());
enhancer.setClassLoader(type.getClassLoader());
Factory factory = enhancer.create();
- methodInterceptor = new ProxyMethodInterceptor(type);
+ methodInterceptor = new ProxyMethodInterceptor(factory.getClass());
proxy = factory.newInstance(methodInterceptor);
}
@@ -126,24 +145,59 @@
public synchronized void addTarget(ObjectName target) {
// if this is a new target...
if (!targets.contains(target)) {
+ if (targets.size() == 1) {
+ // will be more then one target... remove the dependency
+ ObjectName currentTarget = (ObjectName) targets.iterator().next();
+ gmbean.getDependencyService().removeDependency(gmbean.getObjectNameObject(), currentTarget);
+ }
+
targets.add(target);
// if we are running, we now have two valid targets, which is an illegal state so we need to fail
if (gmbean.getStateInstance() == State.RUNNING) {
gmbean.fail();
+ } else if (targets.size() == 1) {
+ // there is now just one target... add a dependency
+ gmbean.getDependencyService().addDependency(gmbean.getObjectNameObject(), target);
+ if (waitingForMe) {
+ attemptFullStart();
+ }
}
+
}
}
public synchronized void removeTarget(ObjectName target) {
- // if this is a new target...
- if (!targets.contains(target)) {
- targets.remove(target);
-
- // if we are running, we will no longer have a valid target, which is an illegal state so we need to fail
+ boolean wasTarget = targets.remove(target);
+ if (wasTarget) {
if (gmbean.getStateInstance() == State.RUNNING) {
+ // we no longer have a valid target, which is an illegal state so we need to fail
gmbean.fail();
+ } else if (targets.size() == 1) {
+ // we only have one target remaining... add a dependency
+ ObjectName remainingTarget = (ObjectName) targets.iterator().next();
+ gmbean.getDependencyService().addDependency(gmbean.getObjectNameObject(), remainingTarget);
+
+ if (waitingForMe) {
+ attemptFullStart();
+ }
+ } else if (targets.isEmpty()) {
+ // that was our last target... remove the dependency
+ gmbean.getDependencyService().removeDependency(gmbean.getObjectNameObject(), target);
}
+
+ }
+ }
+
+ private synchronized void attemptFullStart() {
+ try {
+ // there could be an issue with really badly written components holding up a stop when the
+ // component never reached the starting phase... then a target registers and we automatically
+ // attempt to restart
+ waitingForMe = false;
+ gmbean.attemptFullStart();
+ } catch (Exception e) {
+ log.warn("Exception occured while attempting to fully start: objetName=" + gmbean.getObjectName());
}
}
@@ -152,15 +206,20 @@
// We must have exactally one running target
//
if (targets.size() == 0) {
- throw new WaitingException("No targets are running: endpointName=" + name);
+ waitingForMe = true;
+ throw new WaitingException("No targets are running for " + name + " endpoint");
} else if (targets.size() > 1) {
- throw new WaitingException("More then one targets are running: endpointName=" + name);
+ waitingForMe = true;
+ throw new WaitingException("More then one targets are running for " + name + " endpoint");
}
-
+ waitingForMe = false;
+ gmbean.getDependencyService().addStartHolds(gmbean.getObjectNameObject(), patterns);
methodInterceptor.connect(gmbean.getServer(), (ObjectName) targets.iterator().next());
}
public synchronized void stop() {
+ waitingForMe = false;
methodInterceptor.disconnect();
+ gmbean.getDependencyService().removeStartHolds(gmbean.getObjectNameObject(), patterns);
}
}
1.5 +6 -4 incubator-geronimo/modules/kernel/src/test/org/apache/geronimo/kernel/ConfigTest.java
Index: ConfigTest.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/kernel/src/test/org/apache/geronimo/kernel/ConfigTest.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- ConfigTest.java 14 Jan 2004 22:16:38 -0000 1.4
+++ ConfigTest.java 15 Jan 2004 00:45:54 -0000 1.5
@@ -103,13 +103,15 @@
ObjectName configName = (ObjectName) mbServer.invoke(Kernel.KERNEL, "load", new Object[]{config, null}, new String[]{GBeanMBean.class.getName(), URL.class.getName()});
mbServer.invoke(configName, "startRecursive", null, null);
- assertEquals(new Integer(State.RUNNING.toInt()), mbServer.getAttribute(configName, "state"));
+ assertEquals(new Integer(State.RUNNING_INDEX), mbServer.getAttribute(configName, "state"));
assertNotNull(mbServer.getAttribute(configName, "ClassLoader"));
- assertEquals(new Integer(State.RUNNING.toInt()), mbServer.getAttribute(gbeanName1, "state"));
+ assertEquals(new Integer(State.RUNNING_INDEX), mbServer.getAttribute(gbeanName1, "state"));
+ Object state = mbServer.getAttribute(gbeanName2, "state");
+ assertEquals(new Integer(State.RUNNING_INDEX), state);
assertEquals("1234", mbServer.getAttribute(gbeanName1, "Value"));
assertEquals("no endpoint", mbServer.invoke(gbeanName1, "checkEndpoint", null, null));
- //assertEquals("endpointCheck", mbServer.invoke(gbeanName2, "checkEndpoint", null, null));
+ assertEquals("endpointCheck", mbServer.invoke(gbeanName2, "checkEndpoint", null, null));
mbServer.invoke(configName, "stop", null, null);
try {
1.3 +2 -1 incubator-geronimo/modules/kernel/src/test/org/apache/geronimo/kernel/MockGBean.java
Index: MockGBean.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/kernel/src/test/org/apache/geronimo/kernel/MockGBean.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- MockGBean.java 14 Jan 2004 20:41:56 -0000 1.2
+++ MockGBean.java 15 Jan 2004 00:45:55 -0000 1.3
@@ -86,6 +86,7 @@
infoFactory.addAttribute(new GAttributeInfo("Value", true));
infoFactory.addOperation(new GOperationInfo("checkResource", new String[]{"name"}, new String[]{"java.lang.String"}));
infoFactory.addOperation(new GOperationInfo("checkEndpoint"));
+ infoFactory.addOperation(new GOperationInfo("doSomething", new String[]{"name"}, new String[]{"java.lang.String"}));
infoFactory.addEndpoint(new GEndpointInfo("MockEndpoint", MockEndpoint.class.getName()));
infoFactory.setConstructor(new GConstructorInfo(Collections.singletonList("Name"), Collections.singletonList(String.class)));
GBEAN_INFO = infoFactory.getBeanInfo();