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.containers;
011    
012    import org.picocontainer.ComponentAdapter;
013    import org.picocontainer.MutablePicoContainer;
014    import org.picocontainer.Parameter;
015    import org.picocontainer.PicoContainer;
016    import org.picocontainer.PicoException;
017    import org.picocontainer.PicoVisitor;
018    import org.picocontainer.PicoCompositionException;
019    import org.picocontainer.ParameterName;
020    
021    import java.io.Serializable;
022    import java.util.Collection;
023    import java.util.List;
024    import java.util.Properties;
025    
026    /**
027     * @author Paul Hammant
028     */
029    public abstract class AbstractDelegatingMutablePicoContainer implements MutablePicoContainer, Serializable {
030    
031        private MutablePicoContainer delegate;
032    
033        public AbstractDelegatingMutablePicoContainer(MutablePicoContainer delegate) {
034            if (delegate == null) {
035                throw new NullPointerException("MutablePicoContainer delegate must not be null");
036            }
037            this.delegate = delegate;
038        }
039    
040        protected MutablePicoContainer getDelegate() {
041            return delegate;
042        }
043    
044        public MutablePicoContainer addComponent(Object componentKey,
045                                                 Object componentImplementationOrInstance,
046                                                 Parameter... parameters) throws PicoCompositionException {
047            return delegate.addComponent(componentKey, componentImplementationOrInstance, parameters);
048        }
049    
050        public MutablePicoContainer addComponent(Object implOrInstance) throws PicoCompositionException {
051            return delegate.addComponent(implOrInstance);
052        }
053    
054        public MutablePicoContainer addConfig(String name, Object val) {
055            return delegate.addConfig(name, val); 
056        }
057    
058        public MutablePicoContainer addAdapter(ComponentAdapter componentAdapter) throws PicoCompositionException {
059            return delegate.addAdapter(componentAdapter);
060        }
061    
062        public ComponentAdapter removeComponent(Object componentKey) {
063            return delegate.removeComponent(componentKey);
064        }
065    
066        public ComponentAdapter removeComponentByInstance(Object componentInstance) {
067            return delegate.removeComponentByInstance(componentInstance);
068        }
069    
070        public Object getComponent(Object componentKeyOrType) {
071            return delegate.getComponent(componentKeyOrType);
072        }
073    
074        public <T> T getComponent(Class<T> componentType) {
075            return componentType.cast(getComponent((Object)componentType));
076        }
077    
078        public List getComponents() {
079            return delegate.getComponents();
080        }
081    
082        public PicoContainer getParent() {
083            return delegate.getParent();
084        }
085    
086        public ComponentAdapter<?> getComponentAdapter(Object componentKey) {
087            return delegate.getComponentAdapter(componentKey);
088        }
089    
090        public <T> ComponentAdapter<T> getComponentAdapter(Class<T> componentType, ParameterName componentParameterName) {
091            return delegate.getComponentAdapter(componentType, componentParameterName);
092        }
093    
094        public Collection<ComponentAdapter<?>> getComponentAdapters() {
095            return delegate.getComponentAdapters();
096        }
097    
098        public <T> List<ComponentAdapter<T>> getComponentAdapters(Class<T> componentType) {
099            return delegate.getComponentAdapters(componentType);
100        }
101    
102        public void start() {
103            delegate.start();
104        }
105    
106        public void stop() {
107            delegate.stop();
108        }
109    
110        public void dispose() {
111            delegate.dispose();
112        }
113    
114        public MutablePicoContainer addChildContainer(PicoContainer child) {
115            return delegate.addChildContainer(child);
116        }
117    
118        public boolean removeChildContainer(PicoContainer child) {
119            return delegate.removeChildContainer(child);
120        }
121    
122        public void accept(PicoVisitor visitor) {
123            delegate.accept(visitor);
124        }
125    
126        public <T> List<T> getComponents(Class<T> type) throws PicoException {
127            return delegate.getComponents(type);
128        }
129    
130        public boolean equals(Object obj) {
131            // required to make it pass on both jdk 1.3 and jdk 1.4. Btw, what about overriding hashCode()? (AH)
132            return delegate.equals(obj) || this == obj;
133        }
134    
135        public MutablePicoContainer change(Properties... properties) {
136            return delegate.change(properties);
137        }
138    
139        public MutablePicoContainer as(Properties... properties) {
140            return delegate.as(properties);
141        }
142    }