You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by dw...@apache.org on 2008/06/24 23:52:26 UTC

svn commit: r671360 - in /geronimo/server/branches/2.1/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config: ConfigurationModel.java ConfigurationStatus.java KernelConfigurationManager.java

Author: dwoods
Date: Tue Jun 24 14:52:26 2008
New Revision: 671360

URL: http://svn.apache.org/viewvc?rev=671360&view=rev
Log:
GERONIMO-3974 Shutdown exceptions on IBM JVM

Modified:
    geronimo/server/branches/2.1/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ConfigurationModel.java
    geronimo/server/branches/2.1/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ConfigurationStatus.java
    geronimo/server/branches/2.1/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/KernelConfigurationManager.java

Modified: geronimo/server/branches/2.1/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ConfigurationModel.java
URL: http://svn.apache.org/viewvc/geronimo/server/branches/2.1/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ConfigurationModel.java?rev=671360&r1=671359&r2=671360&view=diff
==============================================================================
--- geronimo/server/branches/2.1/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ConfigurationModel.java (original)
+++ geronimo/server/branches/2.1/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ConfigurationModel.java Tue Jun 24 14:52:26 2008
@@ -226,4 +226,12 @@
         }
         return result;
     }
+    
+    public LinkedHashSet getStartedChildren(Artifact configurationId) {
+        ConfigurationStatus configurationStatus = (ConfigurationStatus) configurations.get(configurationId);
+        if (configurationStatus == null) {
+            return new LinkedHashSet();
+        }
+        return configurationStatus.getStartedChildren();
+    }
 }

Modified: geronimo/server/branches/2.1/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ConfigurationStatus.java
URL: http://svn.apache.org/viewvc/geronimo/server/branches/2.1/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ConfigurationStatus.java?rev=671360&r1=671359&r2=671360&view=diff
==============================================================================
--- geronimo/server/branches/2.1/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ConfigurationStatus.java (original)
+++ geronimo/server/branches/2.1/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ConfigurationStatus.java Tue Jun 24 14:52:26 2008
@@ -85,6 +85,35 @@
     public Artifact getConfigurationId() {
         return configurationId;
     }
+    
+    public LinkedHashSet getStartedChildren() {
+        LinkedHashSet childrenStatuses = new LinkedHashSet();
+        getStartedChildrenInternal(childrenStatuses);
+
+        LinkedHashSet childrenIds = new LinkedHashSet(childrenStatuses.size());
+        for (Iterator iterator = childrenStatuses.iterator(); iterator.hasNext();) {
+            ConfigurationStatus configurationStatus = (ConfigurationStatus) iterator.next();
+            childrenIds.add(configurationStatus.configurationId);
+        }
+
+        return childrenIds;
+    }
+
+    private void getStartedChildrenInternal(LinkedHashSet childrenStatuses) {
+        // if we aren't started, there is nothing to do
+        if (!started) {
+            return;
+        }
+
+        // visit all children
+        for (Iterator iterator = startChildren.iterator(); iterator.hasNext();) {
+            ConfigurationStatus child = (ConfigurationStatus) iterator.next();
+            if (child.isStarted() && !child.configurationId.equals(configurationId)) {
+                child.getStartedChildrenInternal(childrenStatuses);
+            }
+        }
+        childrenStatuses.add(this);
+    }
 
     public boolean isLoaded() {
         return loaded;

Modified: geronimo/server/branches/2.1/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/KernelConfigurationManager.java
URL: http://svn.apache.org/viewvc/geronimo/server/branches/2.1/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/KernelConfigurationManager.java?rev=671360&r1=671359&r2=671360&view=diff
==============================================================================
--- geronimo/server/branches/2.1/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/KernelConfigurationManager.java (original)
+++ geronimo/server/branches/2.1/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/KernelConfigurationManager.java Tue Jun 24 14:52:26 2008
@@ -18,6 +18,7 @@
 package org.apache.geronimo.kernel.config;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.Map;
@@ -78,7 +79,7 @@
         this.artifactManager = artifactManager;
         this.classLoader = classLoader;
 
-        shutdownHook = new ShutdownHook(kernel);
+        shutdownHook = new ShutdownHook(kernel, configurationModel);
     }
 
     private static ArtifactResolver createArtifactResolver(ArtifactResolver artifactResolver, ArtifactManager artifactManager, Collection repositories) {
@@ -298,9 +299,11 @@
 
     private static class ShutdownHook implements Runnable {
         private final Kernel kernel;
+        private final ConfigurationModel configurationModel;
 
-        public ShutdownHook(Kernel kernel) {
+        public ShutdownHook(Kernel kernel, ConfigurationModel configurationModel) {
             this.kernel = kernel;
+            this.configurationModel = configurationModel;
         }
 
         public void run() {
@@ -309,21 +312,37 @@
                 if (configs.isEmpty()) {
                     return;
                 }
+                LinkedHashSet orderedConfigs = new LinkedHashSet();
                 for (Iterator i = configs.iterator(); i.hasNext();) {
                     AbstractName configName = (AbstractName) i.next();
-                    if (kernel.isLoaded(configName)) {
-                        try {
-                            kernel.stopGBean(configName);
-                        } catch (GBeanNotFoundException e) {
-                            // ignore
-                        } catch (InternalKernelException e) {
-                            log.warn("Could not stop configuration: " + configName, e);
-                        }
-                        try {
-                            kernel.unloadGBean(configName);
-                        } catch (GBeanNotFoundException e) {
-                            // ignore
+                    if (kernel.isLoaded(configName) && !orderedConfigs.contains(configName)) {
+                        LinkedHashSet startedChildren = configurationModel.getStartedChildren(configName.getArtifact());
+                        for (Iterator iterator = startedChildren.iterator(); iterator.hasNext();) {
+                            Artifact configurationId = (Artifact) iterator.next();
+                            Set childConfig = kernel.listGBeans(new AbstractNameQuery(configurationId, Collections.emptyMap() , Configuration.class.getName()));
+                            if (!childConfig.isEmpty()) {
+                                AbstractName childConfigName = (AbstractName) childConfig.iterator().next();
+                                if (!orderedConfigs.contains(childConfigName))
+                                    orderedConfigs.add(childConfigName);
+                            }
                         }
+                        orderedConfigs.add(configName);
+                    }
+                }
+
+                for (Iterator i = orderedConfigs.iterator(); i.hasNext();) {
+                    AbstractName configName = (AbstractName) i.next();
+                    try {
+                        kernel.stopGBean(configName);
+                    } catch (GBeanNotFoundException e) {
+                        // ignore
+                    } catch (InternalKernelException e) {
+                        log.warn("Could not stop configuration: " + configName, e);
+                    }
+                    try {
+                        kernel.unloadGBean(configName);
+                    } catch (GBeanNotFoundException e) {
+                        // ignore
                     }
                 }
             }