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 2006/04/18 22:31:50 UTC

svn commit: r395030 - in /geronimo/branches/1.1/modules: kernel/src/java/org/apache/geronimo/kernel/config/ kernel/src/test/org/apache/geronimo/kernel/config/ system/src/test/org/apache/geronimo/system/configuration/

Author: dain
Date: Tue Apr 18 13:31:48 2006
New Revision: 395030

URL: http://svn.apache.org/viewcvs?rev=395030&view=rev
Log:
Added reload command to ConfigurationManager
Reload optionally supports loading a new version of the cofiguration and will attemp to rollback the existing version in the case of a failure

Modified:
    geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/ConfigurationManager.java
    geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/ConfigurationModel.java
    geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/ConfigurationStatus.java
    geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/LifecycleException.java
    geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/SimpleConfigurationManager.java
    geronimo/branches/1.1/modules/kernel/src/test/org/apache/geronimo/kernel/config/ConfigurationManagerTest.java
    geronimo/branches/1.1/modules/system/src/test/org/apache/geronimo/system/configuration/ConfigInstallerTest.java

Modified: geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/ConfigurationManager.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/ConfigurationManager.java?rev=395030&r1=395029&r2=395030&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/ConfigurationManager.java (original)
+++ geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/ConfigurationManager.java Tue Apr 18 13:31:48 2006
@@ -19,6 +19,7 @@
 import java.io.IOException;
 import java.util.List;
 import org.apache.geronimo.kernel.repository.Artifact;
+import org.apache.geronimo.kernel.repository.Version;
 import org.apache.geronimo.gbean.AbstractName;
 
 /**
@@ -230,6 +231,77 @@
      * @throws LifecycleException if there is a problem loading the configuration
      */
     LifecycleResults restartConfiguration(Artifact configurationId, LifecycleMonitor monitor) throws NoSuchConfigException, LifecycleException;
