001package org.picocontainer.injectors;
002
003import org.picocontainer.ComponentAdapter;
004import org.picocontainer.ComponentMonitor;
005import org.picocontainer.ComponentMonitorStrategy;
006import org.picocontainer.InjectionFactory;
007import org.picocontainer.Injector;
008import org.picocontainer.LifecycleStrategy;
009import org.picocontainer.PicoCompositionException;
010import org.picocontainer.PicoContainer;
011import org.picocontainer.PicoVisitor;
012import org.picocontainer.lifecycle.NullLifecycleStrategy;
013
014import java.io.Serializable;
015import java.lang.reflect.Type;
016
017public 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}