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
015 import org.nanocontainer.NanoPicoContainer;
016 import org.picocontainer.MutablePicoContainer;
017 import org.picocontainer.PicoContainer;
018 import org.picocontainer.alternatives.ImplementationHidingPicoContainer;
019 import org.picocontainer.defaults.ComponentAdapterFactory;
020 import org.picocontainer.defaults.DefaultComponentAdapterFactory;
021
022 /**
023 * This is a MutablePicoContainer that supports soft composition and hides implementations where it can.
024 * <p/>
025 * In terms of implementation it adopts the behaviour of ImplementationHidingPicoContainer
026 * and DefaulNanoContainer
027 *
028 * @author Paul Hammant
029 * @author Michael Rimov
030 * @version $Revision: 2964 $
031 */
032 public class ImplementationHidingNanoPicoContainer extends AbstractNanoPicoContainer implements NanoPicoContainer, Serializable {
033
034 public ImplementationHidingNanoPicoContainer(ClassLoader classLoader, ComponentAdapterFactory caf, PicoContainer parent) {
035 super(new ImplementationHidingPicoContainer(caf, parent), classLoader);
036 }
037
038
039 public ImplementationHidingNanoPicoContainer(ClassLoader classLoader, PicoContainer parent) {
040 super(new ImplementationHidingPicoContainer(new DefaultComponentAdapterFactory(), parent), classLoader);
041 }
042
043 public ImplementationHidingNanoPicoContainer(PicoContainer pc) {
044 this(ImplementationHidingNanoPicoContainer.class.getClassLoader(), pc);
045 }
046
047 public ImplementationHidingNanoPicoContainer(ClassLoader classLoader) {
048 this(classLoader, null);
049 }
050
051 public ImplementationHidingNanoPicoContainer() {
052 this(ImplementationHidingNanoPicoContainer.class.getClassLoader(), null);
053 }
054
055 /**
056 * Copy Constructor. Makes a new ImplementationHidingNanoPicoContainer with the same
057 * attributes - ClassLoader, child PicoContainer type, ComponentAdapterFactory -
058 * as the parent.
059 * <p><tt>Note:</tt> This constructor is protected because are existing scripts
060 * that call <tt>new ImplementationHidingNanoPicoContainer(PicoContainer)</tt>, and they get this
061 * constructor instead (which has different behavior).</p>
062 * @param parent ImplementationHidingNanoPicoContainer
063 */
064 protected ImplementationHidingNanoPicoContainer(final ImplementationHidingNanoPicoContainer parent) {
065 super(parent.getDelegate().makeChildContainer(), parent.getComponentClassLoader());
066 }
067
068
069 protected AbstractNanoPicoContainer createChildContainer() {
070 return new ImplementationHidingNanoPicoContainer(this);
071 }
072 }