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 *****************************************************************************/
010 package org.picocontainer.containers;
011
012 import org.picocontainer.*;
013 import org.picocontainer.converters.ConvertsNothing;
014
015 import java.util.List;
016 import java.util.Collection;
017 import java.io.Serializable;
018 import java.lang.annotation.Annotation;
019 import 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")
028 public 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 "I<" + 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 }