You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ad...@apache.org on 2004/02/05 06:26:33 UTC
cvs commit: incubator-geronimo/modules/kernel/src/test/org/apache/geronimo/kernel BootstrapTest.java
adc 2004/02/04 21:26:33
Modified: modules/kernel/src/java/org/apache/geronimo/kernel
Kernel.java
modules/kernel/src/test/org/apache/geronimo/kernel
BootstrapTest.java
Log:
Tidier map management comme the Lock class.
Revision Changes Path
1.15 +56 -19 incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/kernel/Kernel.java
Index: Kernel.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/kernel/Kernel.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- Kernel.java 5 Feb 2004 00:41:30 -0000 1.14
+++ Kernel.java 5 Feb 2004 05:26:33 -0000 1.15
@@ -73,6 +73,7 @@
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
+import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.net.URI;
import java.net.URL;
@@ -127,6 +128,7 @@
public static final ObjectName CONFIG_STORE = JMXUtil.getObjectName("geronimo.boot:role=ConfigurationStore");
private static final Map kernels = new Hashtable();
+ private static final ReferenceQueue queue = new ReferenceQueue();
private final String kernelName;
private final String domainName;
private final GBeanInfo storeInfo;
@@ -152,8 +154,6 @@
this.domainName = domainName;
this.storeInfo = storeInfo;
this.configStore = configStore;
-
- kernels.put(kernelName, new WeakReference(this));
}
/**
@@ -210,15 +210,17 @@
* @return the kernel that was registered with that name
*/
public static Kernel getKernel(String name) {
- WeakReference reference = (WeakReference) kernels.get(name);
-
- if (reference == null) return null;
-
- Kernel result = (Kernel) reference.get();
- if (result == null) {
- kernels.remove(name);
+ synchronized (kernels) {
+ processQueue();
+ KernelReference ref = (KernelReference) kernels.get(name);
+ if (ref != null) {
+ Kernel kernel = (Kernel) ref.get();
+ if (kernel != null) {
+ return kernel;
+ }
+ }
}
- return result;
+ return null;
}
/**
@@ -230,15 +232,19 @@
* @throws IllegalStateException if more than one
*/
public static Kernel getSingleKernel() {
- int size = kernels.size();
- if (size > 1) throw new IllegalStateException("More than one kernel has been registered.");
- if (size < 1) return null;
-
- Kernel result = (Kernel) ((WeakReference) kernels.values().iterator().next()).get();
- if (result == null) {
- kernels.clear();
+ synchronized (kernels) {
+ processQueue();
+
+ int size = kernels.size();
+ if (size > 1) throw new IllegalStateException("More than one kernel has been registered.");
+ if (size < 1) return null;
+
+ Kernel result = (Kernel) ((KernelReference) kernels.values().iterator().next()).get();
+ if (result == null) {
+ kernels.clear();
+ }
+ return result;
}
- return result;
}
public static ObjectName getConfigObjectName(URI configID) throws MalformedObjectNameException {
@@ -431,6 +437,13 @@
}
log = LogFactory.getLog(Kernel.class.getName());
log.info("Starting boot");
+
+ if (kernelName != null) {
+ synchronized (kernels) {
+ kernels.put(kernelName, new KernelReference(kernelName, this));
+ }
+ }
+
mbServer = MBeanServerFactory.createMBeanServer(domainName);
mbServer.registerMBean(this, KERNEL);
mbServer.registerMBean(new DependencyService(), DEPENDENCY_SERVICE);
@@ -488,6 +501,13 @@
synchronized (this) {
notify();
}
+
+ if (kernelName != null) {
+ synchronized (kernels) {
+ kernels.remove(kernelName);
+ }
+ }
+
log.info("Kernel shutdown complete");
}
@@ -506,4 +526,21 @@
public void removeNotificationListener(NotificationListener listener) throws ListenerNotFoundException {
}
+ private static void processQueue() {
+ KernelReference kernelRef;
+ while ((kernelRef = (KernelReference) queue.poll()) != null) {
+ synchronized (kernels) {
+ kernels.remove(kernelRef.key);
+ }
+ }
+ }
+
+ private static class KernelReference extends WeakReference {
+ private final Object key;
+
+ public KernelReference(Object key, Object kernel) {
+ super(kernel, queue);
+ this.key = key;
+ }
+ }
}
1.4 +10 -1 incubator-geronimo/modules/kernel/src/test/org/apache/geronimo/kernel/BootstrapTest.java
Index: BootstrapTest.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/kernel/src/test/org/apache/geronimo/kernel/BootstrapTest.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- BootstrapTest.java 4 Feb 2004 05:42:57 -0000 1.3
+++ BootstrapTest.java 5 Feb 2004 05:26:33 -0000 1.4
@@ -78,23 +78,32 @@
public void testCreate() throws Exception {
Kernel kernel = new Kernel("test.kernel", "geronimo", storeInfo, configRoot);
+ assertEquals("No kernel should be registered", null, Kernel.getKernel("test.kernel"));
kernel.boot();
+ assertEquals("test.kernel kernel should be registered", kernel, Kernel.getKernel("test.kernel"));
kernel.shutdown();
+ assertEquals("No kernel should be registered", null, Kernel.getKernel("test.kernel"));
}
public void testPersist() throws Exception {
Kernel kernel = new Kernel("test.kernel", "geronimo", storeInfo, configRoot);
+ assertEquals("No kernel should be registered", null, Kernel.getKernel("test.kernel"));
kernel.boot();
+ assertEquals("test.kernel kernel should be registered", kernel, Kernel.getKernel("test.kernel"));
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(kernelState));
oos.writeObject(kernel);
oos.close();
kernel.shutdown();
+ assertEquals("No kernel should be registered", null, Kernel.getKernel("test.kernel"));
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(kernelState));
kernel = (Kernel) ois.readObject();
ois.close();
+ assertEquals("No kernel should be registered", null, Kernel.getKernel("test.kernel"));
kernel.boot();
+ assertEquals("test.kernel kernel should be registered", kernel, Kernel.getKernel("test.kernel"));
kernel.shutdown();
+ assertEquals("No kernel should be registered", null, Kernel.getKernel("test.kernel"));
}
protected void setUp() throws Exception {