+
+    /**
+     * Reloads the specified configuration and all configurations that have a dependency on the
+     * specified configuration
+     *
+     * @param configurationId the configuration identifier
+     * @return the results of the operation
+     * @throws NoSuchConfigException if the configuration is not loaded
+     * @throws LifecycleException if there is a problem loading the configuration
+     */
+    LifecycleResults reloadConfiguration(Artifact configurationId) throws NoSuchConfigException, LifecycleException;
+
+    /**
+     * Reloads the specified configuration and all configurations that have a dependency on the
+     * specified configuration
+     *
+     * @param configurationId the configuration identifier
+     * @param monitor the monitor that should receive events as the operation is carried out
+     * @return the results of the operation
+     * @throws NoSuchConfigException if the configuration is not loaded
+     * @throws LifecycleException if there is a problem loading the configuration
+     */
+    LifecycleResults reloadConfiguration(Artifact configurationId, LifecycleMonitor monitor) throws NoSuchConfigException, LifecycleException;
+
+    /**
+     * Reloads the specified configuration and all configurations that have a dependency on the
+     * specified configuration
+     *
+     * @param configurationId the configuration identifier
+     * @param version new version to load from the config store
+     * @return the results of the operation
+     * @throws NoSuchConfigException if the configuration is not loaded
+     * @throws LifecycleException if there is a problem loading the configuration
+     */
+    LifecycleResults reloadConfiguration(Artifact configurationId, Version version) throws NoSuchConfigException, LifecycleException;
+
+    /**
+     * Reloads the specified configuration and all configurations that have a dependency on the
+     * specified configuration
+     *
+     * @param configurationId the configuration identifier
+     * @param monitor the monitor that should receive events as the operation is carried out
+     * @param version new version to load from the config store
+     * @return the results of the operation
+     * @throws NoSuchConfigException if the configuration is not loaded
+     * @throws LifecycleException if there is a problem loading the configuration
+     */
+    LifecycleResults reloadConfiguration(Artifact configurationId, Version version, LifecycleMonitor monitor) throws NoSuchConfigException, LifecycleException;
+
+    /**
+     * Reloads the specified configuration and all configurations that have a dependency on the
+     * specified configuration
+     *
+     * @param configurationData the configuration to load
+     * @return the results of the operation
+     * @throws NoSuchConfigException if the configuration is not loaded
+     * @throws LifecycleException if there is a problem loading the configuration
+     */
+    LifecycleResults reloadConfiguration(ConfigurationData configurationData) throws NoSuchConfigException, LifecycleException;
+
+    /**
+     * Reloads the specified configuration and all configurations that have a dependency on the
+     * specified configuration
+     *
+     * @param configurationData the configuration to load
+     * @param monitor the monitor that should receive events as the operation is carried out
+     * @return the results of the operation
+     * @throws NoSuchConfigException if the configuration is not loaded
+     * @throws LifecycleException if there is a problem loading the configuration
+     */
+    LifecycleResults reloadConfiguration(ConfigurationData configurationData, LifecycleMonitor monitor) throws NoSuchConfigException, LifecycleException;
 
     /**
      * Unstalls the specified configuration from the server.   This operation can not be reversed.

Modified: geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/ConfigurationModel.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/ConfigurationModel.java?rev=395030&r1=395029&r2=395030&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/ConfigurationModel.java (original)
+++ geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/ConfigurationModel.java Tue Apr 18 13:31:48 2006
@@ -121,11 +121,23 @@
     }
 
     public LinkedHashSet unload(Artifact configurationId) throws NoSuchConfigException {
+        return unload(configurationId, true);
+    }
+
+    public LinkedHashSet unload(Artifact configurationId, boolean gc) throws NoSuchConfigException {
         ConfigurationStatus configurationStatus = (ConfigurationStatus) configurations.get(configurationId);
         if (configurationStatus == null) {
             throw new NoSuchConfigException(configurationId);
         }
-        return configurationStatus.unload();
+        return configurationStatus.unload(gc);
+    }
+
+    public LinkedHashSet reload(Artifact configurationId) throws NoSuchConfigException {
+        ConfigurationStatus configurationStatus = (ConfigurationStatus) configurations.get(configurationId);
+        if (configurationStatus == null) {
+            throw new NoSuchConfigException(configurationId);
+        }
+        return configurationStatus.reload();
     }
 
     public Set getLoaded() {

Modified: geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/ConfigurationStatus.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/ConfigurationStatus.java?rev=395030&r1=395029&r2=395030&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/ConfigurationStatus.java (original)
+++ geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/ConfigurationStatus.java Tue Apr 18 13:31:48 2006
@@ -264,13 +264,13 @@
         restartList.add(this);
     }
 
-    public LinkedHashSet unload() {
+    public LinkedHashSet unload(boolean gc) {
         if (!loaded) {
             throw new IllegalStateException(configurationId + " is not loaded");
         }
 
         LinkedHashSet unloadStatuses = new LinkedHashSet();
-        unloadInternal(unloadStatuses);
+        unloadInternal(unloadStatuses, gc);
 
         LinkedHashSet unloadIds = new LinkedHashSet(unloadStatuses.size());
         for (Iterator iterator = unloadStatuses.iterator(); iterator.hasNext();) {
@@ -281,7 +281,7 @@
         return unloadIds;
     }
 
-    private void unloadInternal(LinkedHashSet unloadList) {
+    private void unloadInternal(LinkedHashSet unloadList, boolean gc) {
         // if we aren't loaded, there is nothing to do
         if (!loaded) {
             return;
@@ -291,7 +291,7 @@
         for (Iterator iterator = loadChildren.iterator(); iterator.hasNext();) {
             ConfigurationStatus child = (ConfigurationStatus) iterator.next();
             if (child.isLoaded()) {
-                child.unloadInternal(unloadList);
+                child.unloadInternal(unloadList, gc);
             }
         }
 
@@ -303,14 +303,53 @@
             userLoaded = false;
             unloadList.add(this);
 
-            // visit all non-user loaded parents
-            for (Iterator iterator = loadParents.iterator(); iterator.hasNext();) {
-                ConfigurationStatus parent = (ConfigurationStatus) iterator.next();
-                if (!parent.isUserLoaded() && unloadList.containsAll(parent.loadChildren)) {
-                    parent.unloadInternal(unloadList);
+            // if we are garbage collecting, visit parents
+            if (gc) {
+                // visit all non-user loaded parents
+                for (Iterator iterator = loadParents.iterator(); iterator.hasNext();) {
+                    ConfigurationStatus parent = (ConfigurationStatus) iterator.next();
+                    if (!parent.isUserLoaded() && unloadList.containsAll(parent.loadChildren)) {
+                        parent.unloadInternal(unloadList, gc);
+                    }
                 }
             }
         }
+    }
+
+    public LinkedHashSet reload() {
+        if (!loaded) {
+            throw new IllegalStateException(configurationId + " is not loaded");
+        }
+
+        LinkedHashSet reloadStatuses = new LinkedHashSet();
+        reloadInternal(reloadStatuses);
+
+        LinkedHashSet reloadIds = new LinkedHashSet(reloadStatuses.size());
+        for (Iterator iterator = reloadStatuses.iterator(); iterator.hasNext();) {
+            ConfigurationStatus configurationStatus = (ConfigurationStatus) iterator.next();
+            reloadIds.add(configurationStatus.configurationId);
+        }
+
+        userLoaded = true;
+        return reloadIds;
+    }
+
+    private void reloadInternal(LinkedHashSet reloadList) {
+        // if we aren't loaded, there is nothing to do
+        if (!loaded) {
+            return;
+        }
+
+        // visit all children
+        for (Iterator iterator = loadChildren.iterator(); iterator.hasNext();) {
+            ConfigurationStatus child = (ConfigurationStatus) iterator.next();
+            if (child.isLoaded()) {
+                child.reloadInternal(reloadList);
+            }
+        }
+
+        // add this node to the reload list
+        reloadList.add(this);
     }
 
     public String toString() {

Modified: geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/LifecycleException.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/LifecycleException.java?rev=395030&r1=395029&r2=395030&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/LifecycleException.java (original)
+++ geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/LifecycleException.java Tue Apr 18 13:31:48 2006
@@ -29,7 +29,7 @@
     public LifecycleException(String command, Artifact configurationId, LifecycleResults lifecycleResults) {
         this(command, configurationId, lifecycleResults, lifecycleResults.getFailedCause(configurationId));
     }
-    
+
     public LifecycleException(String command, Artifact configurationId, LifecycleResults lifecycleResults, Throwable cause) {
         super(command + " of " + configurationId + " failed", cause);
         this.command = command;
@@ -45,7 +45,7 @@
         return configurationId;
     }
 
-    public LifecycleResults getCommandResults() {
+    public LifecycleResults getLifecycleResults() {
         return lifecycleResults;
     }
 }

Modified: geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/SimpleConfigurationManager.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/SimpleConfigurationManager.java?rev=395030&r1=395029&r2=395030&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/SimpleConfigurationManager.java (original)
+++ geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/config/SimpleConfigurationManager.java Tue Apr 18 13:31:48 2006
@@ -38,6 +38,7 @@
 import org.apache.geronimo.kernel.repository.Environment;
 import org.apache.geronimo.kernel.repository.ImportType;
 import org.apache.geronimo.kernel.repository.MissingDependencyException;
+import org.apache.geronimo.kernel.repository.Version;
 
 /**
  * @version $Rev$ $Date$
@@ -569,20 +570,6 @@
         return results;
     }
 
-    private static void addConfigurationsToMonitor(LifecycleMonitor monitor, LinkedHashSet configurations) {
-        for (Iterator iterator = configurations.iterator(); iterator.hasNext();) {
-            Artifact configurationId = (Artifact) iterator.next();
-            monitor.addConfiguration(configurationId);
-        }
-    }
-
-    private static LinkedHashSet reverse(LinkedHashSet restartList) {
-        ArrayList reverseRestartList = new ArrayList(restartList);
-        Collections.reverse(reverseRestartList);
-        restartList = new LinkedHashSet(reverseRestartList);
-        return restartList;
-    }
-
     public synchronized LifecycleResults unloadConfiguration(Artifact id) throws NoSuchConfigException {
         return unloadConfiguration(id, NullLifecycleMonitor.INSTANCE);
     }
@@ -631,6 +618,233 @@
         }
     }
 
+    public synchronized LifecycleResults reloadConfiguration(Artifact id) throws NoSuchConfigException, LifecycleException {
+        return reloadConfiguration(id, NullLifecycleMonitor.INSTANCE);
+    }
+
+    public synchronized LifecycleResults reloadConfiguration(Artifact id, LifecycleMonitor monitor) throws NoSuchConfigException, LifecycleException {
+        return reloadConfiguration(id, id.getVersion(), monitor);
+    }
+
+    public synchronized LifecycleResults reloadConfiguration(Artifact id, Version version) throws NoSuchConfigException, LifecycleException {
+        return reloadConfiguration(id, id.getVersion(), NullLifecycleMonitor.INSTANCE);
+    }
+
+    public synchronized LifecycleResults reloadConfiguration(Artifact id, Version version, LifecycleMonitor monitor) throws NoSuchConfigException, LifecycleException {
+        Configuration configuration = getConfiguration(id);
+        if (configuration == null) {
+            throw new NoSuchConfigException(id);
+        }
+        ConfigurationData existingConfigurationData = configuration.getConfigurationData();
+        UnloadedConfiguration existingUnloadedConfiguration = new UnloadedConfiguration(existingConfigurationData, getResolvedParentIds(configuration));
+
+        Artifact newId = new Artifact(id.getGroupId(), id.getArtifactId(), version, id.getType());
+
+        // reload the ConfigurationData from a store
+        ConfigurationData configurationData = null;
+        try {
+            configurationData = loadConfigurationData(newId, monitor);
+        } catch (Exception e) {
+            LifecycleResults results = new LifecycleResults();
+            results.addFailed(id, e);
+            monitor.finished();
+            throw new LifecycleException("reload", id, results);
+        }
+
+        return reloadConfiguration(existingUnloadedConfiguration, configurationData, monitor);
+    }
+
+    public LifecycleResults reloadConfiguration(ConfigurationData configurationData) throws LifecycleException, NoSuchConfigException {
+        return reloadConfiguration(configurationData, NullLifecycleMonitor.INSTANCE);
+    }
+
+    public LifecycleResults reloadConfiguration(ConfigurationData configurationData, LifecycleMonitor monitor) throws LifecycleException, NoSuchConfigException {
+        Configuration configuration = getConfiguration(configurationData.getId());
+        if (configuration == null) {
+            throw new NoSuchConfigException(configurationData.getId());
+        }
+        ConfigurationData existingConfigurationData = configuration.getConfigurationData();
+        UnloadedConfiguration existingUnloadedConfiguration = new UnloadedConfiguration(existingConfigurationData, getResolvedParentIds(configuration));
+        return reloadConfiguration(existingUnloadedConfiguration, configurationData, monitor);
+    }
+
+    private LifecycleResults reloadConfiguration(UnloadedConfiguration existingUnloadedConfiguration, ConfigurationData newConfigurationData, LifecycleMonitor monitor) throws LifecycleException, NoSuchConfigException {
+        LifecycleResults results = new LifecycleResults();
+
+        // recursively load configurations from the reloaded child to the parents
+        // this will catch any new parents
+        LinkedHashMap unloadedConfigurations = new LinkedHashMap();
+        try {
+            loadDepthFirst(newConfigurationData, unloadedConfigurations, monitor);
+        } catch (Exception e) {
+            results.addFailed(newConfigurationData.getId(), e);
+            monitor.finished();
+            throw new LifecycleException("load", newConfigurationData.getId(), results);
+        }
+
+        // get a list of the started configuration
+        Set started = configurationModel.getStarted();
+
+        // add all of the child configurations that we will need to reload to the unloaded map
+        //   note: we are iterating in reverse order
+        for (Iterator iterator = reverse(configurationModel.reload(newConfigurationData.getId())).iterator(); iterator.hasNext();) {
+            Artifact configurationId = (Artifact) iterator.next();
+            if (unloadedConfigurations.containsKey(configurationId)) {
+                continue;
+            }
+
+            Configuration configuration = getConfiguration(configurationId);
+            ConfigurationData data = configuration.getConfigurationData();
+            LinkedHashSet resolvedParentIds = getResolvedParentIds(configuration);
+            unloadedConfigurations.put(configurationId, new UnloadedConfiguration(data, resolvedParentIds));
+            monitor.addConfiguration(configurationId);
+        }
+
+        // unload the configuations
+        //   note: we are iterating in reverse order
+        for (Iterator iterator = reverse(unloadedConfigurations).keySet().iterator(); iterator.hasNext();) {
+            Artifact configurationId = (Artifact) iterator.next();
+            Configuration configuration = getConfiguration(configurationId);
+
+            // first make sure it is stopped
+            if (started.contains(configurationId)) {
+                monitor.stopping(configurationId);
+                stop(configuration);
+                monitor.succeeded(configurationId);
+                results.addRestarted(configurationId);
+            } else {
+                // call stop just to be sure the beans aren't running
+                stop(configuration);
+            }
+
+            // now unload it
+            monitor.unloading(configurationId);
+            unload(configuration);
+            monitor.succeeded(configurationId);
+        }
+
+        // reload the configurations
+        Map actuallyLoaded = new LinkedHashMap(unloadedConfigurations.size());
+        for (Iterator iterator = unloadedConfigurations.entrySet().iterator(); iterator.hasNext();) {
+            Map.Entry entry = (Map.Entry) iterator.next();
+            Artifact configurationId = (Artifact) entry.getKey();
+            UnloadedConfiguration unloadedConfiguration = (UnloadedConfiguration) entry.getValue();
+
+            // skip the configurations that have alredy failed or were stopped
+            if (results.wasFailed(configurationId) || results.wasStopped(configurationId)) {
+                continue;
+            }
+
+            // try to load the configuation
+            Configuration configuration = null;
+            try {
+                monitor.loading(configurationId);
+                configuration = load(unloadedConfiguration.getConfigurationData(), unloadedConfiguration.getResolvedParentIds(), actuallyLoaded);
+                monitor.succeeded(configurationId);
+
+                results.addReloaded(configurationId);
+
+                // if the configuration was started before restart it
+                if (started.contains(configurationId)) {
+                    monitor.starting(configurationId);
+                    start(configuration);
+                    monitor.succeeded(configurationId);
+                    results.addRestarted(configurationId);
+                }
+
+                actuallyLoaded.put(configurationId, configuration);
+                configurations.put(configurationId, configuration);
+            } catch (Exception e) {
+                // the configuraiton failed to restart
+                results.addFailed(configurationId, e);
+                monitor.failed(configurationId, e);
+
+                // unload the configuration if it was loaded and failed in start
+                if (configuration != null) {
+                    unload(configuration);
+                }
+
+                // if this is root configuration, attempt to reinstate the original configuration
+                boolean reinstatedExisting = false;
+                if (configurationId.equals(newConfigurationData.getId())) {
+                    configuration = null;
+                    try {
+                        configuration = load(existingUnloadedConfiguration.getConfigurationData(),
+                                existingUnloadedConfiguration.getResolvedParentIds(),
+                                actuallyLoaded);
+
+                        results.addReloaded(configurationId);
+
+                        // if the configuration was started before restart it
+                        if (started.contains(configurationId)) {
+                            start(configuration);
+                            results.addRestarted(configurationId);
+                        }
+
+                        actuallyLoaded.put(configurationId, configuration);
+                        configurations.put(configurationId, configuration);
+
+                        reinstatedExisting = true;
+                    } catch (Exception ignored) {
+                        // we tried our best
+                        if (configuration != null) {
+                            unload(configuration);
+                        }
+                    }
+                }
+
+                if (!reinstatedExisting) {
+                    // officially unload the configuration in the model (without gc)
+                    LinkedHashSet unloadList = configurationModel.unload(configurationId, false);
+                    configurationModel.removeConfiguration(configurationId);
+
+                    // all of the configurations to be unloaded must be in our unloaded list, or the model is corrupt
+                    if (!unloadedConfigurations.keySet().containsAll(unloadList)) {
+                        throw new AssertionError("Configuration data model is corrupt.   You must restart your server.");
+                    }
+
+                    // add the children of the failed configuration to the results as unloaded
+                    for (Iterator iterator1 = unloadList.iterator(); iterator1.hasNext();) {
+                        Artifact failedId = (Artifact) iterator1.next();
+
+                        // if any of the failed configuration is in the reloaded set, the model is
+                        // corrupt because we loaded a child before a parent
+                        if (results.wasLoaded(failedId)) {
+                            throw new AssertionError("Configuration data model is corrupt.   You must restart your server.");
+                        }
+
+                        if (!results.wasFailed(failedId)) {
+                            results.addUnloaded(failedId);
+                            if (started.contains(configurationId)) {
+                                results.addStopped(failedId);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        monitor.finished();
+        if (results.wasFailed(newConfigurationData.getId()) || !results.wasReloaded(newConfigurationData.getId())) {
+            throw new LifecycleException("reload", newConfigurationData.getId(), results);
+        }
+
+        return results;
+    }
+
+    private static LinkedHashSet getResolvedParentIds(Configuration configuration) {
+        LinkedHashSet resolvedParentIds = new LinkedHashSet();
+        for (Iterator iterator1 = configuration.getClassParents().iterator(); iterator1.hasNext();) {
+            Configuration classParent = (Configuration) iterator1.next();
+            resolvedParentIds.add(classParent.getId());
+        }
+        for (Iterator iterator1 = configuration.getServiceParents().iterator(); iterator1.hasNext();) {
+            Configuration serviceParent = (Configuration) iterator1.next();
+            resolvedParentIds.add(serviceParent.getId());
+        }
+        return resolvedParentIds;
+    }
+
     public synchronized void uninstallConfiguration(Artifact configurationId) throws IOException, NoSuchConfigException {
         if (configurations.containsKey(configurationId)) {
             stopConfiguration(configurationId);
@@ -649,5 +863,33 @@
 
     private List getStoreList() {
         return new ArrayList(stores);
+    }
+
+    private static void addConfigurationsToMonitor(LifecycleMonitor monitor, LinkedHashSet configurations) {
+        for (Iterator iterator = configurations.iterator(); iterator.hasNext();) {
+            Artifact configurationId = (Artifact) iterator.next();
+            monitor.addConfiguration(configurationId);
+        }
+    }
+
+    private static LinkedHashSet reverse(LinkedHashSet set) {
+        ArrayList reverseList = new ArrayList(set);
+        Collections.reverse(reverseList);
+        set = new LinkedHashSet(reverseList);
+        return set;
+    }
+
+    private static LinkedHashMap reverse(LinkedHashMap map) {
+        ArrayList reverseEntrySet = new ArrayList(map.entrySet());
+        Collections.reverse(reverseEntrySet);
+
+        map = new LinkedHashMap(reverseEntrySet.size());
+        for (Iterator iterator = reverseEntrySet.iterator(); iterator.hasNext();) {
+            Map.Entry entry = (Map.Entry) iterator.next();
+            Object key = entry.getKey();
+            Object value = entry.getValue();
+            map.put(key, value);
+        }
+        return map;
     }
 }

Modified: geronimo/branches/1.1/modules/kernel/src/test/org/apache/geronimo/kernel/config/ConfigurationManagerTest.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/kernel/src/test/org/apache/geronimo/kernel/config/ConfigurationManagerTest.java?rev=395030&r1=395029&r2=395030&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/kernel/src/test/org/apache/geronimo/kernel/config/ConfigurationManagerTest.java (original)
+++ geronimo/branches/1.1/modules/kernel/src/test/org/apache/geronimo/kernel/config/ConfigurationManagerTest.java Tue Apr 18 13:31:48 2006
@@ -35,6 +35,7 @@
 import org.apache.geronimo.gbean.GBeanData;
 import org.apache.geronimo.gbean.GBeanInfo;
 import org.apache.geronimo.gbean.GBeanInfoBuilder;
+import org.apache.geronimo.gbean.AbstractNameQuery;
 import org.apache.geronimo.kernel.Kernel;
 import org.apache.geronimo.kernel.KernelFactory;
 import org.apache.geronimo.kernel.management.State;
@@ -60,12 +61,16 @@
     private AbstractName gbean1;
     private AbstractName gbean2;
     private AbstractName gbean3;
+    private TestConfigStore configStore;
 
     public void testLoad() throws Exception {
         configurationManager.loadConfiguration(artifact3);
         assertTrue(configurationManager.isLoaded(artifact3));
         assertTrue(configurationManager.isLoaded(artifact2));
         assertTrue(configurationManager.isLoaded(artifact1));
+        assertFalse(configurationManager.isRunning(artifact3));
+        assertFalse(configurationManager.isRunning(artifact2));
+        assertFalse(configurationManager.isRunning(artifact1));
         assertTrue(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact3))) ;
         assertTrue(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact2))) ;
         assertTrue(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact1))) ;
@@ -81,6 +86,9 @@
         assertFalse(configurationManager.isLoaded(artifact3));
         assertFalse(configurationManager.isLoaded(artifact2));
         assertFalse(configurationManager.isLoaded(artifact1));
+        assertFalse(configurationManager.isRunning(artifact3));
+        assertFalse(configurationManager.isRunning(artifact2));
+        assertFalse(configurationManager.isRunning(artifact1));
         assertFalse(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact3))) ;
         assertFalse(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact2))) ;
         assertFalse(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact1))) ;
@@ -91,6 +99,9 @@
         assertTrue(configurationManager.isLoaded(artifact3));
         assertTrue(configurationManager.isLoaded(artifact2));
         assertTrue(configurationManager.isLoaded(artifact1));
+        assertFalse(configurationManager.isRunning(artifact3));
+        assertFalse(configurationManager.isRunning(artifact2));
+        assertFalse(configurationManager.isRunning(artifact1));
         assertTrue(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact3))) ;
         assertTrue(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact2))) ;
         assertTrue(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact1))) ;
@@ -102,6 +113,9 @@
         assertFalse(kernel.isLoaded(gbean3));
 
         configurationManager.startConfiguration(artifact3);
+        assertTrue(configurationManager.isRunning(artifact3));
+        assertTrue(configurationManager.isRunning(artifact2));
+        assertTrue(configurationManager.isRunning(artifact1));
         assertTrue(kernel.isLoaded(gbean1));
         assertTrue(kernel.isLoaded(gbean2));
         assertTrue(kernel.isLoaded(gbean3));
@@ -111,6 +125,12 @@
 
 
         configurationManager.stopConfiguration(artifact3);
+        assertTrue(configurationManager.isLoaded(artifact3));
+        assertTrue(configurationManager.isLoaded(artifact2));
+        assertTrue(configurationManager.isLoaded(artifact1));
+        assertFalse(configurationManager.isRunning(artifact3));
+        assertFalse(configurationManager.isRunning(artifact2));
+        assertFalse(configurationManager.isRunning(artifact1));
         assertFalse(kernel.isLoaded(gbean1));
         assertFalse(kernel.isLoaded(gbean2));
         assertFalse(kernel.isLoaded(gbean3));
@@ -118,6 +138,9 @@
         configurationManager.unloadConfiguration(artifact3);
         assertFalse(configurationManager.isLoaded(artifact3));
         assertFalse(configurationManager.isLoaded(artifact2));
+        assertFalse(configurationManager.isRunning(artifact3));
+        assertFalse(configurationManager.isRunning(artifact2));
+        assertFalse(configurationManager.isRunning(artifact1));
         assertFalse(configurationManager.isLoaded(artifact1));
         assertFalse(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact3))) ;
         assertFalse(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact2))) ;
@@ -230,6 +253,213 @@
         assertFalse(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact1))) ;
     }
 
+    public void testReload() throws Exception {
+        configurationManager.loadConfiguration(artifact3);
+        configurationManager.startConfiguration(artifact3);
+        Object g1 = kernel.getGBean(gbean1);
+        Object g2 = kernel.getGBean(gbean2);
+        Object g3 = kernel.getGBean(gbean3);
+        assertSame(g1, kernel.getGBean(gbean1));
+        assertSame(g2, kernel.getGBean(gbean2));
+        assertSame(g3, kernel.getGBean(gbean3));
+        Configuration configuration1 = configurationManager.getConfiguration(artifact1);
+        Configuration configuration2 = configurationManager.getConfiguration(artifact2);
+        Configuration configuration3 = configurationManager.getConfiguration(artifact3);
+
+        LifecycleResults results = configurationManager.reloadConfiguration(artifact1);
+
+        // check the results
+        assertTrue(results.wasReloaded(artifact1));
+        assertTrue(results.wasReloaded(artifact2));
+        assertTrue(results.wasReloaded(artifact3));
+        assertTrue(results.wasRestarted(artifact1));
+        assertTrue(results.wasRestarted(artifact2));
+        assertTrue(results.wasRestarted(artifact3));
+
+        // check the state of the configuration manager
+        assertTrue(configurationManager.isLoaded(artifact1));
+        assertTrue(configurationManager.isLoaded(artifact2));
+        assertTrue(configurationManager.isLoaded(artifact3));
+        assertTrue(configurationManager.isRunning(artifact1));
+        assertTrue(configurationManager.isRunning(artifact2));
+        assertTrue(configurationManager.isRunning(artifact3));
+        assertNotSame(configuration1, configurationManager.getConfiguration(artifact1));
+        assertNotSame(configuration2, configurationManager.getConfiguration(artifact2));
+        assertNotSame(configuration3, configurationManager.getConfiguration(artifact3));
+
+        // check the state of the kernel
+        assertTrue(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact3))) ;
+        assertTrue(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact2))) ;
+        assertTrue(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact1))) ;
+        assertTrue(kernel.isRunning(Configuration.getConfigurationAbstractName(artifact3))) ;
+        assertTrue(kernel.isRunning(Configuration.getConfigurationAbstractName(artifact2))) ;
+        assertTrue(kernel.isRunning(Configuration.getConfigurationAbstractName(artifact1))) ;
+        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(Configuration.getConfigurationAbstractName(artifact3))) ;
+        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(Configuration.getConfigurationAbstractName(artifact2))) ;
+        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(Configuration.getConfigurationAbstractName(artifact1))) ;
+        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(gbean1)) ;
+        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(gbean2)) ;
+        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(gbean3)) ;
+        assertNotSame(g1, kernel.getGBean(gbean1));
+        assertNotSame(g2, kernel.getGBean(gbean2));
+        assertNotSame(g3, kernel.getGBean(gbean3));
+
+        configurationManager.stopConfiguration(artifact3);
+        assertFalse(kernel.isLoaded(gbean1));
+        assertFalse(kernel.isLoaded(gbean2));
+        assertFalse(kernel.isLoaded(gbean3));
+
+        configurationManager.unloadConfiguration(artifact3);
+        assertFalse(configurationManager.isLoaded(artifact3));
+        assertFalse(configurationManager.isLoaded(artifact2));
+        assertFalse(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact3))) ;
+        assertFalse(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact2))) ;
+
+        // artifact 1 should still be loaded since it was user loaded above
+        assertTrue(configurationManager.isLoaded(artifact1));
+        assertTrue(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact1))) ;
+
+        configurationManager.unloadConfiguration(artifact1);
+        assertFalse(configurationManager.isLoaded(artifact1));
+        assertFalse(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact1))) ;
+    }
+
+    public void testReloadException() throws Exception {
+        configurationManager.loadConfiguration(artifact3);
+        configurationManager.startConfiguration(artifact3);
+        Object g1 = kernel.getGBean(gbean1);
+        Object g2 = kernel.getGBean(gbean2);
+        kernel.getGBean(gbean3);
+
+        // make gbean3 fail and Reload all configs
+        shouldFail.add(gbean3.getObjectName().getCanonicalName());
+        LifecycleResults results = configurationManager.reloadConfiguration(artifact1);
+
+        // check the results
+        assertTrue(results.wasReloaded(artifact1));
+        assertTrue(results.wasReloaded(artifact2));
+        assertTrue(results.wasReloaded(artifact3));
+        assertTrue(results.wasRestarted(artifact1));
+        assertTrue(results.wasRestarted(artifact2));
+        assertTrue(results.wasRestarted(artifact3));
+
+        // all configuration except 3 should be loaded
+        assertFalse(configurationManager.isLoaded(artifact3));
+        assertTrue(configurationManager.isLoaded(artifact2));
+        assertTrue(configurationManager.isLoaded(artifact1));
+        assertFalse(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact3))) ;
+        assertTrue(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact2))) ;
+        assertTrue(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact1))) ;
+        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(Configuration.getConfigurationAbstractName(artifact2))) ;
+        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(Configuration.getConfigurationAbstractName(artifact1))) ;
+
+        // configuration 3 should not be running
+        assertTrue(configurationManager.isRunning(artifact1));
+        assertTrue(configurationManager.isRunning(artifact2));
+        assertFalse(configurationManager.isRunning(artifact3));
+        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(gbean1)) ;
+        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(gbean2)) ;
+        assertFalse(kernel.isLoaded(gbean3));
+
+        // make sure that gbean 1 and 2 were recreated
+        assertNotSame(g1, kernel.getGBean(gbean1));
+        assertNotSame(g2, kernel.getGBean(gbean2));
+
+        configurationManager.unloadConfiguration(artifact1);
+        assertFalse(configurationManager.isLoaded(artifact3));
+        assertFalse(configurationManager.isLoaded(artifact2));
+        assertFalse(configurationManager.isLoaded(artifact1));
+        assertFalse(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact3))) ;
+        assertFalse(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact2))) ;
+        assertFalse(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact1))) ;
+    }
+
+    public void testReloadFallback() throws Exception {
+        configurationManager.loadConfiguration(artifact3);
+        configurationManager.startConfiguration(artifact3);
+        Object g1 = kernel.getGBean(gbean1);
+        Object g2 = kernel.getGBean(gbean2);
+        Object g3 = kernel.getGBean(gbean3);
+        assertSame(g1, kernel.getGBean(gbean1));
+        assertSame(g2, kernel.getGBean(gbean2));
+        assertSame(g3, kernel.getGBean(gbean3));
+        Configuration configuration1 = configurationManager.getConfiguration(artifact1);
+        Configuration configuration2 = configurationManager.getConfiguration(artifact2);
+        Configuration configuration3 = configurationManager.getConfiguration(artifact3);
+
+        Environment environment = new Environment();
+        environment.setConfigId(artifact1);
+        ConfigurationData configurationData1 = new ConfigurationData(environment, kernel.getNaming());
+        configurationData1.setConfigurationStore(configStore);
+        GBeanData gbeanData = configurationData1.addGBean("gbean1", TestBean.getGBeanInfo());
+        gbeanData.setReferencePattern("nonExistantReference", new AbstractNameQuery("some.non.existant.Clazz"));
+        configurations.put(artifact1, configurationData1);
+
+        LifecycleResults results = null;
+        try {
+            configurationManager.reloadConfiguration(artifact1);
+            fail("Expected LifecycleException");
+        } catch (LifecycleException expected) {
+            results = expected.getLifecycleResults();
+        }
+
+        // check the results
+        assertTrue(results.wasFailed(artifact1));
+        assertTrue(results.wasReloaded(artifact1));
+        assertTrue(results.wasReloaded(artifact2));
+        assertTrue(results.wasReloaded(artifact3));
+        assertTrue(results.wasRestarted(artifact1));
+        assertTrue(results.wasRestarted(artifact2));
+        assertTrue(results.wasRestarted(artifact3));
+
+        // check the state of the configuration manager
+        assertTrue(configurationManager.isLoaded(artifact1));
+        assertTrue(configurationManager.isLoaded(artifact2));
+        assertTrue(configurationManager.isLoaded(artifact3));
+        assertTrue(configurationManager.isRunning(artifact1));
+        assertTrue(configurationManager.isRunning(artifact2));
+        assertTrue(configurationManager.isRunning(artifact3));
+        assertNotSame(configuration1, configurationManager.getConfiguration(artifact1));
+        assertNotSame(configuration2, configurationManager.getConfiguration(artifact2));
+        assertNotSame(configuration3, configurationManager.getConfiguration(artifact3));
+
+        // check the state of the kernel
+        assertTrue(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact3))) ;
+        assertTrue(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact2))) ;
+        assertTrue(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact1))) ;
+        assertTrue(kernel.isRunning(Configuration.getConfigurationAbstractName(artifact3))) ;
+        assertTrue(kernel.isRunning(Configuration.getConfigurationAbstractName(artifact2))) ;
+        assertTrue(kernel.isRunning(Configuration.getConfigurationAbstractName(artifact1))) ;
+        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(Configuration.getConfigurationAbstractName(artifact3))) ;
+        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(Configuration.getConfigurationAbstractName(artifact2))) ;
+        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(Configuration.getConfigurationAbstractName(artifact1))) ;
+        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(gbean1)) ;
+        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(gbean2)) ;
+        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(gbean3)) ;
+        assertNotSame(g1, kernel.getGBean(gbean1));
+        assertNotSame(g2, kernel.getGBean(gbean2));
+        assertNotSame(g3, kernel.getGBean(gbean3));
+
+        configurationManager.stopConfiguration(artifact3);
+        assertFalse(kernel.isLoaded(gbean1));
+        assertFalse(kernel.isLoaded(gbean2));
+        assertFalse(kernel.isLoaded(gbean3));
+
+        configurationManager.unloadConfiguration(artifact3);
+        assertFalse(configurationManager.isLoaded(artifact3));
+        assertFalse(configurationManager.isLoaded(artifact2));
+        assertFalse(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact3))) ;
+        assertFalse(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact2))) ;
+
+        // artifact 1 should still be loaded since it was user loaded above
+        assertTrue(configurationManager.isLoaded(artifact1));
+        assertTrue(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact1))) ;
+
+        configurationManager.unloadConfiguration(artifact1);
+        assertFalse(configurationManager.isLoaded(artifact1));
+        assertFalse(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact1))) ;
+    }
+
     private static final Set shouldFail = new HashSet();
     private static void checkFail(String objectName) {
         if (shouldFail.contains(objectName)) {
@@ -240,6 +470,8 @@
     protected void setUp() throws Exception {
         super.setUp();
 
+        shouldFail.clear();
+
         kernel = KernelFactory.newInstance().createKernel("test");
         kernel.boot();
 
@@ -249,7 +481,7 @@
         assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(artifactManagerData.getAbstractName()));
         ArtifactManager artifactManager = (ArtifactManager) kernel.getGBean(artifactManagerData.getAbstractName());
 
-        TestConfigStore configStore = new TestConfigStore();
+        configStore = new TestConfigStore();
         TestRepository testRepository = new TestRepository();
         DefaultArtifactResolver artifactResolver = new DefaultArtifactResolver(artifactManager, testRepository);
 

Modified: geronimo/branches/1.1/modules/system/src/test/org/apache/geronimo/system/configuration/ConfigInstallerTest.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/system/src/test/org/apache/geronimo/system/configuration/ConfigInstallerTest.java?rev=395030&r1=395029&r2=395030&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/system/src/test/org/apache/geronimo/system/configuration/ConfigInstallerTest.java (original)
+++ geronimo/branches/1.1/modules/system/src/test/org/apache/geronimo/system/configuration/ConfigInstallerTest.java Tue Apr 18 13:31:48 2006
@@ -40,6 +40,7 @@
 import org.apache.geronimo.kernel.repository.Artifact;
 import org.apache.geronimo.kernel.repository.FileWriteMonitor;
 import org.apache.geronimo.kernel.repository.WritableListableRepository;
+import org.apache.geronimo.kernel.repository.Version;
 import org.apache.geronimo.system.serverinfo.BasicServerInfo;
 import org.apache.geronimo.system.threads.ThreadPool;
 
@@ -200,6 +201,30 @@
         }
 
         public LifecycleResults restartConfiguration(Artifact configurationId, LifecycleMonitor monitor) throws NoSuchConfigException, LifecycleException {
+            return null;
+        }
+
+        public LifecycleResults reloadConfiguration(Artifact configurationId) throws NoSuchConfigException, LifecycleException {
+            return null;
+        }
+
+        public LifecycleResults reloadConfiguration(Artifact configurationId, LifecycleMonitor monitor) throws NoSuchConfigException, LifecycleException {
+            return null;
+        }
+
+        public LifecycleResults reloadConfiguration(Artifact configurationId, Version version) throws NoSuchConfigException, LifecycleException {
+            return null;
+        }
+
+        public LifecycleResults reloadConfiguration(Artifact configurationId, Version version, LifecycleMonitor monitor) throws NoSuchConfigException, LifecycleException {
+            return null;
+        }
+
+        public LifecycleResults reloadConfiguration(ConfigurationData configurationData) throws NoSuchConfigException, LifecycleException {
+            return null;
+        }
+
+        public LifecycleResults reloadConfiguration(ConfigurationData configurationData, LifecycleMonitor monitor) throws NoSuchConfigException, LifecycleException {
             return null;
         }