001 /***************************************************************************** 002 * Copyright (C) PicoContainer 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 the committers * 009 *****************************************************************************/ 010 package org.picocontainer.alternatives; 011 012 import java.io.Serializable; 013 014 import org.picocontainer.MutablePicoContainer; 015 import org.picocontainer.PicoContainer; 016 import org.picocontainer.defaults.CachingComponentAdapterFactory; 017 import org.picocontainer.defaults.ComponentAdapterFactory; 018 import org.picocontainer.defaults.ConstructorInjectionComponentAdapterFactory; 019 import org.picocontainer.defaults.DefaultPicoContainer; 020 021 /** 022 * The Caching version of {@link org.picocontainer.defaults.DefaultPicoContainer} 023 * 024 * @see ImplementationHidingCachingPicoContainer 025 * @see ImplementationHidingPicoContainer 026 * @author Paul Hammant 027 * @version $Revision: 2381 $ 028 */ 029 public class CachingPicoContainer extends AbstractDelegatingMutablePicoContainer implements Serializable { 030 private final ComponentAdapterFactory caf; 031 032 /** 033 * Creates a new container with a parent container. 034 */ 035 public CachingPicoContainer(ComponentAdapterFactory caf, PicoContainer parent) { 036 super(new DefaultPicoContainer(makeComponentAdapterFactory(caf), parent)); 037 this.caf = caf; 038 } 039 040 private static CachingComponentAdapterFactory makeComponentAdapterFactory(ComponentAdapterFactory caf) { 041 if (caf instanceof CachingComponentAdapterFactory) { 042 return (CachingComponentAdapterFactory) caf; 043 } 044 return new CachingComponentAdapterFactory(caf); 045 } 046 047 /** 048 * Creates a new container with a parent container. 049 */ 050 public CachingPicoContainer(PicoContainer parent) { 051 this(makeComponentAdapterFactory(new ConstructorInjectionComponentAdapterFactory()), parent); 052 } 053 054 /** 055 * Creates a new container with a parent container. 056 */ 057 public CachingPicoContainer(ComponentAdapterFactory caf) { 058 this(makeComponentAdapterFactory(caf), null); 059 } 060 061 062 /** 063 * Creates a new container with no parent container. 064 */ 065 public CachingPicoContainer() { 066 this((PicoContainer) null); 067 } 068 069 070 public MutablePicoContainer makeChildContainer() { 071 CachingPicoContainer pc = new CachingPicoContainer(caf, this); 072 getDelegate().addChildContainer(pc); 073 return pc; 074 } 075 076 }