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    }