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