001 package org.picocontainer.injectors;
002
003 import org.picocontainer.ComponentAdapter;
004 import org.picocontainer.ComponentMonitor;
005 import org.picocontainer.ComponentMonitorStrategy;
006 import org.picocontainer.InjectionFactory;
007 import org.picocontainer.Injector;
008 import org.picocontainer.LifecycleStrategy;
009 import org.picocontainer.PicoCompositionException;
010 import org.picocontainer.PicoContainer;
011 import org.picocontainer.PicoVisitor;
012 import org.picocontainer.lifecycle.NullLifecycleStrategy;
013
014 import java.io.Serializable;
015 import java.lang.reflect.Type;
016
017 public abstract class AbstractInjectionFactory implements InjectionFactory, Serializable {
018
019 public void verify(PicoContainer container) {
020 }
021
022 public final void accept(PicoVisitor visitor) {
023 visitor.visitComponentFactory(this);
024 }
025
026 protected ComponentAdapter wrapLifeCycle(final Injector injector, LifecycleStrategy lifecycleStrategy) {
027 if (lifecycleStrategy instanceof NullLifecycleStrategy) {
028 return injector;
029 } else {
030 return new LifecycleAdapter(injector, lifecycleStrategy);
031 }
032 }
033
034 private static class LifecycleAdapter implements Injector, LifecycleStrategy, ComponentMonitorStrategy, Serializable {
035 private final Injector delegate;
036 private final LifecycleStrategy lifecycleStrategy;
037
038 public LifecycleAdapter(Injector delegate, LifecycleStrategy lifecycleStrategy) {
039 this.delegate = delegate;
040 this.lifecycleStrategy = lifecycleStrategy;
041 }
042
043 public Object getComponentKey() {
044 return delegate.getComponentKey();
045 }
046
047 public Class getComponentImplementation() {
048 return delegate.getComponentImplementation();
049 }
050
051 public Object getComponentInstance(PicoContainer container) throws PicoCompositionException {
052 return delegate.getComponentInstance(container);
053 }
054
055 public Object getComponentInstance(PicoContainer container, Type into) throws PicoCompositionException {
056 return delegate.getComponentInstance(container, into);
057 }
058
059 public void verify(PicoContainer container) throws PicoCompositionException {
060 delegate.verify(container);
061 }
062
063 public void accept(PicoVisitor visitor) {
064 delegate.accept(visitor);
065 }
066
067 public ComponentAdapter getDelegate() {
068 return delegate;
069 }
070
071 public ComponentAdapter findAdapterOfType(Class adapterType) {
072 return delegate.findAdapterOfType(adapterType);
073 }
074
075 public String getDescriptor() {
076 return "LifecycleAdapter";
077 }
078
079 public String toString() {
080 return getDescriptor() + ":" + delegate.toString();
081 }
082
083 public void start(Object component) {
084 lifecycleStrategy.start(component);
085 }
086
087 public void stop(Object component) {
088 lifecycleStrategy.stop(component);
089 }
090
091 public void dispose(Object component) {
092 lifecycleStrategy.dispose(component);
093 }
094
095 public boolean hasLifecycle(Class<?> type) {
096 return lifecycleStrategy.hasLifecycle(type);
097 }
098
099 public boolean isLazy(ComponentAdapter<?> adapter) {
100 return lifecycleStrategy.isLazy(adapter);
101 }
102
103 public void changeMonitor(ComponentMonitor monitor) {
104 if (delegate instanceof ComponentMonitorStrategy) {
105 ((ComponentMonitorStrategy) delegate).changeMonitor(monitor);
106 }
107 }
108
109 public ComponentMonitor currentMonitor() {
110 if (delegate instanceof ComponentMonitorStrategy) {
111 return ((ComponentMonitorStrategy) delegate).currentMonitor();
112 }
113 return null;
114 }
115
116 public Object decorateComponentInstance(PicoContainer container, Type into, Object instance) {
117 return delegate.decorateComponentInstance(container, into, instance);
118 }
119 }
120 }