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 }