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 2005/05/08 21:35:28 UTC

svn commit: r169154 [3/6] - in /geronimo/trunk: applications/jmxdebug/src/java/org/apache/geronimo/jmxdebug/web/beanlib/ applications/jmxdebug/src/webapp/WEB-INF/ assemblies/j2ee-server/ etc/ modules/assembly/ modules/assembly/src/plan/ modules/axis-builder/ modules/axis/ modules/classloader-server/ modules/classloader-server/src/test/org/apache/geronimo/classloaderserver/http/ modules/client-builder/ modules/client-builder/src/java/org/apache/geronimo/client/builder/ modules/client-builder/src/test/org/apache/geronimo/client/builder/ modules/client/ modules/connector-builder/ modules/connector-builder/src/java/org/apache/geronimo/connector/deployment/ modules/connector-builder/src/test/org/apache/geronimo/connector/deployment/ modules/connector/ modules/connector/src/java/org/apache/geronimo/connector/ modules/connector/src/java/org/apache/geronimo/connector/outbound/ modules/connector/src/test/org/apache/geronimo/connector/ modules/connector/src/test/org/apache/geronimo/connector/outbound/ modules/deploy-tool/src/java/org/apache/geronimo/deployment/ modules/deploy-tool/src/java/org/apache/geronimo/deployment/plugin/jmx/ modules/deploy-tool/src/java/org/apache/geronimo/deployment/plugin/local/ modules/deployment/ modules/deployment/src/java/org/apache/geronimo/deployment/ modules/deployment/src/java/org/apache/geronimo/deployment/util/ modules/interop/ modules/interop/src/test/org/apache/geronimo/interop/ modules/j2ee-builder/ modules/j2ee-builder/src/java/org/apache/geronimo/j2ee/deployment/ modules/j2ee-builder/src/test/org/apache/geronimo/j2ee/deployment/ modules/j2ee/ modules/j2ee/src/java/org/apache/geronimo/j2ee/management/impl/ modules/j2ee/src/test/org/apache/geronimo/j2ee/management/ modules/jetty-builder/ modules/jetty-builder/src/java/org/apache/geronimo/jetty/deployment/ modules/jetty-builder/src/test/org/apache/geronimo/jetty/deployment/ modules/jetty/ modules/jetty/src/test/org/apache/geronimo/jetty/ modules/jmx-remoting/src/java/org/apache/geronimo/jmxremoting/ modules/kernel/ modules/kernel/src/java/org/apache/geronimo/gbean/jmx/ modules/kernel/src/java/org/apache/geronimo/gbean/runtime/ modules/kernel/src/java/org/apache/geronimo/kernel/ modules/kernel/src/java/org/apache/geronimo/kernel/basic/ modules/kernel/src/java/org/apache/geronimo/kernel/config/ modules/kernel/src/java/org/apache/geronimo/kernel/jmx/ modules/kernel/src/java/org/apache/geronimo/kernel/lifecycle/ modules/kernel/src/java/org/apache/geronimo/kernel/proxy/ modules/kernel/src/java/org/apache/geronimo/kernel/registry/ modules/kernel/src/test/org/apache/geronimo/gbean/ modules/kernel/src/test/org/apache/geronimo/gbean/runtime/ modules/kernel/src/test/org/apache/geronimo/kernel/ modules/mail/ modules/mail/src/java/org/apache/geronimo/mail/ modules/mail/src/test/org/apache/geronimo/mail/ modules/naming/src/java/org/apache/geronimo/naming/reference/ modules/naming/src/test/org/apache/geronimo/naming/java/ modules/security/ modules/security/src/java/org/apache/geronimo/security/jaas/ modules/security/src/java/org/apache/geronimo/security/realm/ modules/security/src/java/org/apache/geronimo/security/realm/providers/ modules/security/src/test/org/apache/geronimo/security/ modules/security/src/test/org/apache/geronimo/security/jaas/ modules/security/src/test/org/apache/geronimo/security/remoting/jmx/ modules/service-builder/ modules/service-builder/src/java/org/apache/geronimo/deployment/service/ modules/spring-builder/ modules/spring-builder/src/java/org/apache/geronimo/spring/deployment/ modules/spring/ modules/spring/src/java/org/apache/geronimo/spring/ modules/system/ modules/system/src/java/org/apache/geronimo/system/configuration/ modules/system/src/java/org/apache/geronimo/system/jmx/ modules/system/src/java/org/apache/geronimo/system/main/ modules/system/src/test/org/apache/geronimo/system/configuration/ modules/test-ddbean/src/java/org/apache/geronimo/deployment/tools/ modules/tomcat-builder/ modules/tomcat-builder/src/java/org/apache/geronimo/tomcat/deployment/ modules/tomcat-builder/src/test/org/apache/geronimo/tomcat/deployment/ modules/tomcat/ modules/tomcat/src/plan/ modules/tomcat/src/test/org/apache/geronimo/tomcat/ modules/webservices/ plugins/geronimo-packaging-plugin/ plugins/geronimo-packaging-plugin/src/java/org/apache/geronimo/plugin/packaging/ plugins/maven-geronimo-plugin/ plugins/maven-geronimo-plugin/src/java/org/apache/geronimo/deployment/mavenplugin/

