Package org.apache.geronimo.kernel.config

Source Code of org.apache.geronimo.kernel.config.ConfigurationManagerTest

/**
*
* 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.config;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import junit.framework.TestCase;
import org.apache.geronimo.gbean.AbstractName;
import org.apache.geronimo.gbean.AbstractNameQuery;
import org.apache.geronimo.gbean.GBeanData;
import org.apache.geronimo.gbean.GBeanInfo;
import org.apache.geronimo.gbean.GBeanInfoBuilder;
import org.apache.geronimo.kernel.GBeanNotFoundException;
import org.apache.geronimo.kernel.Kernel;
import org.apache.geronimo.kernel.KernelFactory;
import org.apache.geronimo.kernel.management.State;
import org.apache.geronimo.kernel.repository.Artifact;
import org.apache.geronimo.kernel.repository.ArtifactManager;
import org.apache.geronimo.kernel.repository.DefaultArtifactManager;
import org.apache.geronimo.kernel.repository.DefaultArtifactResolver;
import org.apache.geronimo.kernel.repository.Environment;
import org.apache.geronimo.kernel.repository.ImportType;
import org.apache.geronimo.kernel.repository.ListableRepository;
import org.apache.geronimo.kernel.repository.Version;

/**
* @version $Rev: 409817 $ $Date: 2006-05-27 09:56:38 +0200 (Sat, 27 May 2006) $
*/
public class ConfigurationManagerTest extends TestCase {
    private static Kernel kernel;
    private Artifact artifact1;
    private Artifact artifact2;
    private Artifact artifact3;
    private Artifact artifact3NoVersion;
    private Map configurations = new HashMap();
    private ConfigurationManager configurationManager;
    private AbstractName gbean1;
    private AbstractName gbean2;
    private AbstractName gbean3;
    private AbstractName gbean3newer;
    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))) ;
        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))) ;
        assertFalse(kernel.isLoaded(gbean1));
        assertFalse(kernel.isLoaded(gbean2));
        assertFalse(kernel.isLoaded(gbean3));


        configurationManager.unloadConfiguration(artifact3);
        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))) ;
    }

    public void testStart() 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))) ;
        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))) ;
        assertFalse(kernel.isLoaded(gbean1));
        assertFalse(kernel.isLoaded(gbean2));
        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));
        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(gbean1)) ;
        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(gbean2)) ;
        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(gbean3)) ;


        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));

        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))) ;
        assertFalse(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact1))) ;
    }

    public void testRestart() 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));

        //
        // restart artifact1 which should cascade to the children
        //
        LifecycleResults results = configurationManager.restartConfiguration(artifact1);

        // all three should have been stopped and then started
        assertTrue(results.wasStopped(artifact1));
        assertTrue(results.wasStopped(artifact2));
        assertTrue(results.wasStopped(artifact3));
        assertTrue(results.wasStarted(artifact1));
        assertTrue(results.wasStarted(artifact2));
        assertTrue(results.wasStarted(artifact3));

        // none of them should have been unloaded, loaded or failed
        assertFalse(results.wasUnloaded(artifact1));
        assertFalse(results.wasUnloaded(artifact2));
        assertFalse(results.wasUnloaded(artifact3));
        assertFalse(results.wasLoaded(artifact1));
        assertFalse(results.wasLoaded(artifact2));
        assertFalse(results.wasLoaded(artifact3));
        assertFalse(results.wasFailed(artifact1));
        assertFalse(results.wasFailed(artifact2));
        assertFalse(results.wasFailed(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))) ;
        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(gbean2));
        assertFalse(kernel.isLoaded(gbean3));

        // bean3 should still be running because it is now user started due to the restart above
        assertTrue(kernel.isLoaded(gbean1));
        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(gbean1)) ;

        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 and running since it was user started above
        assertTrue(configurationManager.isLoaded(artifact1));
        assertTrue(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact1))) ;
        assertTrue(kernel.isLoaded(gbean1));
        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(gbean1));

        configurationManager.unloadConfiguration(artifact1);
        assertFalse(configurationManager.isLoaded(artifact1));
        assertFalse(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact1))) ;
        assertFalse(kernel.isLoaded(gbean1));

    }

    public void testRestartException() 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 restart all configs
        shouldFail.add(gbean3.getObjectName().getCanonicalName());
        LifecycleResults results = configurationManager.restartConfiguration(artifact1);

        // 3 should have been stopped and failed, but not started
        assertTrue(results.wasStopped(artifact3));
        assertTrue(results.wasFailed(artifact3));
        assertFalse(results.wasStarted(artifact3));

        // one and two shoudld have stopped and then started and not failed
        assertTrue(results.wasStopped(artifact1));
        assertTrue(results.wasStopped(artifact2));
        assertTrue(results.wasStarted(artifact1));
        assertTrue(results.wasStarted(artifact2));
        assertFalse(results.wasFailed(artifact1));
        assertFalse(results.wasFailed(artifact2));

        // none of them should have been unloaded or loaded
        assertFalse(results.wasUnloaded(artifact1));
        assertFalse(results.wasUnloaded(artifact2));
        assertFalse(results.wasUnloaded(artifact3));
        assertFalse(results.wasLoaded(artifact1));
        assertFalse(results.wasLoaded(artifact2));
        assertFalse(results.wasLoaded(artifact3));

        // all configuration should be loaded
        assertTrue(configurationManager.isLoaded(artifact3));
        assertTrue(configurationManager.isLoaded(artifact2));
        assertTrue(configurationManager.isLoaded(artifact1));
        assertTrue(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(artifact3))) ;
        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(Configuration.getConfigurationAbstractName(artifact2))) ;
        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(Configuration.getConfigurationAbstractName(artifact1))) ;

        // but 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 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
        // all three should have been stopped, unloaded, loaded and then started
        assertTrue(results.wasStopped(artifact1));
        assertTrue(results.wasStopped(artifact2));
        assertTrue(results.wasStopped(artifact3));
        assertTrue(results.wasUnloaded(artifact1));
        assertTrue(results.wasUnloaded(artifact2));
        assertTrue(results.wasUnloaded(artifact3));
        assertTrue(results.wasLoaded(artifact1));
        assertTrue(results.wasLoaded(artifact2));
        assertTrue(results.wasLoaded(artifact3));
        assertTrue(results.wasStarted(artifact1));
        assertTrue(results.wasStarted(artifact2));
        assertTrue(results.wasStarted(artifact3));

        // none of them should have been failed
        assertFalse(results.wasFailed(artifact1));
        assertFalse(results.wasFailed(artifact2));
        assertFalse(results.wasFailed(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

        // 3 should have been stopped, unloaded and then failed
        assertTrue(results.wasStopped(artifact3));
        assertTrue(results.wasUnloaded(artifact3));
        assertTrue(results.wasFailed(artifact3));
        assertFalse(results.wasLoaded(artifact3));
        assertFalse(results.wasStarted(artifact3));

        // 1 and 2 should have been stopped, unloaded, loaded and then started
        assertTrue(results.wasStopped(artifact1));
        assertTrue(results.wasStopped(artifact2));
        assertTrue(results.wasUnloaded(artifact1));
        assertTrue(results.wasUnloaded(artifact2));
        assertTrue(results.wasLoaded(artifact1));
        assertTrue(results.wasLoaded(artifact2));
        assertTrue(results.wasStarted(artifact1));
        assertTrue(results.wasStarted(artifact2));

        // 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

        // 1 should be failed
        assertTrue(results.wasFailed(artifact1));

        // but all three did stop, unload, load and start
        assertTrue(results.wasStopped(artifact1));
        assertTrue(results.wasStopped(artifact2));
        assertTrue(results.wasStopped(artifact3));
        assertTrue(results.wasUnloaded(artifact1));
        assertTrue(results.wasUnloaded(artifact2));
        assertTrue(results.wasUnloaded(artifact3));
        assertTrue(results.wasLoaded(artifact1));
        assertTrue(results.wasLoaded(artifact2));
        assertTrue(results.wasLoaded(artifact3));
        assertTrue(results.wasStarted(artifact1));
        assertTrue(results.wasStarted(artifact2));
        assertTrue(results.wasStarted(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 testReloadNewerConfiguration() throws Exception {
        configurationManager.loadConfiguration(artifact3);
        configurationManager.startConfiguration(artifact3);
        Object g1 = kernel.getGBean(gbean1);
        Object g2 = kernel.getGBean(gbean2);
        Object g3 = kernel.getGBean(gbean3);
        try {
            kernel.getGBean(gbean3newer);
            fail("Should not have found the newer GBean yet");
        } catch (GBeanNotFoundException e) {}
        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);
        assertNull(configurationManager.getConfiguration(artifact3NoVersion));

        LifecycleResults results = configurationManager.reloadConfiguration(artifact1);

        // check the results
        assertTrue(results.wasStopped(artifact1));
        assertTrue(results.wasStopped(artifact2));
        assertTrue(results.wasStopped(artifact3));
        assertTrue(results.wasUnloaded(artifact1));
        assertTrue(results.wasUnloaded(artifact2));
        assertTrue(results.wasUnloaded(artifact3));
        assertTrue(results.wasLoaded(artifact1));
        assertTrue(results.wasLoaded(artifact2));
        assertTrue(results.wasLoaded(artifact3));
        assertTrue(results.wasStarted(artifact1));
        assertTrue(results.wasStarted(artifact2));
        assertTrue(results.wasStarted(artifact3));
        assertFalse(results.wasFailed(artifact3NoVersion));
        assertFalse(results.wasLoaded(artifact3NoVersion));
        assertFalse(results.wasLoaded(artifact3NoVersion));
        assertFalse(results.wasStarted(artifact3NoVersion));
        assertFalse(results.wasStarted(artifact3NoVersion));
        assertFalse(results.wasStopped(artifact3NoVersion));
        assertFalse(results.wasUnloaded(artifact3NoVersion));

        // check the state of the configuration manager
        assertTrue(configurationManager.isLoaded(artifact1));
        assertTrue(configurationManager.isLoaded(artifact2));
        assertTrue(configurationManager.isLoaded(artifact3));
        assertFalse(configurationManager.isLoaded(artifact3NoVersion));
        assertTrue(configurationManager.isRunning(artifact1));
        assertTrue(configurationManager.isRunning(artifact2));
        assertTrue(configurationManager.isRunning(artifact3));
        assertFalse(configurationManager.isRunning(artifact3NoVersion));
        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))) ;
        assertFalse(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact3NoVersion)));
        assertTrue(kernel.isRunning(Configuration.getConfigurationAbstractName(artifact3))) ;
        assertTrue(kernel.isRunning(Configuration.getConfigurationAbstractName(artifact2))) ;
        assertTrue(kernel.isRunning(Configuration.getConfigurationAbstractName(artifact1))) ;
        assertFalse(kernel.isRunning(Configuration.getConfigurationAbstractName(artifact3NoVersion)));
        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));

        //
        // Reload a newer version of artifact3 (artifact3NoVersion, which has a timestamp as the version number)
        //
        results = configurationManager.reloadConfiguration(artifact3, artifact3NoVersion.getVersion());

        // artifact 3 should be stopped, unloaded and 3noVersion should have been loaded and started in it's place
        assertTrue(results.wasStopped(artifact3));
        assertTrue(results.wasUnloaded(artifact3));
        assertTrue(results.wasLoaded(artifact3NoVersion));
        assertTrue(results.wasStarted(artifact3NoVersion));
        assertFalse(results.wasLoaded(artifact3));
        assertFalse(results.wasStarted(artifact3));

        // artifact 1 and 2 should not have been touched
        assertFalse(results.wasStopped(artifact1));
        assertFalse(results.wasStopped(artifact2));
        assertFalse(results.wasUnloaded(artifact1));
        assertFalse(results.wasUnloaded(artifact2));
        assertFalse(results.wasLoaded(artifact1));
        assertFalse(results.wasLoaded(artifact2));
        assertFalse(results.wasStarted(artifact1));
        assertFalse(results.wasStarted(artifact2));

        // nothing should have failed
        assertFalse(results.wasFailed(artifact1));
        assertFalse(results.wasFailed(artifact2));
        assertFalse(results.wasFailed(artifact3));
        assertFalse(results.wasFailed(artifact3NoVersion));

        // check the state of the configuration manager
        assertTrue(configurationManager.isLoaded(artifact1));
        assertTrue(configurationManager.isLoaded(artifact2));
        assertFalse(configurationManager.isLoaded(artifact3));
        assertTrue(configurationManager.isLoaded(artifact3NoVersion));
        assertTrue(configurationManager.isRunning(artifact1));
        assertTrue(configurationManager.isRunning(artifact2));
        assertFalse(configurationManager.isRunning(artifact3));
        assertTrue(configurationManager.isRunning(artifact3NoVersion));

        // check the state of the kernel
        assertFalse(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact3)));
        assertTrue(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact2))) ;
        assertTrue(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact1))) ;
        assertTrue(kernel.isLoaded(Configuration.getConfigurationAbstractName(artifact3NoVersion)));
        assertFalse(kernel.isRunning(Configuration.getConfigurationAbstractName(artifact3)));
        assertTrue(kernel.isRunning(Configuration.getConfigurationAbstractName(artifact2))) ;
        assertTrue(kernel.isRunning(Configuration.getConfigurationAbstractName(artifact1))) ;
        assertTrue(kernel.isRunning(Configuration.getConfigurationAbstractName(artifact3NoVersion)));
        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(Configuration.getConfigurationAbstractName(artifact3NoVersion))) ;
        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(gbean3newer)) ;
    }

    private static final Set shouldFail = new HashSet();
    private static void checkFail(String objectName) {
        if (shouldFail.contains(objectName)) {
            throw new RuntimeException("FAILING");
        }
    }

    protected void setUp() throws Exception {
        super.setUp();

        shouldFail.clear();

        kernel = KernelFactory.newInstance().createKernel("test");
        kernel.boot();

        GBeanData artifactManagerData = buildGBeanData("name", "ArtifactManager", DefaultArtifactManager.GBEAN_INFO);
        kernel.loadGBean(artifactManagerData, getClass().getClassLoader());
        kernel.startGBean(artifactManagerData.getAbstractName());
        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(artifactManagerData.getAbstractName()));
        ArtifactManager artifactManager = (ArtifactManager) kernel.getGBean(artifactManagerData.getAbstractName());

        configStore = new TestConfigStore();
        TestRepository testRepository = new TestRepository();
        DefaultArtifactResolver artifactResolver = new DefaultArtifactResolver(artifactManager, testRepository);

        artifact1 = new Artifact("test", "1", "1.1", "bar");
        artifact2 = new Artifact("test", "2", "2.2", "bar");
        artifact3 = new Artifact("test", "3", "3.3", "bar");
        // As if it was deployed with no version, now its version is a timestamp
        artifact3NoVersion = new Artifact(artifact3.getGroupId(), artifact3.getArtifactId(), new Version(Long.toString(System.currentTimeMillis())), artifact3.getType());

        Environment e1 = new Environment();
        e1.setConfigId(artifact1);
        ConfigurationData configurationData1 = new ConfigurationData(e1, kernel.getNaming());
        configurationData1.setConfigurationStore(configStore);
        gbean1 = configurationData1.addGBean("gbean1", TestBean.getGBeanInfo()).getAbstractName();
        configurations.put(artifact1, configurationData1);

        Environment e2 = new Environment();
        e2.setConfigId(artifact2);
        e2.addDependency(new Artifact("test", "1", (Version) null, "bar"), ImportType.ALL);
        ConfigurationData configurationData2 = new ConfigurationData(e2, kernel.getNaming());
        gbean2 = configurationData2.addGBean("gbean2", TestBean.getGBeanInfo()).getAbstractName();
        configurationData2.setConfigurationStore(configStore);
        configurations.put(artifact2, configurationData2);

        { // Make it obvious if these temp variables are reused
            Environment e3 = new Environment();
            e3.setConfigId(artifact3);
            e3.addDependency(new Artifact("test", "2", (Version) null, "bar"), ImportType.ALL);
            ConfigurationData configurationData3 = new ConfigurationData(e3, kernel.getNaming());
            gbean3 = configurationData3.addGBean("gbean3", TestBean.getGBeanInfo()).getAbstractName();
            configurationData3.setConfigurationStore(configStore);
            configurations.put(artifact3, configurationData3);
        }

        {
            Environment e3newer = new Environment();
            e3newer.setConfigId(artifact3NoVersion);
            e3newer.addDependency(new Artifact("test", "2", (Version) null, "bar"), ImportType.ALL);
            ConfigurationData configurationData3newer = new ConfigurationData(e3newer, kernel.getNaming());
            gbean3newer = configurationData3newer.addGBean("gbean3", TestBean.getGBeanInfo()).getAbstractName();
            configurationData3newer.setConfigurationStore(configStore);
            configurations.put(artifact3NoVersion, configurationData3newer);
        }


        configurationManager = new KernelConfigurationManager(kernel,
                Collections.singleton(configStore),
                null,
                null,
                artifactManager,
                artifactResolver,
                Collections.singleton(testRepository),
                Collections.EMPTY_SET,
                KernelConfigurationManager.class.getClassLoader());
    }

    protected void tearDown() throws Exception {
        kernel.shutdown();
        super.tearDown();
    }

    private class TestConfigStore extends NullConfigurationStore {
        public ConfigurationData loadConfiguration(Artifact configId) throws IOException, InvalidConfigException, NoSuchConfigException {
            return (ConfigurationData) configurations.get(configId);
        }

        public boolean containsConfiguration(Artifact configId) {
            return configurations.containsKey(configId);
        }

        public String getObjectName() {
            throw new UnsupportedOperationException();
        }

        public AbstractName getAbstractName() {
            throw new UnsupportedOperationException();
        }

        public List listConfigurations() {
            throw new UnsupportedOperationException();
        }

        public File createNewConfigurationDir(Artifact configId) throws ConfigurationAlreadyExistsException {
            throw new UnsupportedOperationException();
        }

        public Set resolve(Artifact configId, String moduleName, String pattern) throws NoSuchConfigException, MalformedURLException {
            throw new UnsupportedOperationException();
        }
    }

    private GBeanData buildGBeanData(String key, String value, GBeanInfo info) {
        AbstractName abstractName = kernel.getNaming().createRootName(new Artifact("test", "foo", "1", "car"), value, key);
        return new GBeanData(abstractName, info);
    }

    private class TestRepository implements ListableRepository {
        public SortedSet list() {
            return new TreeSet(configurations.keySet());
        }

        public SortedSet list(Artifact query) {
            TreeSet artifacts = new TreeSet();
            for (Iterator iterator = configurations.keySet().iterator(); iterator.hasNext();) {
                Artifact artifact = (Artifact) iterator.next();
                if (query.matches(artifact)) {
                    artifacts.add(artifact);
                }
            }
            return artifacts;
        }

        public boolean contains(Artifact artifact) {
            return configurations.containsKey(artifact);
        }

        public File getLocation(Artifact artifact) {
            throw new UnsupportedOperationException();
        }

        public LinkedHashSet getDependencies(Artifact artifact) {
            return new LinkedHashSet();
        }
    }

    public static class TestBean {
        public TestBean(String objectName) {
            checkFail(objectName);
        }

        private static final GBeanInfo GBEAN_INFO;
        static {
            GBeanInfoBuilder builder = GBeanInfoBuilder.createStatic(TestBean.class);
            builder.addAttribute("objectName", String.class, false);
            builder.setConstructor(new String[] {"objectName"});
            GBEAN_INFO = builder.getBeanInfo();
        }

        public static GBeanInfo getGBeanInfo() {
            return GBEAN_INFO;
        }
    }
}
TOP

Related Classes of org.apache.geronimo.kernel.config.ConfigurationManagerTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.