Author: djencks Date: Thu Dec 2 14:19:23 2004 New Revision: 109571 URL: http://svn.apache.org/viewcvs?view=rev&rev=109571 Log: Loaded may not be the same as started. Keep track of what we load and start separately Modified: geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/DeploymentContext.java
Modified: geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/DeploymentContext.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/DeploymentContext.java?view=diff&rev=109571&p1=geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/DeploymentContext.java&r1=109570&p2=geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/DeploymentContext.java&r2=109571 ============================================================================== --- geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/DeploymentContext.java (original) +++ geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/DeploymentContext.java Thu Dec 2 14:19:23 2004 @@ -39,6 +39,7 @@ import java.util.Set; import java.util.ArrayList; import java.util.StringTokenizer; +import java.util.LinkedList; import java.util.jar.JarFile; import java.util.jar.Manifest; import java.util.jar.Attributes; @@ -51,6 +52,7 @@ import org.apache.geronimo.gbean.jmx.GBeanMBean; import org.apache.geronimo.gbean.GBeanData; import org.apache.geronimo.kernel.Kernel; +import org.apache.geronimo.kernel.GBeanNotFoundException; import org.apache.geronimo.kernel.management.State; import org.apache.geronimo.kernel.repository.Repository; import org.apache.geronimo.kernel.config.Configuration; @@ -74,7 +76,8 @@ private final File baseDir; private final URI baseUri; private final byte[] buffer = new byte[4096]; - private final List ancestors; + private final List loadedAncestors; + private final LinkedList startedAncestors; private final ClassLoader parentCL; public DeploymentContext(File baseDir, URI configID, ConfigurationModuleType type, URI parentID, Kernel kernel) throws MalformedObjectNameException, DeploymentException { @@ -111,38 +114,45 @@ ObjectName parentName = Configuration.getConfigurationObjectName(parentID); config.setReferencePatterns("Parent", Collections.singleton(parentName)); try { - ancestors = configurationManager.loadRecursive(parentID); + loadedAncestors = configurationManager.loadRecursive(parentID); } catch (Exception e) { throw new DeploymentException("Unable to load parents", e); } try { - // starting with the current config start all parents until - // there are either no more parents or a parent is already running - for (Iterator iterator = ancestors.iterator(); iterator.hasNext();) { - ObjectName name = (ObjectName) iterator.next(); - if (isRunning(kernel, name) ) { - // configuration is already running... we can stop now + startedAncestors = new LinkedList(); + ObjectName ancestorName = parentName; + while (ancestorName != null && !isRunning(kernel, ancestorName)) { + startedAncestors.addFirst(ancestorName); + Set patterns = kernel.getGBeanData(ancestorName).getReferencePatterns("Parent"); + if (patterns.isEmpty()) { break; } - kernel.startGBean(name); - if (!isRunning(kernel, name) ) { - throw new DeploymentException("Failed to start parent configuration: " + name); + ancestorName = (ObjectName) patterns.iterator().next(); + } + //we've found what we need to start, now start them. + for (Iterator iterator = startedAncestors.iterator(); iterator.hasNext();) { + ObjectName objectName = (ObjectName) iterator.next(); + kernel.startGBean(objectName); + if (!isRunning(kernel, objectName)) { + throw new DeploymentException("Failed to start parent configuration: " + objectName); } + } } catch (DeploymentException e) { throw e; } catch (Exception e) { throw new DeploymentException(e); } - + try { parentCL = (ClassLoader) kernel.getAttribute(parentName, "configurationClassLoader"); } catch (Exception e) { throw new DeploymentException(e); } } else { - ancestors = null; + loadedAncestors = null; + startedAncestors = null; // no explicit parent set, so use the class loader of this class as // the parent... this class should be in the root geronimo classloader, // which is normally the system class loader but not always, so be safe @@ -403,11 +413,33 @@ public void close() throws IOException, DeploymentException { saveConfiguration(); - if (kernel != null && ancestors != null && ancestors.size() > 0) { - try { - kernel.stopGBean((ObjectName) ancestors.get(0)); - } catch (Exception e) { - throw new DeploymentException(e); + if (kernel != null) { + if (startedAncestors != null) { + //stopping one stops all it's children. + //doesn't work though. + Collections.reverse(startedAncestors); + for (Iterator iterator = startedAncestors.iterator(); iterator.hasNext();) { + ObjectName objectName = (ObjectName) iterator.next(); + + try { + kernel.stopGBean(objectName); + } catch (GBeanNotFoundException e) { + throw new DeploymentException("Could not find a configuration we previously started! " + objectName, e); + } + } + startedAncestors.clear(); + } + if (loadedAncestors != null) { + Collections.reverse(loadedAncestors); + for (Iterator iterator = loadedAncestors.iterator(); iterator.hasNext();) { + ObjectName objectName = (ObjectName) iterator.next(); + try { + kernel.unloadGBean(objectName); + } catch (GBeanNotFoundException e) { + throw new DeploymentException("Could not find a configuration we previously loaded! " + objectName, e); + } + } + loadedAncestors.clear(); } } } @@ -443,5 +475,13 @@ DeploymentUtil.flush(out); DeploymentUtil.close(out); } + } + + /** + * @deprecated Currently used only in some tests, and may not be appropriate as a public method. + * @return a copy of the configurations GBeanData + */ + public GBeanData getConfigurationGBeanData() { + return new GBeanData(config); } }