Modified: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanInstanceState.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanInstanceState.java?rev=169154&r1=169153&r2=169154&view=diff
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanInstanceState.java (original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanInstanceState.java Sun May  8 12:35:23 2005
@@ -24,8 +24,8 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.geronimo.kernel.DependencyManager;
 import org.apache.geronimo.kernel.GBeanNotFoundException;
-import org.apache.geronimo.kernel.Kernel;
 import org.apache.geronimo.kernel.NoSuchAttributeException;
+import org.apache.geronimo.kernel.Kernel;
 import org.apache.geronimo.kernel.lifecycle.LifecycleAdapter;
 import org.apache.geronimo.kernel.lifecycle.LifecycleListener;
 import org.apache.geronimo.kernel.management.State;
@@ -190,9 +190,9 @@
             ObjectName child = (ObjectName) iterator.next();
             try {
                 log.trace("Checking if child is running: child=" + child);
-                if (((Integer) kernel.getAttribute(child, "state")).intValue() == State.RUNNING_INDEX) {
+                if (kernel.getGBeanState(child) == State.RUNNING_INDEX) {
                     log.trace("Stopping child: child=" + child);
-                    kernel.invoke(child, "stop", null, null);
+                    kernel.stopGBean(child);
                     log.trace("Stopped child: child=" + child);
                 }
             } catch (Exception ignore) {
@@ -306,14 +306,11 @@
                 }
                 try {
                     log.trace("Checking if parent is running: parent=" + parent);
-                    if (((Integer) kernel.getAttribute(parent, "state")).intValue() != State.RUNNING_INDEX) {
+                    if (kernel.getGBeanState(parent) != State.RUNNING_INDEX) {
                         log.trace("Cannot run because parent is not running: parent=" + parent);
                         return;
                     }
                     log.trace("Parent is running: parent=" + parent);
-                } catch (NoSuchAttributeException e) {
-                    // ok -- parent is not a startable
-                    log.trace("Parent does not have a State attibute");
                 } catch (GBeanNotFoundException e) {
                     // depended on instance was removed bewteen the register check and the invoke
                     log.trace("Cannot run because parent is not registered: parent=" + parent);

Modified: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanSingleReference.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanSingleReference.java?rev=169154&r1=169153&r2=169154&view=diff
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanSingleReference.java (original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanSingleReference.java Sun May  8 12:35:23 2005
@@ -25,8 +25,8 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.geronimo.gbean.GReferenceInfo;
 import org.apache.geronimo.gbean.InvalidConfigurationException;
-import org.apache.geronimo.kernel.Kernel;
 import org.apache.geronimo.kernel.DependencyManager;
+import org.apache.geronimo.kernel.Kernel;
 import org.apache.geronimo.kernel.lifecycle.LifecycleAdapter;
 import org.apache.geronimo.kernel.lifecycle.LifecycleListener;
 import org.apache.geronimo.kernel.management.State;

Modified: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/ClassLoaderReference.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/ClassLoaderReference.java?rev=169154&r1=169153&r2=169154&view=diff
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/ClassLoaderReference.java (original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/ClassLoaderReference.java Sun May  8 12:35:23 2005
@@ -16,15 +16,13 @@
  */
 package org.apache.geronimo.kernel;
 
-import java.io.Serializable;
 import java.io.IOException;
-import java.io.ObjectStreamException;
+import java.io.Serializable;
 
 /**
  * @version $Rev$ $Date$
  */
 public class ClassLoaderReference extends ClassLoader implements Serializable {
-
     private ClassLoader classloader;
 
     public ClassLoaderReference(ClassLoader parent) {
@@ -37,7 +35,7 @@
         classloader = objectInputStreamExt.getClassloader();
     }
 
-    private Object readResolve() throws ObjectStreamException {
+    private Object readResolve() {
         return classloader;
     }
 }

Modified: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/ClassLoading.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/ClassLoading.java?rev=169154&r1=169153&r2=169154&view=diff
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/ClassLoading.java (original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/ClassLoading.java Sun May  8 12:35:23 2005
@@ -27,7 +27,6 @@
  * @version $Rev$ $Date$
  */
 public class ClassLoading {
-
     /**
      * Load a class for the given name.
      * <p/>

Modified: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/DependencyManager.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/DependencyManager.java?rev=169154&r1=169153&r2=169154&view=diff
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/DependencyManager.java (original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/DependencyManager.java Sun May  8 12:35:23 2005
@@ -18,72 +18,24 @@
 package org.apache.geronimo.kernel;
 
 import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
 import java.util.Set;
 import javax.management.ObjectName;
 
-import org.apache.geronimo.kernel.lifecycle.LifecycleAdapter;
-import org.apache.geronimo.kernel.lifecycle.LifecycleListener;
-import org.apache.geronimo.kernel.lifecycle.LifecycleMonitor;
-
 /**
  * DependencyManager is the record keeper of the dependencies in Geronimo.  The DependencyManager
  * does not enforce any dependencies, it is simply a place where components can register their intent
- * to be dependent on another component.  Since a JMX Component can pretty much do whatever it wants
- * a component must watch the components it depends on to assure that they are following the
- * J2EE-Management state machine.
+ * to be dependent on another component.
  * <p/>
  * The DependencyManager uses the nomenclature of parent-child where a child is dependent on a parent.
  * The names parent and child have no other meaning are just a convience to make the code readable.
  *
  * @version $Rev$ $Date$
  */
-public class DependencyManager {
-    /**
-     * The lifecycleMonitor informs us when gbeans go off line,
-     * so we can clean up the lingering dependencies.
-     */
-    private final LifecycleMonitor lifecycleMonitor;
-
-    /**
-     * Listenes for GBeans to unregister and removes all dependencies associated with the dependency
-     */
-    private final LifecycleListener lifecycleListener = new DependencyManagerLifecycleListener();
-
-    /**
-     * A map from child names to a list of parents.
-     */
-    private final Map childToParentMap = new HashMap();
-
+public interface DependencyManager {
     /**
-     * A map from parent back to a list of its children.
+     * Closes the dependency manager releasing all resources
      */
-    private final Map parentToChildMap = new HashMap();
-
-    /**
-     * A map from a component's ObjectName to the list of ObjectPatterns that the component is blocking
-     * from starting.
-     */
-    private final Map startHoldsMap = new HashMap();
-
-    public DependencyManager(LifecycleMonitor lifecycleMonitor) throws Exception {
-        assert lifecycleMonitor != null;
-        this.lifecycleMonitor = lifecycleMonitor;
-        lifecycleMonitor.addLifecycleListener(lifecycleListener, new ObjectName("*:*"));
-    }
-
-    public synchronized void close() {
-        lifecycleMonitor.removeLifecycleListener(lifecycleListener);
-        childToParentMap.clear();
-        parentToChildMap.clear();
-        startHoldsMap.clear();
-    }
+    public void close();
 
     /**
      * Declares a dependency from a child to a parent.
@@ -91,21 +43,7 @@
      * @param child the dependent component
      * @param parent the component the child is depending on
      */
-    public synchronized void addDependency(ObjectName child, ObjectName parent) {
-        Set parents = (Set) childToParentMap.get(child);
-        if (parents == null) {
-            parents = new HashSet();
-            childToParentMap.put(child, parents);
-        }
-        parents.add(parent);
-
-        Set children = (Set) parentToChildMap.get(parent);
-        if (children == null) {
-            children = new HashSet();
-            parentToChildMap.put(parent, children);
-        }
-        children.add(child);
-    }
+    public void addDependency(ObjectName child, ObjectName parent);
 
     /**
      * Removes a dependency from a child to a parent
@@ -113,37 +51,14 @@
      * @param child the dependnet component
      * @param parent the component that the child wil no longer depend on
      */
-    public synchronized void removeDependency(ObjectName child, ObjectName parent) {
-        Set parents = (Set) childToParentMap.get(child);
-        if (parents != null) {
-            parents.remove(parent);
-        }
-
-        Set children = (Set) parentToChildMap.get(parent);
-        if (children != null) {
-            children.remove(child);
-        }
-    }
+    public void removeDependency(ObjectName child, ObjectName parent);
 
     /**
      * Removes all dependencies for a child
      *
      * @param child the component that will no longer depend on anything
      */
-    public synchronized void removeAllDependencies(ObjectName child) {
-        Set parents = (Set) childToParentMap.remove(child);
-        if (parents == null) {
-            return;
-        }
-        for (Iterator iterator = parents.iterator(); iterator.hasNext();) {
-            ObjectName parent = (ObjectName) iterator.next();
-            Set children = (Set) parentToChildMap.get(parent);
-            if (children != null) {
-                children.remove(child);
-            }
-
-        }
-    }
+    public void removeAllDependencies(ObjectName child);
 
     /**
      * Adds dependencies from the child to every parent in the parents set
@@ -151,25 +66,7 @@
      * @param child the dependent component
      * @param parents the set of components the child is depending on
      */
-    public synchronized void addDependencies(ObjectName child, Set parents) {
-        Set existingParents = (Set) childToParentMap.get(child);
-        if (existingParents == null) {
-            existingParents = new HashSet(parents);
-            childToParentMap.put(child, existingParents);
-        } else {
-            existingParents.addAll(parents);
-        }
-
-        for (Iterator i = parents.iterator(); i.hasNext();) {
-            Object startParent = i.next();
-            Set children = (Set) parentToChildMap.get(startParent);
-            if (children == null) {
-                children = new HashSet();
-                parentToChildMap.put(startParent, children);
-            }
-            children.add(child);
-        }
-    }
+    public void addDependencies(ObjectName child, Set parents);
 
     /**
      * Gets the set of parents that the child is depending on
@@ -177,13 +74,7 @@
      * @param child the dependent component
      * @return a collection containing all of the components the child depends on; will never be null
      */
-    public synchronized Set getParents(ObjectName child) {
-        Set parents = (Set) childToParentMap.get(child);
-        if (parents == null) {
-            return Collections.EMPTY_SET;
-        }
-        return new HashSet(parents);
-    }
+    public Set getParents(ObjectName child);
 
     /**
      * Gets all of the MBeans that have a dependency on the specified startParent.
@@ -191,13 +82,7 @@
      * @param parent the component the returned childen set depend on
      * @return a collection containing all of the components that depend on the parent; will never be null
      */
-    public synchronized Set getChildren(ObjectName parent) {
-        Set children = (Set) parentToChildMap.get(parent);
-        if (children == null) {
-            return Collections.EMPTY_SET;
-        }
-        return new HashSet(children);
-    }
+    public Set getChildren(ObjectName parent);
 
     /**
      * Adds a hold on a collection of object name patterns.  If the name of a component matches an object name
@@ -206,15 +91,7 @@
      * @param objectName the name of the component placing the holds
      * @param holds a collection of object name patterns which should not start
      */
-    public synchronized void addStartHolds(ObjectName objectName, Collection holds) {
-        Collection currentHolds = (Collection) startHoldsMap.get(objectName);
-        if (currentHolds == null) {
-            currentHolds = new LinkedList(holds);
-            startHoldsMap.put(objectName, currentHolds);
-        } else {
-            currentHolds.addAll(holds);
-        }
-    }
+    public void addStartHolds(ObjectName objectName, Collection holds);
 
     /**
      * Removes a collection of holds.
@@ -222,50 +99,20 @@
      * @param objectName the object name of the components owning the holds
      * @param holds a collection of the holds to remove
      */
-    public synchronized void removeStartHolds(ObjectName objectName, Collection holds) {
-        Collection currentHolds = (Collection) startHoldsMap.get(objectName);
-        if (currentHolds != null) {
-            currentHolds.removeAll(holds);
-        }
-    }
+    public void removeStartHolds(ObjectName objectName, Collection holds);
 
     /**
      * Removes all of the holds owned by a component.
      *
      * @param objectName the object name of the component that will no longer have any holds
      */
-    public synchronized void removeAllStartHolds(ObjectName objectName) {
-        startHoldsMap.remove(objectName);
-    }
-
-    /**
-     * Gets the object name of the mbean blocking the start specified mbean.
-     *
-     * @param objectName the mbean to check for blockers
-     * @return the mbean blocking the specified mbean, or null if there are no blockers
-     */
-    public synchronized ObjectName checkBlocker(ObjectName objectName) {
-        // check if objectName name is on one of the hold lists
-        for (Iterator iterator = startHoldsMap.keySet().iterator(); iterator.hasNext();) {
-            ObjectName blocker = (ObjectName) iterator.next();
-            List holds = (List) startHoldsMap.get(blocker);
-            for (Iterator holdsIterator = holds.iterator(); holdsIterator.hasNext();) {
-                ObjectName pattern = (ObjectName) holdsIterator.next();
-                if (pattern.apply(objectName)) {
-                    return blocker;
-                }
-            }
-        }
-        return null;
-    }
-
-    private class DependencyManagerLifecycleListener extends LifecycleAdapter {
-        public void unloaded(ObjectName objectName) {
-            synchronized (DependencyManager.this) {
-                removeAllDependencies(objectName);
-                removeAllStartHolds(objectName);
-            }
+    public void removeAllStartHolds(ObjectName objectName);
 
-        }
-    }
+    /**
+     * Gets the object name of the bean blocking the start specified bean.
+     *
+     * @param objectName the bean to check for blockers
+     * @return the bean blocking the specified bean, or null if there are no blockers
+     */
+    public ObjectName checkBlocker(ObjectName objectName);
 }

Modified: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/Kernel.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/Kernel.java?rev=169154&r1=169153&r2=169154&view=diff
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/Kernel.java (original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/Kernel.java Sun May  8 12:35:23 2005
@@ -1,6 +1,6 @@
 /**
  *
- * Copyright 2003-2004 The Apache Software Foundation
+ * 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.
@@ -14,561 +14,260 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-
 package org.apache.geronimo.kernel;
 
-import java.io.IOException;
-import java.lang.ref.ReferenceQueue;
-import java.lang.ref.WeakReference;
-import java.net.URI;
-import java.util.Collections;
 import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
 import java.util.Set;
-import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.apache.geronimo.gbean.GBeanData;
 import org.apache.geronimo.gbean.GBeanInfo;
-import org.apache.geronimo.gbean.GBeanName;
-import org.apache.geronimo.gbean.runtime.GBeanInstance;
-import org.apache.geronimo.kernel.config.Configuration;
-import org.apache.geronimo.kernel.config.ConfigurationManager;
-import org.apache.geronimo.kernel.config.ConfigurationManagerImpl;
-import org.apache.geronimo.kernel.config.InvalidConfigException;
-import org.apache.geronimo.kernel.config.NoSuchConfigException;
-import org.apache.geronimo.kernel.config.NoSuchStoreException;
-import org.apache.geronimo.kernel.jmx.JMXLifecycleBroadcaster;
 import org.apache.geronimo.kernel.jmx.JMXUtil;
-import org.apache.geronimo.kernel.lifecycle.BasicLifecycleMonitor;
 import org.apache.geronimo.kernel.lifecycle.LifecycleMonitor;
-import org.apache.geronimo.kernel.lifecycle.LifecycleMonitorFlyweight;
 import org.apache.geronimo.kernel.proxy.ProxyManager;
-import org.apache.geronimo.kernel.registry.BasicGBeanRegistry;
-import org.apache.geronimo.kernel.registry.GBeanRegistry;
-
 
 /**
- * The core of a Geronimo instance.
- * A Kernel is responsible for managing the Configurations that comprise a
- * Geronimo system and exposing them using JMX. Each Kernel is associated
- * with an MBeanServer that is used to register the Configurations themselves
- * and the MBeans they define.
- * <p/>
- * Dependencies between MBeans are handled by a dedicated DependencyManager
- * that is responsible for tracking those dependencies and ensuring that the
- * dependent objects follow the appropriate lifecycle and receive appropriate
- * notifications.
- * <p/>
- * The Kernel also provides a ConfigurationStore which is used to stage
- * installed Configurations (providing a local filesystem based classpath) and
- * used hold the persistent state of each Configuration. This allows
- * Configurations to restart in the event of system failure.
- * 
- * TODO: Describe the order of method invocation (e.g. if loadGbean may be before boot)
- *
  * @version $Rev$ $Date$
  */
-public class Kernel {
-
+public interface Kernel {
     /**
      * The JMX name used by a Kernel to register itself when it boots.
-     * todo drop "geronimo.boot:" from this name so the kernel shows up in the kernel default domain
      */
-    public static final ObjectName KERNEL = JMXUtil.getObjectName("geronimo.boot:role=Kernel");
+    ObjectName KERNEL = JMXUtil.getObjectName(":role=Kernel");
 
     /**
-     * Index of kernel (Weak) references by kernel name
+     * Get the name of this kernel
+     *
+     * @return the name of this kernel
      */
-    private static final Map kernels = new HashMap();
+    String getKernelName();
 
     /**
-     * ReferenceQueue that watches the weak references to our kernels
+     * Gets the dependency manager kernel service
+     * @return the dependency manager or null if the kernel is not running
      */
-    private static final ReferenceQueue queue = new ReferenceQueue();
+    DependencyManager getDependencyManager();
 
     /**
-     * Helper objects for invoke and getAttribute
+     * Gets the lifecycle monitor kernel service
+     * @return the lifecycle monitor or null if the kernel is not running
      */
-    private static final String[] NO_TYPES = new String[0];
-    private static final Object[] NO_ARGS = new Object[0];
+    LifecycleMonitor getLifecycleMonitor();
 
     /**
-     * Name of the configuration manager
-     * todo drop "geronimo.boot:" from this name so the configuration manger shows up in the kernel default domain
+     * Gets the proxy manager kernel service
+     * @return the proxy manager or null if the kernel is not running
      */
-    private static final ObjectName CONFIGURATION_MANAGER_NAME = JMXUtil.getObjectName("geronimo.boot:role=ConfigurationManager");
+    ProxyManager getProxyManager();
 
     /**
-     * Te pattern we use to find all the configuation stores registered with the kernel
+     * Load a specific GBean into this kernel.
+     * This is intended for applications that are embedding the kernel.
+     *
+     * @param gbeanData the GBean to load
+     * @param classLoader the class loader to use to load the gbean
+     * @throws org.apache.geronimo.kernel.GBeanAlreadyExistsException if the name is already used
+     * @throws org.apache.geronimo.kernel.InternalKernelException if there is a problem during registration
      */
-    private static final ObjectName CONFIGURATION_STORE_PATTERN = JMXUtil.getObjectName("*:j2eeType=ConfigurationStore,*");
+    void loadGBean(GBeanData gbeanData, ClassLoader classLoader) throws GBeanAlreadyExistsException, InternalKernelException;
 
     /**
-     * Name of this kernel
+     * Is there a GBean registered with the kernel under the specified name?
+     * @param name the name to check
+     * @return true if there is a gbean registered under the specified name; false otherwise
      */
-    private final String kernelName;
+    boolean isLoaded(ObjectName name);
 
     /**
-     * The log
+     * Start a specific GBean.
+     *
+     * @param name the GBean to start
+     * @throws org.apache.geronimo.kernel.GBeanNotFoundException if the GBean could not be found
+     * @throws InternalKernelException if there GBean is not state manageable or if there is a general error
+     * @throws IllegalStateException If the gbean is disabled
      */
-    private Log log;
+    void startGBean(ObjectName name) throws GBeanNotFoundException, InternalKernelException, IllegalStateException;
 
     /**
-     * Is this kernel running?
+     * Start a specific GBean and its children.
+     *
+     * @param name the GBean to start
+     * @throws GBeanNotFoundException if the GBean could not be found
+     * @throws InternalKernelException if there GBean is not state manageable or if there is a general error
+     * @throws IllegalStateException If the gbean is disabled
      */
-    private boolean running;
+    void startRecursiveGBean(ObjectName name) throws GBeanNotFoundException, InternalKernelException, IllegalStateException;
 
     /**
-     * The timestamp when the kernel was started
+     * Stop a specific GBean.
+     *
+     * @param name the GBean to stop
+     * @throws GBeanNotFoundException if the GBean could not be found
+     * @throws InternalKernelException if there GBean is not state manageable or if there is a general error
+     * @throws IllegalStateException If the gbean is disabled
      */
-    private Date bootTime;
+    void stopGBean(ObjectName name) throws GBeanNotFoundException, InternalKernelException, IllegalStateException;
 
     /**
-     * The gbean registry
+     * Unload a specific GBean.
+     * This is intended for applications that are embedding the kernel.
+     *
+     * @param name the name of the GBean to unregister
+     * @throws GBeanNotFoundException if the GBean could not be found
+     * @throws InternalKernelException if there GBean is a problem while unloading the GBean
      */
-    private final GBeanRegistry gbeanRegistry;
+    void unloadGBean(ObjectName name) throws GBeanNotFoundException, InternalKernelException, IllegalStateException;
 
     /**
-     * Listeners for when the kernel shutdown
+     * Gets the state of the specified GBean.
+     * @param name the name of the GBean
+     * @return the state of the GBean
+     * @throws GBeanNotFoundException if the GBean could not be found
      */
-    private LinkedList shutdownHooks = new LinkedList();
+    int getGBeanState(ObjectName name) throws GBeanNotFoundException;
 
     /**
-     * This manager is used by the kernel to manage dependencies between gbeans
+     * Gets the time the specified GBean was started
+     * @param name the name of the GBean
+     * @return the start time of the GBean or 0 if not running
+     * @throws GBeanNotFoundException if the GBean could not be found
      */
-    private DependencyManager dependencyManager;
+    long getGBeanStartTime(ObjectName name) throws GBeanNotFoundException;
 
     /**
-     * The kernel uses this manager to load configurations which are collections of GBeans
+     * Is the specified GBean enabled?
+     * @param name the name if the GBean
+     * @return true if the gbean is enabled
+     * @throws GBeanNotFoundException if the GBean could not be found
      */
-    private ConfigurationManager configurationManager;
+    boolean isGBeanEnabled(ObjectName name) throws GBeanNotFoundException;
 
     /**
-     * The GBeanMbean that wraps the configuration manager
+     * Sets the eneabled status of the specified GBean.  A disabled gbean can not be started, and
+     * will not be started via startRecursive.
+     * @param name the name if the GBean
+     * @param enabled the new enabled status
+     * @throws GBeanNotFoundException if the GBean could not be found
      */
-    private GBeanInstance configurationManagerInstance;
+    void setGBeanEnabled(ObjectName name, boolean enabled) throws GBeanNotFoundException;
 
     /**
-     * Monitors the lifecycle of all gbeans.
+     * Gets the ClassLoader used to register the specified GBean
+     * @param name the name of the gbean from which the class loader should be extracted
+     * @return the class loader associated with the specified GBean
+     * @throws GBeanNotFoundException if the specified GBean is not registered with the kernel
      */
-    private BasicLifecycleMonitor lifecycleMonitor;
-    private LifecycleMonitor publicLifecycleMonitor;
+    ClassLoader getClassLoaderFor(ObjectName name) throws GBeanNotFoundException;
 
     /**
-     * This factory gbean proxies, and tracks all proxies in the system
+     * Return the GBeanInfo for a registered GBean instance.
+     * @param name the name of the GBean whose info should be returned
+     * @return the info for that instance
+     * @throws GBeanNotFoundException if there is no instance with the supplied name
      */
-    private ProxyManager proxyManager;
+    GBeanInfo getGBeanInfo(ObjectName name) throws GBeanNotFoundException;
 
     /**
-     * No-arg constructor allowing this class to be used as a GBean reference.
+     * Return the GBeanData for a GBean instance.
+     * @param name the name of the GBean whose info should be returned
+     * @return the info for that instance
+     * @throws GBeanNotFoundException if there is no instance with the supplied name
      */
-    protected Kernel() {
-        kernelName = null;
-        gbeanRegistry = null;
-    }
+    GBeanData getGBeanData(ObjectName name) throws GBeanNotFoundException, InternalKernelException;
 
     /**
-     * Construct a Kernel with the specified name and GBeanRegistry implementation.
-     *
-     * @param kernelName the name of the kernel
-     * @param gbeanRegistry the GBeanRegistry implementation to use for this contianer
+     * Returns a Set of all GBeans matching the object name pattern
+     * @return a List of javax.management.ObjectName of matching GBeans registered with this kernel
      */
-    public Kernel(String kernelName, GBeanRegistry gbeanRegistry) {
-        if (kernelName.indexOf(':') >= 0 || kernelName.indexOf('*') >= 0 || kernelName.indexOf('?') >= 0) {
-            throw new IllegalArgumentException("Kernel name may not contain a ':', '*' or '?' character");
-        }
-        this.kernelName = kernelName;
-        this.gbeanRegistry = gbeanRegistry;
-    }
+    Set listGBeans(ObjectName pattern);
 
     /**
-     * Construct a Kernel with the specified name and an unspecified GBeanRegistry implementation.
-     *
-     * @param kernelName the name of the kernel
+     * Returns a Set of all GBeans matching the set of object name pattern
+     * @return a List of javax.management.ObjectName of matching GBeans registered with this kernel
      */
-    public Kernel(String kernelName) {
-        this(kernelName, new BasicGBeanRegistry());
-    }
-
-    public String getKernelName() {
-        return kernelName;
-    }
-
-    public static Set getKernelNames() {
-        synchronized(kernels) {
-            return Collections.unmodifiableSet(kernels.keySet());
-        }
-    }
-    
+    Set listGBeans(Set patterns);
+
     /**
-     * Get a particular kernel indexed by a name
-     *
-     * @param name the name of the kernel to be obtained
-     * @return the kernel that was registered with that name
+     * Gets the value of an attribute on the specified gbean
+     * @param objectName the name of the gbean from which the attribute will be retrieved
+     * @param attributeName the name of the attribute to fetch
+     * @return the value of the attribute
+     * @throws GBeanNotFoundException if there is not a gbean under the specified name
+     * @throws NoSuchAttributeException if the gbean does not contain the specified attribute
+     * @throws Exception if the gbean throws an exception from the getter
      */
-    public static Kernel getKernel(String name) {
-        if (name == null) {
-            return getSingleKernel();
-        }
-        synchronized (kernels) {
-            processQueue();
-            KernelReference ref = (KernelReference) kernels.get(name);
-            if (ref != null) {
-                return (Kernel) ref.get();
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Obtain the single kernel that's registered.
-     * <p/>
-     * <p>This method assumes that there is only one kernel registered and will throw an
-     * <code>IllegalStateException</code> if more than one has been registered.
-     *
-     * @return the single kernel that's registered
-     * @throws IllegalStateException if more than one
+    Object getAttribute(ObjectName objectName, String attributeName) throws GBeanNotFoundException, NoSuchAttributeException, Exception;
+
+    /**
+     * Sets the value of an attribute on the specified gbean
+     * @param objectName the name of the gbean from in which the new attribute value will be set
+     * @param attributeName the name of the attribute to set
+     * @param attributeValue the new value of the attribute
+     * @throws GBeanNotFoundException if there is not a gbean under the specified name
+     * @throws NoSuchAttributeException if the gbean does not contain the specified attribute
+     * @throws Exception if the gbean throws an exception from the setter
      */
-    public static Kernel getSingleKernel() {
-        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;
-        }
-    }
-
-    /**
-     * @deprecated this will be removed as when we add generalized dependencies to gbeans... the only current user is Configuration
-     */
-    public DependencyManager getDependencyManager() {
-        return dependencyManager;
-    }
-
-    public ConfigurationManager getConfigurationManager() {
-        return configurationManager;
-    }
-
-    /**
-     * Gets the lifecycle monitor.
-     * @deprecated don't use this yet... it may change or go away
-     */
-    public LifecycleMonitor getLifecycleMonitor() {
-        return publicLifecycleMonitor;
-    }
-
-    /**
-     * Gets the proxy manager.
-     * @deprecated don't use this yet... it may change or go away
-     */
-    public ProxyManager getProxyManager() {
-        return proxyManager;
-    }
-
-    public Object getAttribute(ObjectName objectName, String attributeName) throws GBeanNotFoundException, NoSuchAttributeException, Exception {
-        GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(new GBeanName(objectName));
-        return gbeanInstance.getAttribute(attributeName);
-    }
-
-    public void setAttribute(ObjectName objectName, String attributeName, Object attributeValue) throws GBeanNotFoundException, NoSuchAttributeException, Exception {
-        GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(new GBeanName(objectName));
-        gbeanInstance.setAttribute(attributeName, attributeValue);
-    }
-
-    public Object invoke(ObjectName objectName, String methodName) throws GBeanNotFoundException, NoSuchOperationException, InternalKernelException, Exception {
-        return invoke(objectName, methodName, NO_ARGS, NO_TYPES);
-    }
-
-    public Object invoke(ObjectName objectName, String methodName, Object[] args, String[] types) throws GBeanNotFoundException, NoSuchOperationException, InternalKernelException, Exception {
-        GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(new GBeanName(objectName));
-        return gbeanInstance.invoke(methodName, args, types);
-    }
-
-    public boolean isLoaded(ObjectName name) {
-        return gbeanRegistry.isRegistered(new GBeanName(name));
-    }
-
-    public GBeanInfo getGBeanInfo(ObjectName name) throws GBeanNotFoundException {
-        GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(new GBeanName(name));
-        return gbeanInstance.getGBeanInfo();
-    }
-
-    public GBeanData getGBeanData(ObjectName name) throws GBeanNotFoundException, InternalKernelException {
-        GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(new GBeanName(name));
-        return gbeanInstance.getGBeanData();
-    }
-
-    public void loadGBean(GBeanData gbeanData, ClassLoader classLoader) throws GBeanAlreadyExistsException, InternalKernelException {
-        ObjectName objectName = gbeanData.getName();
-        GBeanInstance gbeanInstance = new GBeanInstance(gbeanData, this, dependencyManager, lifecycleMonitor.createLifecycleBroadcaster(objectName), classLoader);
-        gbeanRegistry.register(gbeanInstance);
-    }
-
-    /**
-     * @deprecated use loadGBean(GBeanData gbeanData, ClassLoader classLoader)
-     */
-    public void loadGBean(ObjectName name, org.apache.geronimo.gbean.jmx.GBeanMBean gbean) throws GBeanAlreadyExistsException, InternalKernelException {
-        GBeanData gbeanData = gbean.getGBeanData();
-        gbeanData.setName(name);
-        ClassLoader classLoader = gbean.getClassLoader();
-        loadGBean(gbeanData, classLoader);
-    }
-
-    public void startGBean(ObjectName name) throws GBeanNotFoundException, InternalKernelException, IllegalStateException {
-        GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(new GBeanName(name));
-        gbeanInstance.start();
-    }
-
-    public void startRecursiveGBean(ObjectName name) throws GBeanNotFoundException, InternalKernelException, IllegalStateException {
-        GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(new GBeanName(name));
-        gbeanInstance.startRecursive();
-    }
-
-    public void stopGBean(ObjectName name) throws GBeanNotFoundException, InternalKernelException, IllegalStateException {
-        GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(new GBeanName(name));
-        gbeanInstance.stop();
-    }
-
-    public void unloadGBean(ObjectName name) throws GBeanNotFoundException, InternalKernelException, IllegalStateException {
-        GBeanName gbeanName = new GBeanName(name);
-        GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(gbeanName);
-        gbeanInstance.die();
-        gbeanRegistry.unregister(gbeanName);
-    }
-
-    public Set listGBeans(ObjectName pattern) {
-        String domain = (pattern == null || pattern.isDomainPattern()) ? null : pattern.getDomain();
-        Map props = pattern == null ? null : pattern.getKeyPropertyList();
-        Set gbeans = gbeanRegistry.listGBeans(domain, props);
-        Set result = new HashSet(gbeans.size());
-        for (Iterator i = gbeans.iterator(); i.hasNext();) {
-            GBeanInstance instance = (GBeanInstance) i.next();
-            result.add(instance.getObjectNameObject());
-        }
-        return result;
-    }
-
-    public Set listGBeans(Set patterns) {
-        Set gbeans = new HashSet();
-        for (Iterator iterator = patterns.iterator(); iterator.hasNext();) {
-            ObjectName pattern = (ObjectName) iterator.next();
-            gbeans.addAll(listGBeans(pattern));
-        }
-        return gbeans;
-    }
-
-    public List listConfigurationStores() {
-        return getConfigurationManager().listStores();
-    }
-
-    public List listConfigurations(ObjectName storeName) throws NoSuchStoreException {
-        return getConfigurationManager().listConfigurations(storeName);
-    }
-
-    public ObjectName startConfiguration(URI configID) throws NoSuchConfigException, IOException, InvalidConfigException, InternalKernelException {
-        ObjectName configName = getConfigurationManager().load(configID);
-		try {
-		    startRecursiveGBean(configName);
-		} catch (GBeanNotFoundException e) {
-		    // should not happen as we just loaded it
-		    throw new InvalidConfigException(e);
-		}
-		return configName;
-    }
-
-    public void stopConfiguration(URI configID) throws NoSuchConfigException, InternalKernelException {
-        ConfigurationManager configurationManager = getConfigurationManager();
-        try {
-            ObjectName configName = Configuration.getConfigurationObjectName(configID);
-            stopGBean(configName);
-        } catch (MalformedObjectNameException e) {
-            throw new NoSuchConfigException(e);
-        } catch (GBeanNotFoundException e) {
-            throw new NoSuchConfigException(e);
-        }
-        configurationManager.unload(configID);
-    }
-
-    public int getConfigurationState(URI configID) throws NoSuchConfigException, InternalKernelException {
-        GBeanInstance gbeanInstance = null;
-        try {
-            ObjectName configName = Configuration.getConfigurationObjectName(configID);
-            gbeanInstance = gbeanRegistry.getGBeanInstance(new GBeanName(configName));
-        } catch (MalformedObjectNameException e) {
-            throw new NoSuchConfigException(e);
-        } catch (GBeanNotFoundException e) {
-            throw new NoSuchConfigException(e);
-        }
-        return gbeanInstance.getState();
-    }
+    void setAttribute(ObjectName objectName, String attributeName, Object attributeValue) throws GBeanNotFoundException, NoSuchAttributeException, Exception;
 
     /**
-     * Boot this Kernel, triggering the instantiation of the MBeanServer and DependencyManager,
-     * and the registration of ConfigurationStore
-     *
-     * @throws java.lang.Exception if the boot fails
+     * Invokes a no-argument method on the specified GBean
+     * @param objectName the name of the gbean from in which the new attribute value will be set
+     * @param methodName the name of the method to invoke
+     * @return the return value of the method or null if the specified method does not return a value
+     * @throws GBeanNotFoundException if there is not a gbean under the specified name
+     * @throws NoSuchOperationException if the gbean does not have the specified operation
+     * @throws InternalKernelException if an error occurs within the kernel itself
+     * @throws Exception if the method throws an exception
+     */
+    Object invoke(ObjectName objectName, String methodName) throws GBeanNotFoundException, NoSuchOperationException, InternalKernelException, Exception;
+
+    /**
+     * Invokes a method on the specified GBean with the specified arguments
+     * @param objectName the name of the gbean from in which the new attribute value will be set
+     * @param methodName the name of the method to invoke
+     * @param args the arguments to pass to the method
+     * @param types the types of the arguments; the types are used to determine the signature of the mehod that should be invoked
+     * @return the return value of the method or null if the specified method does not return a value
+     * @throws GBeanNotFoundException if there is not a gbean under the specified name
+     * @throws NoSuchOperationException if the gbean does not have the specified operation
+     * @throws InternalKernelException if an error occurs within the kernel itself
+     * @throws Exception if the method throws an exception
+     */
+    Object invoke(ObjectName objectName, String methodName, Object[] args, String[] types) throws GBeanNotFoundException, NoSuchOperationException, InternalKernelException, Exception;
+
+    /**
+     * Brings the kernel online
+     * @throws Exception if the kernel can not boot
+     */
+    void boot() throws Exception;
+
+    /**
+     * Returns the time this kernel was last booted.
+     * @return the time this kernel was last booted; null if the kernel has not been
+     */
+    Date getBootTime();
+
+    /**
+     * Registers a runnable to execute when the kernel is shutdown
+     * @param hook a runnable to execute when the kernel is shutdown
      */
-    public void boot() throws Exception {
-        if (running) {
-            return;
-        }
-        bootTime = new Date();
-        log = LogFactory.getLog(Kernel.class.getName());
-        log.info("Starting boot");
-
-        // todo cleanup when boot fails
-        synchronized (kernels) {
-            if (kernels.containsKey(kernelName)) {
-                throw new IllegalStateException("A kernel is already running this kernel name: " + kernelName);
-            }
-            kernels.put(kernelName, new KernelReference(kernelName, this));
-        }
-
-        gbeanRegistry.start(this);
-
-        lifecycleMonitor = new BasicLifecycleMonitor(this);
-        publicLifecycleMonitor = new LifecycleMonitorFlyweight(lifecycleMonitor);
-        dependencyManager = new DependencyManager(publicLifecycleMonitor);
-        proxyManager = new ProxyManager(this);
-
-        // set up the data for the new configuration manager instance
-        GBeanData configurationData = new GBeanData(CONFIGURATION_MANAGER_NAME, ConfigurationManagerImpl.GBEAN_INFO);
-        configurationData.setReferencePatterns("Stores", Collections.singleton(CONFIGURATION_STORE_PATTERN));
-
-        // create the connfiguration manager instance
-        JMXLifecycleBroadcaster lifecycleBroadcaster = new JMXLifecycleBroadcaster(CONFIGURATION_MANAGER_NAME, lifecycleMonitor.createLifecycleBroadcaster(CONFIGURATION_MANAGER_NAME));
-        configurationManagerInstance = new GBeanInstance(configurationData, this, dependencyManager, lifecycleBroadcaster, getClass().getClassLoader());
-        configurationManagerInstance.start();
-        configurationManager = (ConfigurationManager) configurationManagerInstance.getTarget();
-        assert configurationManager != null: "ConfigurationManager failed to start";
-        gbeanRegistry.register(configurationManagerInstance);
-
-        // load and start the kernel gbean
-        GBeanData kernelGBeanData = new GBeanData(KERNEL, KernelGBean.GBEAN_INFO);
-        loadGBean(kernelGBeanData, getClass().getClassLoader());
-        startGBean(KERNEL);
-
-        running = true;
-        log.info("Booted");
-    }
-
-    public Date getBootTime() {
-        return bootTime;
-    }
-
-    public void registerShutdownHook(Runnable hook) {
-        assert hook != null : "Shutdown hook was null";
-        synchronized (shutdownHooks) {
-            shutdownHooks.add(hook);
-        }
-    }
-
-    public void unregisterShutdownHook(Runnable hook) {
-        synchronized (shutdownHooks) {
-            shutdownHooks.remove(hook);
-        }
-    }
-
-    /**
-     * Shut down this kernel instance, unregistering the MBeans and releasing
-     * the MBeanServer.
-     */
-    public void shutdown() {
-        if (!running) {
-            return;
-        }
-        running = false;
-        log.info("Starting kernel shutdown");
-
-        notifyShutdownHooks();
-        shutdownConfigManager();
-
-        gbeanRegistry.stop();
-
-        dependencyManager.close();
-        dependencyManager = null;
-
-        synchronized (this) {
-            notify();
-        }
-
-        synchronized (kernels) {
-            kernels.remove(kernelName);
-        }
-
-        log.info("Kernel shutdown complete");
-    }
-
-    private void notifyShutdownHooks() {
-        while (!shutdownHooks.isEmpty()) {
-            Runnable hook;
-            synchronized (shutdownHooks) {
-                hook = (Runnable) shutdownHooks.removeFirst();
-            }
-            try {
-                hook.run();
-            } catch (Throwable e) {
-                log.warn("Error from kernel shutdown hook", e);
-            }
-        }
-    }
-
-    private void shutdownConfigManager() {
-        configurationManager = null;
-        if (configurationManagerInstance != null) {
-            try {
-                configurationManagerInstance.stop();
-            } catch (Exception e) {
-                // ignore
-            }
-            try {
-                gbeanRegistry.unregister(new GBeanName(CONFIGURATION_MANAGER_NAME));
-            } catch (Exception e) {
-                // ignore
-            }
-            configurationManagerInstance = null;
-        }
-    }
-
-    public boolean isRunning() {
-        return running;
-    }
-
-    public ClassLoader getClassLoaderFor(ObjectName name) throws GBeanNotFoundException {
-        GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(new GBeanName(name));
-        return gbeanInstance.getClassLoader();
-    }
-
-    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;
-        }
-    }
+    void registerShutdownHook(Runnable hook);
+
+    /**
+     * Unregisters a runnable from the list to execute when the kernel is shutdown
+     * @param hook the runnable that should be removed
+     */
+    void unregisterShutdownHook(Runnable hook);
+
+    /**
+     * Stops the kernel
+     */
+    void shutdown();
+
+    /**
+     * Has the kernel been booted
+     * @return true if the kernel has been booted; false otherwise
+     */
+    boolean isRunning();
+
 }

Added: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/KernelFactory.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/KernelFactory.java?rev=169154&view=auto
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/KernelFactory.java (added)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/KernelFactory.java Sun May  8 12:35:23 2005
@@ -0,0 +1,89 @@
+/**
+ *
+ * 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.geronimo.kernel;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import org.apache.geronimo.kernel.basic.BasicKernelFactory;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public abstract class KernelFactory {
+    public static final String KERNEL_FACTORY_KEY = KernelFactory.class.getName();
+
+    public static KernelFactory newInstance() {
+        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+        if (classLoader == null) {
+            classLoader = KernelFactory.class.getClassLoader();
+        }
+
+        // System property
+        try {
+            String kernelFactoryName = System.getProperty(KERNEL_FACTORY_KEY);
+            if (kernelFactoryName != null) {
+                return createKernelFactory(kernelFactoryName, classLoader);
+            }
+        } catch (SecurityException se) {
+        }
+
+        // Jar Service Specification - http://java.sun.com/j2se/1.3/docs/guide/jar/jar.html
+        String serviceId = "META-INF/services/" + KERNEL_FACTORY_KEY;
+        InputStream inputStream = null;
+        try {
+            inputStream = classLoader.getResourceAsStream(serviceId);
+            if (inputStream != null) {
+                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
+                String kernelFactoryName = reader.readLine();
+                reader.close();
+
+                if (kernelFactoryName != null && kernelFactoryName.length() > 0) {
+                    return createKernelFactory(kernelFactoryName, classLoader);
+                }
+            }
+        } catch (Exception ignored) {
+        } finally {
+            if (inputStream != null) {
+                try {
+                    inputStream.close();
+                } catch (IOException ignored) {
+                }
+                inputStream = null;
+            }
+        }
+
+        // Default is the basic kernel
+        return new BasicKernelFactory();
+    }
+
+    private static KernelFactory createKernelFactory(String className, ClassLoader classLoader) {
+        try {
+            return (KernelFactory) classLoader.loadClass(className).newInstance();
+        } catch (ClassCastException e) {
+            throw new KernelFactoryError("Kernel factory class does not implement KernelFactory: " + className);
+        } catch (ClassNotFoundException e) {
+            throw new KernelFactoryError("Kernel factory class not found: " + className);
+        } catch (Exception e) {
+            throw new KernelFactoryError("Unable to instantiate kernel factory class: " + className, e);
+        }
+    }
+
+    public abstract Kernel createKernel(String kernelName);
+}

Added: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/KernelFactoryError.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/KernelFactoryError.java?rev=169154&view=auto
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/KernelFactoryError.java (added)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/KernelFactoryError.java Sun May  8 12:35:23 2005
@@ -0,0 +1,38 @@
+/**
+ *
+ * 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.geronimo.kernel;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class KernelFactoryError extends Error {
+    public KernelFactoryError() {
+        super();
+    }
+
+    public KernelFactoryError(String message) {
+        super(message);
+    }
+
+    public KernelFactoryError(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public KernelFactoryError(Throwable cause) {
+        super(cause);
+    }
+}

Modified: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/KernelGBean.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/KernelGBean.java?rev=169154&r1=169153&r2=169154&view=diff
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/KernelGBean.java (original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/KernelGBean.java Sun May  8 12:35:23 2005
@@ -16,31 +16,42 @@
  */
 package org.apache.geronimo.kernel;
 
-import java.io.IOException;
-import java.net.URI;
 import java.util.Date;
-import java.util.List;
 import java.util.Set;
 import javax.management.ObjectName;
 
 import org.apache.geronimo.gbean.GBeanData;
 import org.apache.geronimo.gbean.GBeanInfo;
 import org.apache.geronimo.gbean.GBeanInfoBuilder;
-import org.apache.geronimo.kernel.config.ConfigurationManager;
-import org.apache.geronimo.kernel.config.InvalidConfigException;
-import org.apache.geronimo.kernel.config.NoSuchConfigException;
-import org.apache.geronimo.kernel.config.NoSuchStoreException;
+import org.apache.geronimo.kernel.lifecycle.LifecycleMonitor;
+import org.apache.geronimo.kernel.proxy.ProxyManager;
 
 /**
  * @version $Rev$ $Date$
  */
-public class KernelGBean {
+public class KernelGBean implements Kernel{
     private final Kernel kernel;
 
     public KernelGBean(Kernel kernel) {
         this.kernel = kernel;
     }
 
+    public DependencyManager getDependencyManager() {
+        return kernel.getDependencyManager();
+    }
+
+    public LifecycleMonitor getLifecycleMonitor() {
+        return kernel.getLifecycleMonitor();
+    }
+
+    public ProxyManager getProxyManager() {
+        return kernel.getProxyManager();
+    }
+
+    public void boot() throws Exception {
+        throw new UnsupportedOperationException();
+    }
+
     public Date getBootTime() {
         return kernel.getBootTime();
     }
@@ -69,32 +80,24 @@
         kernel.unloadGBean(name);
     }
 
-    public boolean isRunning() {
-        return kernel.isRunning();
-    }
-
-    public ConfigurationManager getConfigurationManager() {
-        return kernel.getConfigurationManager();
+    public int getGBeanState(ObjectName name) throws GBeanNotFoundException {
+        return kernel.getGBeanState(name);
     }
 
-    public List listConfigurationStores() {
-        return kernel.listConfigurationStores();
+    public long getGBeanStartTime(ObjectName name) throws GBeanNotFoundException {
+        return kernel.getGBeanStartTime(name);
     }
 
-    public List listConfigurations(ObjectName storeName) throws NoSuchStoreException {
-        return kernel.listConfigurations(storeName);
+    public boolean isGBeanEnabled(ObjectName name) throws GBeanNotFoundException {
+        return kernel.isGBeanEnabled(name);
     }
 
-    public ObjectName startConfiguration(URI configID) throws NoSuchConfigException, IOException, InvalidConfigException {
-        return kernel.startConfiguration(configID);
+    public void setGBeanEnabled(ObjectName name, boolean enabled) throws GBeanNotFoundException {
+        kernel.setGBeanEnabled(name, enabled);
     }
 
-    public void stopConfiguration(URI configID) throws NoSuchConfigException {
-        kernel.stopConfiguration(configID);
-    }
-
-    public int getConfigurationState(URI configId) throws NoSuchConfigException {
-        return kernel.getConfigurationState(configId);
+    public boolean isRunning() {
+        return kernel.isRunning();
     }
 
     public ClassLoader getClassLoaderFor(ObjectName name) throws GBeanNotFoundException, InternalKernelException {

Added: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/KernelRegistry.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/KernelRegistry.java?rev=169154&view=auto
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/KernelRegistry.java (added)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/KernelRegistry.java Sun May  8 12:35:23 2005
@@ -0,0 +1,124 @@
+/**
+ *
+ * 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.geronimo.kernel;
+
+import java.lang.ref.WeakReference;
+import java.lang.ref.ReferenceQueue;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Set;
+import java.util.Collections;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public final class KernelRegistry {
+    /**
+     * Index of kernel references by kernel name
+     */
+    private static final Map kernels = new HashMap();
+
+    /**
+     * ReferenceQueue that watches the weak references to our kernels
+     */
+    private static final ReferenceQueue queue = new ReferenceQueue();
+
+    public static Set getKernelNames() {
+        synchronized(kernels) {
+            return Collections.unmodifiableSet(kernels.keySet());
+        }
+    }
+
+    /**
+     * Get a particular kernel indexed by a name
+     *
+     * @param name the name of the kernel to be obtained
+     * @return the kernel that was registered with that name
+     */
+    public static Kernel getKernel(String name) {
+        if (name == null) {
+            return getSingleKernel();
+        }
+        synchronized (kernels) {
+            processQueue();
+            KernelReference ref = (KernelReference) kernels.get(name);
+            if (ref != null) {
+                return (Kernel) ref.get();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Obtain the single kernel that's registered.
+     * <p/>
+     * <p>This method assumes that there is only one kernel registered and will throw an
+     * <code>IllegalStateException</code> if more than one has been registered.
+     *
+     * @return the single kernel that's registered
+     * @throws IllegalStateException if more than one
+     */
+    public static Kernel getSingleKernel() {
+        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;
+        }
+    }
+
+    public static void registerKernel(Kernel kernel) {
+        synchronized (kernels) {
+            String kernelName = kernel.getKernelName();
+            if (kernels.containsKey(kernelName)) {
+                throw new IllegalStateException("A kernel is already running this kernel name: " + kernelName);
+            }
+            kernels.put(kernelName, new KernelReference(kernelName, kernel));
+        }
+    }
+
+    public static void unregisterKernel(Kernel kernel) {
+        synchronized (kernels) {
+            kernels.remove(kernel.getKernelName());
+        }
+    }
+
+    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;
+        }
+    }
+}

Added: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/basic/BasicDependencyManager.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/basic/BasicDependencyManager.java?rev=169154&view=auto
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/basic/BasicDependencyManager.java (added)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/basic/BasicDependencyManager.java Sun May  8 12:35:23 2005
@@ -0,0 +1,272 @@
+/**
+ *
+ * Copyright 2003-2004 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.geronimo.kernel.basic;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.management.ObjectName;
+
+import org.apache.geronimo.kernel.lifecycle.LifecycleAdapter;
+import org.apache.geronimo.kernel.lifecycle.LifecycleListener;
+import org.apache.geronimo.kernel.lifecycle.LifecycleMonitor;
+import org.apache.geronimo.kernel.DependencyManager;
+
+/**
+ * DependencyManager is the record keeper of the dependencies in Geronimo.  The DependencyManager
+ * does not enforce any dependencies, it is simply a place where components can register their intent
+ * to be dependent on another component.  Since a JMX Component can pretty much do whatever it wants
+ * a component must watch the components it depends on to assure that they are following the
+ * J2EE-Management state machine.
+ * <p/>
+ * The DependencyManager uses the nomenclature of parent-child where a child is dependent on a parent.
+ * The names parent and child have no other meaning are just a convience to make the code readable.
+ *
+ * @version $Rev: 124822 $ $Date: 2005-01-10 11:01:13 -0800 (Mon, 10 Jan 2005) $
+ */
+public class BasicDependencyManager implements DependencyManager {
+    /**
+     * The lifecycleMonitor informs us when gbeans go off line,
+     * so we can clean up the lingering dependencies.
+     */
+    private final LifecycleMonitor lifecycleMonitor;
+
+    /**
+     * Listenes for GBeans to unregister and removes all dependencies associated with the dependency
+     */
+    private final LifecycleListener lifecycleListener = new DependencyManagerLifecycleListener();
+
+    /**
+     * A map from child names to a list of parents.
+     */
+    private final Map childToParentMap = new HashMap();
+
+    /**
+     * A map from parent back to a list of its children.
+     */
+    private final Map parentToChildMap = new HashMap();
+
+    /**
+     * A map from a component's ObjectName to the list of ObjectPatterns that the component is blocking
+     * from starting.
+     */
+    private final Map startHoldsMap = new HashMap();
+
+    public BasicDependencyManager(LifecycleMonitor lifecycleMonitor) throws Exception {
+        assert lifecycleMonitor != null;
+        this.lifecycleMonitor = lifecycleMonitor;
+        lifecycleMonitor.addLifecycleListener(lifecycleListener, new ObjectName("*:*"));
+    }
+
+    public synchronized void close() {
+        lifecycleMonitor.removeLifecycleListener(lifecycleListener);
+        childToParentMap.clear();
+        parentToChildMap.clear();
+        startHoldsMap.clear();
+    }
+
+    /**
+     * Declares a dependency from a child to a parent.
+     *
+     * @param child the dependent component
+     * @param parent the component the child is depending on
+     */
+    public synchronized void addDependency(ObjectName child, ObjectName parent) {
+        Set parents = (Set) childToParentMap.get(child);
+        if (parents == null) {
+            parents = new HashSet();
+            childToParentMap.put(child, parents);
+        }
+        parents.add(parent);
+
+        Set children = (Set) parentToChildMap.get(parent);
+        if (children == null) {
+            children = new HashSet();
+            parentToChildMap.put(parent, children);
+        }
+        children.add(child);
+    }
+
+    /**
+     * Removes a dependency from a child to a parent
+     *
+     * @param child the dependnet component
+     * @param parent the component that the child wil no longer depend on
+     */
+    public synchronized void removeDependency(ObjectName child, ObjectName parent) {
+        Set parents = (Set) childToParentMap.get(child);
+        if (parents != null) {
+            parents.remove(parent);
+        }
+
+        Set children = (Set) parentToChildMap.get(parent);
+        if (children != null) {
+            children.remove(child);
+        }
+    }
+
+    /**
+     * Removes all dependencies for a child
+     *
+     * @param child the component that will no longer depend on anything
+     */
+    public synchronized void removeAllDependencies(ObjectName child) {
+        Set parents = (Set) childToParentMap.remove(child);
+        if (parents == null) {
+            return;
+        }
+        for (Iterator iterator = parents.iterator(); iterator.hasNext();) {
+            ObjectName parent = (ObjectName) iterator.next();
+            Set children = (Set) parentToChildMap.get(parent);
+            if (children != null) {
+                children.remove(child);
+            }
+
+        }
+    }
+
+    /**
+     * Adds dependencies from the child to every parent in the parents set
+     *
+     * @param child the dependent component
+     * @param parents the set of components the child is depending on
+     */
+    public synchronized void addDependencies(ObjectName child, Set parents) {
+        Set existingParents = (Set) childToParentMap.get(child);
+        if (existingParents == null) {
+            existingParents = new HashSet(parents);
+            childToParentMap.put(child, existingParents);
+        } else {
+            existingParents.addAll(parents);
+        }
+
+        for (Iterator i = parents.iterator(); i.hasNext();) {
+            Object startParent = i.next();
+            Set children = (Set) parentToChildMap.get(startParent);
+            if (children == null) {
+                children = new HashSet();
+                parentToChildMap.put(startParent, children);
+            }
+            children.add(child);
+        }
+    }
+
+    /**
+     * Gets the set of parents that the child is depending on
+     *
+     * @param child the dependent component
+     * @return a collection containing all of the components the child depends on; will never be null
+     */
+    public synchronized Set getParents(ObjectName child) {
+        Set parents = (Set) childToParentMap.get(child);
+        if (parents == null) {
+            return Collections.EMPTY_SET;
+        }
+        return new HashSet(parents);
+    }
+
+    /**
+     * Gets all of the MBeans that have a dependency on the specified startParent.
+     *
+     * @param parent the component the returned childen set depend on
+     * @return a collection containing all of the components that depend on the parent; will never be null
+     */
+    public synchronized Set getChildren(ObjectName parent) {
+        Set children = (Set) parentToChildMap.get(parent);
+        if (children == null) {
+            return Collections.EMPTY_SET;
+        }
+        return new HashSet(children);
+    }
+
+    /**
+     * Adds a hold on a collection of object name patterns.  If the name of a component matches an object name
+     * pattern in the collection, the component should not start.
+     *
+     * @param objectName the name of the component placing the holds
+     * @param holds a collection of object name patterns which should not start
+     */
+    public synchronized void addStartHolds(ObjectName objectName, Collection holds) {
+        Collection currentHolds = (Collection) startHoldsMap.get(objectName);
+        if (currentHolds == null) {
+            currentHolds = new LinkedList(holds);
+            startHoldsMap.put(objectName, currentHolds);
+        } else {
+            currentHolds.addAll(holds);
+        }
+    }
+
+    /**
+     * Removes a collection of holds.
+     *
+     * @param objectName the object name of the components owning the holds
+     * @param holds a collection of the holds to remove
+     */
+    public synchronized void removeStartHolds(ObjectName objectName, Collection holds) {
+        Collection currentHolds = (Collection) startHoldsMap.get(objectName);
+        if (currentHolds != null) {
+            currentHolds.removeAll(holds);
+        }
+    }
+
+    /**
+     * Removes all of the holds owned by a component.
+     *
+     * @param objectName the object name of the component that will no longer have any holds
+     */
+    public synchronized void removeAllStartHolds(ObjectName objectName) {
+        startHoldsMap.remove(objectName);
+    }
+
+    /**
+     * Gets the object name of the mbean blocking the start specified mbean.
+     *
+     * @param objectName the mbean to check for blockers
+     * @return the mbean blocking the specified mbean, or null if there are no blockers
+     */
+    public synchronized ObjectName checkBlocker(ObjectName objectName) {
+        // check if objectName name is on one of the hold lists
+        for (Iterator iterator = startHoldsMap.keySet().iterator(); iterator.hasNext();) {
+            ObjectName blocker = (ObjectName) iterator.next();
+            List holds = (List) startHoldsMap.get(blocker);
+            for (Iterator holdsIterator = holds.iterator(); holdsIterator.hasNext();) {
+                ObjectName pattern = (ObjectName) holdsIterator.next();
+                if (pattern.apply(objectName)) {
+                    return blocker;
+                }
+            }
+        }
+        return null;
+    }
+
+    private class DependencyManagerLifecycleListener extends LifecycleAdapter {
+        public void unloaded(ObjectName objectName) {
+            synchronized (BasicDependencyManager.this) {
+                removeAllDependencies(objectName);
+                removeAllStartHolds(objectName);
+            }
+
+        }
+    }
+}

Added: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/basic/BasicKernel.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/basic/BasicKernel.java?rev=169154&view=auto
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/basic/BasicKernel.java (added)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/basic/BasicKernel.java Sun May  8 12:35:23 2005
@@ -0,0 +1,369 @@
+/**
+ *
+ * Copyright 2003-2004 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.geronimo.kernel.basic;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Set;
+import javax.management.ObjectName;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.geronimo.gbean.GBeanData;
+import org.apache.geronimo.gbean.GBeanInfo;
+import org.apache.geronimo.gbean.GBeanName;
+import org.apache.geronimo.gbean.runtime.GBeanInstance;
+import org.apache.geronimo.kernel.DependencyManager;
+import org.apache.geronimo.kernel.GBeanAlreadyExistsException;
+import org.apache.geronimo.kernel.GBeanNotFoundException;
+import org.apache.geronimo.kernel.InternalKernelException;
+import org.apache.geronimo.kernel.Kernel;
+import org.apache.geronimo.kernel.KernelGBean;
+import org.apache.geronimo.kernel.KernelRegistry;
+import org.apache.geronimo.kernel.NoSuchAttributeException;
+import org.apache.geronimo.kernel.NoSuchOperationException;
+import org.apache.geronimo.kernel.lifecycle.LifecycleMonitor;
+import org.apache.geronimo.kernel.proxy.ProxyManager;
+
+
+/**
+ * The core of a Geronimo instance.
+ * A Kernel is responsible for managing the Configurations that comprise a
+ * Geronimo system and exposing them using JMX. Each Kernel is associated
+ * with an MBeanServer that is used to register the Configurations themselves
+ * and the MBeans they define.
+ * <p/>
+ * Dependencies between MBeans are handled by a dedicated DependencyManager
+ * that is responsible for tracking those dependencies and ensuring that the
+ * dependent objects follow the appropriate lifecycle and receive appropriate
+ * notifications.
+ * <p/>
+ * The Kernel also provides a ConfigurationStore which is used to stage
+ * installed Configurations (providing a local filesystem based classpath) and
+ * used hold the persistent state of each Configuration. This allows
+ * Configurations to restart in the event of system failure.
+ * 
+ * TODO: Describe the order of method invocation (e.g. if loadGbean may be before boot)
+ *
+ * @version $Rev: 154947 $ $Date: 2005-02-22 20:10:45 -0800 (Tue, 22 Feb 2005) $
+ */
+public class BasicKernel implements Kernel {
+    /**
+     * Helper objects for invoke and getAttribute
+     */
+    private static final String[] NO_TYPES = new String[0];
+    private static final Object[] NO_ARGS = new Object[0];
+
+    /**
+     * Name of this kernel
+     */
+    private final String kernelName;
+
+    /**
+     * The log
+     */
+    private Log log;
+
+    /**
+     * Is this kernel running?
+     */
+    private boolean running;
+
+    /**
+     * The timestamp when the kernel was started
+     */
+    private Date bootTime;
+
+    /**
+     * The registry
+     */
+    private final BasicRegistry registry;
+
+    /**
+     * Listeners for when the kernel shutdown
+     */
+    private LinkedList shutdownHooks = new LinkedList();
+
+    /**
+     * This manager is used by the kernel to manage dependencies between gbeans
+     */
+    private DependencyManager dependencyManager;
+
+    /**
+     * Monitors the lifecycle of all gbeans.
+     */
+    private BasicLifecycleMonitor lifecycleMonitor;
+    private LifecycleMonitor publicLifecycleMonitor;
+
+    /**
+     * This factory gbean proxies, and tracks all proxies in the system
+     */
+    private ProxyManager proxyManager;
+
+    /**
+     * Construct a Kernel with the specified name.
+     *
+     * @param kernelName the name of the kernel
+     */
+    public BasicKernel(String kernelName) {
+        if (kernelName.indexOf(':') >= 0 || kernelName.indexOf('*') >= 0 || kernelName.indexOf('?') >= 0) {
+            throw new IllegalArgumentException("Kernel name may not contain a ':', '*' or '?' character");
+        }
+        this.kernelName = kernelName;
+        this.registry = new BasicRegistry();
+    }
+
+    public String getKernelName() {
+        return kernelName;
+    }
+
+    /**
+     * @deprecated this will be removed as when we add generalized dependencies to gbeans... the only current user is Configuration
+     */
+    public DependencyManager getDependencyManager() {
+        return dependencyManager;
+    }
+
+    /**
+     * Gets the lifecycle monitor.
+     * @deprecated don't use this yet... it may change or go away
+     */
+    public LifecycleMonitor getLifecycleMonitor() {
+        return publicLifecycleMonitor;
+    }
+
+    /**
+     * Gets the proxy manager.
+     * @deprecated don't use this yet... it may change or go away
+     */
+    public ProxyManager getProxyManager() {
+        return proxyManager;
+    }
+
+    public Object getAttribute(ObjectName objectName, String attributeName) throws GBeanNotFoundException, NoSuchAttributeException, Exception {
+        GBeanInstance gbeanInstance = registry.getGBeanInstance(createGBeanName(objectName));
+        return gbeanInstance.getAttribute(attributeName);
+    }
+
+    public void setAttribute(ObjectName objectName, String attributeName, Object attributeValue) throws GBeanNotFoundException, NoSuchAttributeException, Exception {
+        GBeanInstance gbeanInstance = registry.getGBeanInstance(createGBeanName(objectName));
+        gbeanInstance.setAttribute(attributeName, attributeValue);
+    }
+
+    public Object invoke(ObjectName objectName, String methodName) throws GBeanNotFoundException, NoSuchOperationException, InternalKernelException, Exception {
+        return invoke(objectName, methodName, NO_ARGS, NO_TYPES);
+    }
+
+    public Object invoke(ObjectName objectName, String methodName, Object[] args, String[] types) throws GBeanNotFoundException, NoSuchOperationException, InternalKernelException, Exception {
+        GBeanInstance gbeanInstance = registry.getGBeanInstance(createGBeanName(objectName));
+        return gbeanInstance.invoke(methodName, args, types);
+    }
+
+    public boolean isLoaded(ObjectName name) {
+        return registry.isRegistered(createGBeanName(name));
+    }
+
+    public GBeanInfo getGBeanInfo(ObjectName name) throws GBeanNotFoundException {
+        GBeanInstance gbeanInstance = registry.getGBeanInstance(createGBeanName(name));
+        return gbeanInstance.getGBeanInfo();
+    }
+
+    public GBeanData getGBeanData(ObjectName name) throws GBeanNotFoundException, InternalKernelException {
+        GBeanInstance gbeanInstance = registry.getGBeanInstance(createGBeanName(name));
+        return gbeanInstance.getGBeanData();
+    }
+
+    public void loadGBean(GBeanData gbeanData, ClassLoader classLoader) throws GBeanAlreadyExistsException, InternalKernelException {
+        ObjectName objectName = gbeanData.getName();
+        GBeanInstance gbeanInstance = new GBeanInstance(gbeanData, this, dependencyManager, lifecycleMonitor.createLifecycleBroadcaster(objectName), classLoader);
+        registry.register(gbeanInstance);
+    }
+
+    public void startGBean(ObjectName name) throws GBeanNotFoundException, InternalKernelException, IllegalStateException {
+        GBeanInstance gbeanInstance = registry.getGBeanInstance(createGBeanName(name));
+        gbeanInstance.start();
+    }
+
+    public void startRecursiveGBean(ObjectName name) throws GBeanNotFoundException, InternalKernelException, IllegalStateException {
+        GBeanInstance gbeanInstance = registry.getGBeanInstance(createGBeanName(name));
+        gbeanInstance.startRecursive();
+    }
+
+    public void stopGBean(ObjectName name) throws GBeanNotFoundException, InternalKernelException, IllegalStateException {
+        GBeanInstance gbeanInstance = registry.getGBeanInstance(createGBeanName(name));
+        gbeanInstance.stop();
+    }
+
+    public void unloadGBean(ObjectName name) throws GBeanNotFoundException, InternalKernelException, IllegalStateException {
+        GBeanName gbeanName = createGBeanName(name);
+        GBeanInstance gbeanInstance = registry.getGBeanInstance(gbeanName);
+        gbeanInstance.die();
+        registry.unregister(gbeanName);
+    }
+
+    public int getGBeanState(ObjectName name) throws GBeanNotFoundException {
+        GBeanInstance gbeanInstance = registry.getGBeanInstance(createGBeanName(name));
+        return gbeanInstance.getState();
+    }
+
+    public long getGBeanStartTime(ObjectName name) throws GBeanNotFoundException {
+        GBeanInstance gbeanInstance = registry.getGBeanInstance(createGBeanName(name));
+        return gbeanInstance.getStartTime();
+    }
+
+    public boolean isGBeanEnabled(ObjectName name) throws GBeanNotFoundException {
+        GBeanInstance gbeanInstance = registry.getGBeanInstance(createGBeanName(name));
+        return gbeanInstance.isEnabled();
+    }
+
+    public void setGBeanEnabled(ObjectName name, boolean enabled) throws GBeanNotFoundException {
+        GBeanInstance gbeanInstance = registry.getGBeanInstance(createGBeanName(name));
+        gbeanInstance.setEnabled(enabled);
+    }
+
+    public Set listGBeans(ObjectName pattern) {
+        String domain = (pattern == null || pattern.isDomainPattern()) ? null : pattern.getDomain();
+        Map props = pattern == null ? null : pattern.getKeyPropertyList();
+        Set gbeans = registry.listGBeans(domain, props);
+        Set result = new HashSet(gbeans.size());
+        for (Iterator i = gbeans.iterator(); i.hasNext();) {
+            GBeanInstance instance = (GBeanInstance) i.next();
+            result.add(instance.getObjectNameObject());
+        }
+        return result;
+    }
+
+    public Set listGBeans(Set patterns) {
+        Set gbeans = new HashSet();
+        for (Iterator iterator = patterns.iterator(); iterator.hasNext();) {
+            ObjectName pattern = (ObjectName) iterator.next();
+            gbeans.addAll(listGBeans(pattern));
+        }
+        return gbeans;
+    }
+
+    /**
+     * Boot this Kernel, triggering the instantiation of the MBeanServer and DependencyManager,
+     * and the registration of ConfigurationStore
+     *
+     * @throws java.lang.Exception if the boot fails
+     */
+    public void boot() throws Exception {
+        if (running) {
+            return;
+        }
+        bootTime = new Date();
+        log = LogFactory.getLog(BasicKernel.class.getName());
+        log.info("Starting boot");
+
+        // todo cleanup when boot fails
+        KernelRegistry.registerKernel(this);
+
+        registry.start(this);
+
+        lifecycleMonitor = new BasicLifecycleMonitor(this);
+        publicLifecycleMonitor = new LifecycleMonitorFlyweight(lifecycleMonitor);
+        dependencyManager = new BasicDependencyManager(publicLifecycleMonitor);
+        proxyManager = new BasicProxyManager(this);
+
+        // load and start the kernel gbean
+        GBeanData kernelGBeanData = new GBeanData(KERNEL, KernelGBean.GBEAN_INFO);
+        loadGBean(kernelGBeanData, getClass().getClassLoader());
+        startGBean(KERNEL);
+
+        running = true;
+        log.info("Booted");
+    }
+
+    public Date getBootTime() {
+        return bootTime;
+    }
+
+    public void registerShutdownHook(Runnable hook) {
+        assert hook != null : "Shutdown hook was null";
+        synchronized (shutdownHooks) {
+            shutdownHooks.add(hook);
+        }
+    }
+
+    public void unregisterShutdownHook(Runnable hook) {
+        synchronized (shutdownHooks) {
+            shutdownHooks.remove(hook);
+        }
+    }
+
+    /**
+     * Shut down this kernel instance, unregistering the MBeans and releasing
+     * the MBeanServer.
+     */
+    public void shutdown() {
+        if (!running) {
+            return;
+        }
+        running = false;
+        log.info("Starting kernel shutdown");
+
+        notifyShutdownHooks();
+
+        registry.stop();
+
+        dependencyManager.close();
+        dependencyManager = null;
+
+        synchronized (this) {
+            notify();
+        }
+
+        KernelRegistry.unregisterKernel(this);
+
+        log.info("Kernel shutdown complete");
+    }
+
+    private void notifyShutdownHooks() {
+        while (!shutdownHooks.isEmpty()) {
+            Runnable hook;
+            synchronized (shutdownHooks) {
+                hook = (Runnable) shutdownHooks.removeFirst();
+            }
+            try {
+                hook.run();
+            } catch (Throwable e) {
+                log.warn("Error from kernel shutdown hook", e);
+            }
+        }
+    }
+
+    public boolean isRunning() {
+        return running;
+    }
+
+    public ClassLoader getClassLoaderFor(ObjectName name) throws GBeanNotFoundException {
+        GBeanInstance gbeanInstance = registry.getGBeanInstance(createGBeanName(name));
+        return gbeanInstance.getClassLoader();
+    }
+
+    private GBeanName createGBeanName(ObjectName objectName) {
+        if (objectName.getDomain().length() == 0) {
+            return new GBeanName(kernelName, objectName.getKeyPropertyList());
+        }
+        return new GBeanName(objectName);
+    }
+}

Added: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/basic/BasicKernelFactory.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/basic/BasicKernelFactory.java?rev=169154&view=auto
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/basic/BasicKernelFactory.java (added)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/basic/BasicKernelFactory.java Sun May  8 12:35:23 2005
@@ -0,0 +1,29 @@
+/**
+ *
+ * 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.geronimo.kernel.basic;
+
+import org.apache.geronimo.kernel.Kernel;
+import org.apache.geronimo.kernel.KernelFactory;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class BasicKernelFactory extends KernelFactory {
+    public Kernel createKernel(String kernelName) {
+        return new BasicKernel(kernelName);
+    }
+}