? picocontainer/junit1914416751.properties ? picocontainer/junit417279603.properties ? picocontainer/src/java/org/picocontainer/LifecycleManager.java ? picocontainer/src/java/org/picocontainer/defaults/DefaultLifecycleManager.java ? picocontainer/src/java/org/picocontainer/defaults/DefaultLifecycleManagerFactory.java ? picocontainer/src/java/org/picocontainer/defaults/LifecycleManagerFactory.java Index: picocontainer/maven.xml =================================================================== RCS file: /home/projects/picocontainer/scm/java/picocontainer/maven.xml,v retrieving revision 1.24 diff -u -r1.24 maven.xml --- picocontainer/maven.xml 5 Jun 2004 21:52:51 -0000 1.24 +++ picocontainer/maven.xml 3 Jul 2004 05:19:04 -0000 @@ -6,6 +6,7 @@ + @@ -37,6 +38,18 @@ artifact="${maven.build.dir}/${pom.artifactId}-tck-${pom.currentVersion}.jar" type="jars" /> + + + + + + + + Index: picocontainer/project.xml =================================================================== RCS file: /home/projects/picocontainer/scm/java/picocontainer/project.xml,v retrieving revision 1.92 diff -u -r1.92 project.xml --- picocontainer/project.xml 21 Jul 2004 20:47:28 -0000 1.92 +++ picocontainer/project.xml 23 Jul 2004 20:48:13 -0000 @@ -10,7 +10,7 @@ 3 picocontainer PicoContainer - 1.1-SNAPSHOT + 1.1-beta-1-SNAPSHOT Codehaus Index: picocontainer/src/java/org/picocontainer/MutablePicoContainer.java =================================================================== RCS file: /home/projects/picocontainer/scm/java/picocontainer/src/java/org/picocontainer/MutablePicoContainer.java,v retrieving revision 1.39 diff -u -r1.39 MutablePicoContainer.java --- picocontainer/src/java/org/picocontainer/MutablePicoContainer.java 18 Jul 2004 07:29:19 -0000 1.39 +++ picocontainer/src/java/org/picocontainer/MutablePicoContainer.java 23 Jul 2004 20:04:04 -0000 @@ -9,6 +9,7 @@ *****************************************************************************/ package org.picocontainer; +import java.util.Collection; import java.util.List; /** @@ -20,7 +21,7 @@ * @author Aslak Hellesøy * @author Jon Tirsén * @version $Revision: 1.39 $ - * @see "The The package description has a basic overview of how to use the picocontainer package." + * @see The package description has a basic overview of how to use the picocontainer package. * @since 1.0 */ public interface MutablePicoContainer extends PicoContainer { @@ -133,5 +134,10 @@ void addChildContainer(PicoContainer child); void addChildContainer(String name, PicoContainer child); void removeChildContainer(MutablePicoContainer child); + + LifecycleManager getLifecycleManager(); + Collection getChildContainers(); + + List getComponentInstancesOfType(Class type) throws PicoException; } Index: picocontainer/src/java/org/picocontainer/alternatives/ImplementationHidingPicoContainer.java =================================================================== RCS file: /home/projects/picocontainer/scm/java/picocontainer/src/java/org/picocontainer/alternatives/ImplementationHidingPicoContainer.java,v retrieving revision 1.3 diff -u -r1.3 ImplementationHidingPicoContainer.java --- picocontainer/src/java/org/picocontainer/alternatives/ImplementationHidingPicoContainer.java 23 Jul 2004 00:37:35 -0000 1.3 +++ picocontainer/src/java/org/picocontainer/alternatives/ImplementationHidingPicoContainer.java 23 Jul 2004 20:05:11 -0000 @@ -14,6 +14,8 @@ import org.picocontainer.PicoContainer; import org.picocontainer.PicoRegistrationException; import org.picocontainer.PicoVerificationException; +import org.picocontainer.LifecycleManager; +import org.picocontainer.PicoException; import org.picocontainer.defaults.CachingComponentAdapter; import org.picocontainer.defaults.ComponentAdapterFactory; import org.picocontainer.defaults.DefaultComponentAdapterFactory; @@ -188,6 +190,18 @@ public void removeChildContainer(MutablePicoContainer child) { delegate.removeChildContainer(child); + } + + public LifecycleManager getLifecycleManager() { + return delegate.getLifecycleManager(); + } + + public Collection getChildContainers() { + return delegate.getChildContainers(); + } + + public List getComponentInstancesOfType(Class type) throws PicoException { + return delegate.getComponentInstancesOfType(type); } protected Map getNamedContainers() { Index: picocontainer/src/java/org/picocontainer/defaults/DefaultPicoContainer.java =================================================================== RCS file: /home/projects/picocontainer/scm/java/picocontainer/src/java/org/picocontainer/defaults/DefaultPicoContainer.java,v retrieving revision 1.97 diff -u -r1.97 DefaultPicoContainer.java --- picocontainer/src/java/org/picocontainer/defaults/DefaultPicoContainer.java 23 Jul 2004 16:32:58 -0000 1.97 +++ picocontainer/src/java/org/picocontainer/defaults/DefaultPicoContainer.java 23 Jul 2004 20:32:58 -0000 @@ -10,20 +10,18 @@ package org.picocontainer.defaults; import org.picocontainer.ComponentAdapter; -import org.picocontainer.Disposable; +import org.picocontainer.LifecycleManager; import org.picocontainer.MutablePicoContainer; import org.picocontainer.Parameter; import org.picocontainer.PicoContainer; import org.picocontainer.PicoException; import org.picocontainer.PicoRegistrationException; import org.picocontainer.PicoVerificationException; -import org.picocontainer.Startable; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -59,15 +57,15 @@ private Map componentKeyToAdapterCache = new HashMap(); private ComponentAdapterFactory componentAdapterFactory; + private final LifecycleManagerFactory lifecycleManagerFactory; private PicoContainer parent; private List componentAdapters = new ArrayList(); // Keeps track of instantiation order. private List orderedComponentAdapters = new ArrayList(); - private boolean started = false; - private boolean disposed = false; protected Map namedChildContainers = new HashMap(); + private LifecycleManager lifecycleManager; /** * Creates a new container with a custom ComponentAdapterFactory and a parent container. @@ -82,20 +80,30 @@ * @param componentAdapterFactory the factory to use for creation of ComponentAdapters. * @param parent the parent container. */ - public DefaultPicoContainer(ComponentAdapterFactory componentAdapterFactory, PicoContainer parent) { + public DefaultPicoContainer(ComponentAdapterFactory componentAdapterFactory, LifecycleManagerFactory lifecycleManagerFactory, PicoContainer parent) { this.componentAdapterFactory = componentAdapterFactory; + this.lifecycleManagerFactory = lifecycleManagerFactory; this.parent = parent; } /** - * Creates a new container with a (caching) {@link DefaultComponentAdapterFactory} and a parent container. + * Creates a new container with a {@link DefaultLifecycleManagerFactory} and a parent container. + */ + public DefaultPicoContainer(ComponentAdapterFactory componentAdapterFactory, PicoContainer parent) { + this(componentAdapterFactory, new DefaultLifecycleManagerFactory(), parent); + } + + /** + * Creates a new container with a (caching) {@link DefaultComponentAdapterFactory}, + * a {@link DefaultLifecycleManagerFactory} and a parent container. */ public DefaultPicoContainer(PicoContainer parent) { this(new DefaultComponentAdapterFactory(), parent); } /** - * Creates a new container with a custom ComponentAdapterFactory and no parent container. + * Creates a new container with a custom ComponentAdapterFactory, a + * {@link DefaultLifecycleManagerFactory} and no parent container. */ public DefaultPicoContainer(ComponentAdapterFactory componentAdapterFactory) { this(componentAdapterFactory, null); @@ -157,7 +165,7 @@ found.add(componentAdapter); } } - return Collections.unmodifiableList(found); + return found; } /** @@ -290,7 +298,7 @@ result.add(componentInstance); } } - return Collections.unmodifiableList(result); + return result; } public Object getComponentInstance(Object componentKey) throws PicoException { @@ -338,65 +346,25 @@ } } + /** + * @deprecated Use {@link #getLifecycleManager()}.start() + */ public void start() { - if (disposed) throw new IllegalStateException("Already disposed"); - if (started) throw new IllegalStateException("Already started"); - List componentInstances = getComponentInstancesOfTypeWithContainerAdaptersLast(Startable.class); - for (Iterator iterator = componentInstances.iterator(); iterator.hasNext();) { - Startable startable = ((Startable) iterator.next()); - startable.start(); - } - Iterator it = namedChildContainers.values().iterator(); - while (it.hasNext()) { - PicoContainer pc = (PicoContainer) it.next(); - pc.getComponentInstances(); - pc.start(); - } - started = true; + getLifecycleManager().start(); } + /** + * @deprecated Use {@link #getLifecycleManager()}.start() + */ public void stop() { - if (disposed) throw new IllegalStateException("Already disposed"); - if (!started) throw new IllegalStateException("Not started"); - Iterator it = namedChildContainers.values().iterator(); - while (it.hasNext()) { - PicoContainer pc = (PicoContainer) it.next(); - pc.stop(); - } - List componentInstances = getComponentInstancesOfTypeWithContainerAdaptersLast(Startable.class); - Collections.reverse(componentInstances); - for (Iterator iterator = componentInstances.iterator(); iterator.hasNext();) { - ((Startable) iterator.next()).stop(); - } - started = false; + getLifecycleManager().stop(); } + /** + * @deprecated Use {@link #getLifecycleManager()}.start() + */ public void dispose() { - if (disposed) throw new IllegalStateException("Already disposed"); - Iterator it = namedChildContainers.values().iterator(); - while (it.hasNext()) { - PicoContainer pc = (PicoContainer) it.next(); - pc.dispose(); - } - List componentInstances = getComponentInstancesOfTypeWithContainerAdaptersLast(Disposable.class); - Collections.reverse(componentInstances); - for (Iterator iterator = componentInstances.iterator(); iterator.hasNext();) { - ((Disposable) iterator.next()).dispose(); - } - if (parent instanceof MutablePicoContainer) { - ((MutablePicoContainer) parent).removeChildContainer(this); - } - parent = null; - namedChildContainers = null; - disposed = true; - - } - - private List getComponentInstancesOfTypeWithContainerAdaptersLast(Class type) { - List result = new ArrayList(); - result.addAll(getComponentInstancesOfType(type)); - Collections.sort(result, new StackContainersAtEndComparator()); - return result; + getLifecycleManager().dispose(); } public MutablePicoContainer makeChildContainer() { @@ -404,7 +372,7 @@ } public MutablePicoContainer makeChildContainer(String name) { - DefaultPicoContainer pc = new DefaultPicoContainer(componentAdapterFactory, this); + DefaultPicoContainer pc = new DefaultPicoContainer(componentAdapterFactory, lifecycleManagerFactory, this); addChildContainer(name, pc); return pc; } @@ -431,24 +399,15 @@ } } - /** - * This comparator makes sure containers are always stacked at the end of the collection, - * leaving the order of the others unchanged. This is needed in order to have proper - * breadth-first traversal when calling lifecycle methods on container hierarchies. - * - * @author Aslak Hellesøy - * @version $Revision: 1.4 $ - */ - class StackContainersAtEndComparator implements Comparator { - public int compare(Object o1, Object o2) { - if (PicoContainer.class.isInstance(o1)) { - return 1; - } - if (PicoContainer.class.isInstance(o2)) { - return -1; - } - return 0; + public LifecycleManager getLifecycleManager() { + if(lifecycleManager == null) { + lifecycleManager = lifecycleManagerFactory.createLifecycleManager(this); } + return lifecycleManager; + } + + public Collection getChildContainers() { + return namedChildContainers.values(); } protected Map getNamedContainers() { Index: picocontainer/src/test/org/picocontainer/alternatives/ImplementationHidingPicoContainerTestCase.java =================================================================== RCS file: /home/projects/picocontainer/scm/java/picocontainer/src/test/org/picocontainer/alternatives/ImplementationHidingPicoContainerTestCase.java,v retrieving revision 1.1 diff -u -r1.1 ImplementationHidingPicoContainerTestCase.java --- picocontainer/src/test/org/picocontainer/alternatives/ImplementationHidingPicoContainerTestCase.java 14 Jul 2004 20:28:36 -0000 1.1 +++ picocontainer/src/test/org/picocontainer/alternatives/ImplementationHidingPicoContainerTestCase.java 23 Jul 2004 20:08:13 -0000 @@ -11,7 +11,6 @@ import org.picocontainer.MutablePicoContainer; import org.picocontainer.PicoContainer; import org.picocontainer.defaults.AbstractImplementationHidingPicoContainerTestCase; -import org.picocontainer.alternatives.ImplementationHidingPicoContainer; public class ImplementationHidingPicoContainerTestCase extends AbstractImplementationHidingPicoContainerTestCase { @@ -22,6 +21,4 @@ protected MutablePicoContainer createPicoContainer(PicoContainer parent) { return new ImplementationHidingPicoContainer(parent); } - - } Index: picocontainer/src/test/org/picocontainer/defaults/DefaultPicoContainerLifecycleTestCase.java =================================================================== RCS file: /home/projects/picocontainer/scm/java/picocontainer/src/test/org/picocontainer/defaults/DefaultPicoContainerLifecycleTestCase.java,v retrieving revision 1.20 diff -u -r1.20 DefaultPicoContainerLifecycleTestCase.java --- picocontainer/src/test/org/picocontainer/defaults/DefaultPicoContainerLifecycleTestCase.java 24 Jun 2004 23:27:05 -0000 1.20 +++ picocontainer/src/test/org/picocontainer/defaults/DefaultPicoContainerLifecycleTestCase.java 23 Jul 2004 19:40:00 -0000 @@ -16,6 +16,7 @@ import org.picocontainer.MutablePicoContainer; import org.picocontainer.PicoContainer; import org.picocontainer.Startable; +import org.picocontainer.LifecycleManager; import java.util.List; import java.util.ArrayList; @@ -82,7 +83,6 @@ } } - public void testOrderOfInstantiationShouldBeDependencyOrder() throws Exception { DefaultPicoContainer pico = new DefaultPicoContainer(); @@ -102,16 +102,17 @@ public void testOrderOfStartShouldBeDependencyOrderAndStopAndDisposeTheOpposite() throws Exception { - DefaultPicoContainer pico = new DefaultPicoContainer(); + MutablePicoContainer pico = new DefaultPicoContainer(); pico.registerComponentImplementation("recording", StringBuffer.class); pico.registerComponentImplementation(Four.class); pico.registerComponentImplementation(Two.class); pico.registerComponentImplementation(One.class); pico.registerComponentImplementation(Three.class); - pico.start(); - pico.stop(); - pico.dispose(); + LifecycleManager lm = pico.getLifecycleManager(); + lm.start(); + lm.stop(); + lm.dispose(); assertEquals("Three>Two>One>!Four!Three!Two!One", pico.getComponentInstance("recording").toString()); } Index: picocontainer/src/test/org/picocontainer/tck/AbstractPicoContainerTestCase.java =================================================================== RCS file: /home/projects/picocontainer/scm/java/picocontainer/src/test/org/picocontainer/tck/AbstractPicoContainerTestCase.java,v retrieving revision 1.44 diff -u -r1.44 AbstractPicoContainerTestCase.java --- picocontainer/src/test/org/picocontainer/tck/AbstractPicoContainerTestCase.java 18 Jul 2004 07:29:20 -0000 1.44 +++ picocontainer/src/test/org/picocontainer/tck/AbstractPicoContainerTestCase.java 23 Jul 2004 19:34:15 -0000 @@ -397,10 +397,8 @@ } public static class ContainerDependency { - private PicoContainer pico; - public ContainerDependency(PicoContainer container) { - this.pico = container; + assertNotNull(container); } } @@ -536,8 +534,6 @@ parent.dispose(); assertTrue(sb.toString().indexOf("-disposed") != -1); } - - public static class LifeCycleMonitoring implements Startable, Disposable { StringBuffer sb;