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                                                          *
009 *****************************************************************************/
010package org.picocontainer.containers;
011
012import org.picocontainer.*;
013import org.picocontainer.converters.ConvertsNothing;
014
015import java.util.List;
016import java.util.Collection;
017import java.io.Serializable;
018import java.lang.annotation.Annotation;
019import java.lang.reflect.Type;
020
021/**
022* wrap pico container to achieve immutability
023 * Typically its used to mock a parent container.
024 *
025 * @author Konstantin Pribluda
026 */
027@SuppressWarnings("serial")
028public final class ImmutablePicoContainer implements PicoContainer, Converting, Serializable {
029
030    private final PicoContainer delegate;
031
032    public ImmutablePicoContainer(PicoContainer delegate) {
033        if (delegate == null) {
034            throw new NullPointerException();
035        }
036        this.delegate = delegate;
037    }
038
039    public Object getComponent(Object componentKeyOrType) {
040        return delegate.getComponent(componentKeyOrType);
041    }
042
043    public Object getComponent(Object componentKeyOrType, Type into) {
044        return delegate.getComponent(componentKeyOrType, into);
045    }
046
047    public <T> T getComponent(Class<T> componentType) {
048        return delegate.getComponent(componentType);
049    }
050
051    public <T> T getComponent(Class<T> componentType, Class<? extends Annotation> binding) {
052        return delegate.getComponent(componentType, binding);
053    }
054
055    public List getComponents() {
056        return delegate.getComponents();
057    }
058
059    public PicoContainer getParent() {
060        return delegate.getParent();
061    }
062
063    public ComponentAdapter<?> getComponentAdapter(Object componentKey) {
064        return delegate.getComponentAdapter(componentKey);
065    }
066
067    public <T> ComponentAdapter<T> getComponentAdapter(Class<T> componentType, NameBinding componentNameBinding) {
068        return delegate.getComponentAdapter(componentType, componentNameBinding);
069    }
070
071    public <T> ComponentAdapter<T> getComponentAdapter(Class<T> componentType, Class<? extends Annotation> binding) {
072        return delegate.getComponentAdapter(componentType, binding);
073    }
074
075    public Collection<ComponentAdapter<?>> getComponentAdapters() {
076        return delegate.getComponentAdapters();
077    }
078
079    public <T> List<ComponentAdapter<T>> getComponentAdapters(Class<T> componentType) {
080        return delegate.getComponentAdapters(componentType);
081    }
082
083    public <T> List<ComponentAdapter<T>> getComponentAdapters(Class<T> componentType, Class<? extends Annotation> binding) {
084        return delegate.getComponentAdapters(componentType, binding);
085    }
086
087    public <T> List<T> getComponents(Class<T> componentType) {
088        return delegate.getComponents(componentType);
089    }
090
091    public final void accept(PicoVisitor visitor) {
092        // don't visit "this" its pointless.
093        delegate.accept(visitor);
094    }
095
096    public boolean equals(Object obj) {
097        return obj == this
098               || (obj != null && obj == delegate)
099               || (obj instanceof ImmutablePicoContainer && ((ImmutablePicoContainer) obj).delegate == delegate)
100            ;
101    }
102
103    public int hashCode() {
104        return delegate.hashCode();
105    }
106
107    public String toString() {
108        return "[Immutable]:" + delegate.toString();
109    }
110
111    public Converters getConverters() {
112        if (delegate instanceof Converting) {
113            return ((Converting) delegate).getConverters();
114        }
115        return new ConvertsNothing();
116    }
117}