001 /*****************************************************************************
002 * Copyright (C) NanoContainer Organization. All rights reserved. *
003 * ------------------------------------------------------------------------- *
004 * The software in this package is published under the terms of the BSD *
005 * style license a copy of which has been included with this distribution in *
006 * the LICENSE.txt file. *
007 * *
008 * Original code by Paul Hammant *
009 *****************************************************************************/
010
011 package org.nanocontainer.reflection;
012
013 import java.io.Serializable;
014 import org.nanocontainer.NanoPicoContainer;
015 import org.picocontainer.ComponentMonitor;
016 import org.picocontainer.MutablePicoContainer;
017 import org.picocontainer.PicoContainer;
018 import org.picocontainer.defaults.ComponentAdapterFactory;
019 import org.picocontainer.defaults.ComponentMonitorStrategy;
020 import org.picocontainer.defaults.DefaultComponentAdapterFactory;
021 import org.picocontainer.defaults.DefaultPicoContainer;
022 import org.picocontainer.defaults.LifecycleStrategy;
023
024 /**
025 * This is a MutablePicoContainer that also supports soft composition. i.e. assembly by class name rather that class
026 * reference.
027 * <p>
028 * In terms of implementation it adopts the behaviour of DefaultPicoContainer and DefaultNanoContainer.</p>
029 *
030 * @author Paul Hammant
031 * @author Mauro Talevi
032 * @author Michael Rimov
033 * @version $Revision: 2964 $
034 */
035 public class DefaultNanoPicoContainer extends AbstractNanoPicoContainer implements NanoPicoContainer, Serializable,
036 ComponentMonitorStrategy {
037
038 public DefaultNanoPicoContainer(ClassLoader classLoader, ComponentAdapterFactory caf, PicoContainer parent) {
039 super(new DefaultPicoContainer(caf, parent), classLoader);
040 }
041
042 public DefaultNanoPicoContainer(ClassLoader classLoader, PicoContainer parent) {
043 super(new DefaultPicoContainer(new DefaultComponentAdapterFactory(), parent), classLoader);
044 }
045
046 public DefaultNanoPicoContainer(ClassLoader classLoader, PicoContainer parent, ComponentMonitor componentMonitor) {
047 super(new DefaultPicoContainer(new DefaultComponentAdapterFactory(componentMonitor), parent), classLoader);
048 }
049
050 public DefaultNanoPicoContainer(ComponentAdapterFactory caf) {
051 super(new DefaultPicoContainer(caf, null), DefaultNanoPicoContainer.class.getClassLoader());
052 }
053
054 public DefaultNanoPicoContainer(PicoContainer pc) {
055 super(new DefaultPicoContainer(pc), DefaultNanoPicoContainer.class.getClassLoader());
056 }
057
058 public DefaultNanoPicoContainer(ClassLoader classLoader) {
059 super(new DefaultPicoContainer(), classLoader);
060 }
061
062 public DefaultNanoPicoContainer() {
063 super(new DefaultPicoContainer(), DefaultNanoPicoContainer.class.getClassLoader());
064 }
065
066
067 /**
068 * Constructor that provides the same control over the nanocontainer lifecycle strategies
069 * as {@link DefaultPicoContainer(ComponentAdapterFactory, LifecycleStrategy, PicoContainer)}.
070 * @param componentAdapterFactory ComponentAdapterFactory
071 * @param lifecycleStrategyForInstanceRegistrations LifecycleStrategy
072 * @param parent PicoContainer may be null if there is no parent.
073 * @param cl the Classloader to use. May be null, in which case DefaultNanoPicoContainer.class.getClassLoader()
074 * will be called instead.
075 */
076 public DefaultNanoPicoContainer(ComponentAdapterFactory componentAdapterFactory,
077 LifecycleStrategy lifecycleStrategyForInstanceRegistrations, PicoContainer parent, ClassLoader cl) {
078
079 super(new DefaultPicoContainer(componentAdapterFactory,
080 lifecycleStrategyForInstanceRegistrations, parent),
081 //Use a default classloader if none is specified.
082 (cl != null) ? cl : DefaultNanoPicoContainer.class.getClassLoader());
083 }
084
085 /**
086 * Copy Constructor. Makes a new DefaultNanoPicoContainer with the same
087 * attributes - ClassLoader, child PicoContainer type, ComponentAdapterFactory -
088 * as the parent.
089 * <p><tt>Note:</tt> This constructor is protected because are existing scripts
090 * that call <tt>new DefaultNanoPicoContainer(PicoContainer)</tt>, and they get this
091 * constructor instead (which has different behavior).</p>
092 * @param parent The object to copy.
093 */
094 protected DefaultNanoPicoContainer(final DefaultNanoPicoContainer parent) {
095 super(parent.getDelegate().makeChildContainer(), parent.getComponentClassLoader());
096 MutablePicoContainer parentDelegate = parent.getDelegate();
097 parentDelegate.removeChildContainer(getDelegate());
098 parentDelegate.addChildContainer(this);
099 }
100
101
102 protected AbstractNanoPicoContainer createChildContainer() {
103 return new DefaultNanoPicoContainer(this);
104 }
105
106 public void changeMonitor(ComponentMonitor monitor) {
107 ((ComponentMonitorStrategy)getDelegate()).changeMonitor(monitor);
108 }
109
110 public ComponentMonitor currentMonitor() {
111 return ((ComponentMonitorStrategy)getDelegate()).currentMonitor();
112 }
113
114 }