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     * Idea by Rachel Davies, Original code by Stacy Curl                        *
009     *****************************************************************************/
010    
011    package org.picocontainer.injectors;
012    
013    import org.picocontainer.ComponentAdapter;
014    import org.picocontainer.Parameter;
015    import org.picocontainer.PicoCompositionException;
016    import org.picocontainer.Characteristics;
017    import org.picocontainer.lifecycle.NullLifecycleStrategy;
018    import org.picocontainer.lifecycle.ReflectionLifecycleStrategy;
019    import org.picocontainer.monitors.NullComponentMonitor;
020    import org.picocontainer.monitors.ConsoleComponentMonitor;
021    import org.picocontainer.ComponentFactory;
022    import org.picocontainer.DefaultPicoContainer;
023    import org.picocontainer.injectors.AdaptiveInjection;
024    import org.picocontainer.injectors.AnnotatedMethodInjectorTestCase;
025    import org.picocontainer.injectors.AnnotatedMethodInjector;
026    import org.picocontainer.injectors.AnnotatedFieldInjector;
027    import org.picocontainer.injectors.ConstructorInjector;
028    import org.picocontainer.tck.AbstractComponentFactoryTestCase;
029    import org.picocontainer.testmodel.SimpleTouchable;
030    import org.picocontainer.testmodel.Touchable;
031    
032    import java.util.Map;
033    import java.util.HashMap;
034    import java.util.Properties;
035    
036    import com.thoughtworks.xstream.XStream;
037    import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
038    import com.thoughtworks.xstream.io.HierarchicalStreamReader;
039    import com.thoughtworks.xstream.converters.Converter;
040    import com.thoughtworks.xstream.converters.MarshallingContext;
041    import com.thoughtworks.xstream.converters.UnmarshallingContext;
042    
043    public class AdaptiveInjectionTestCase extends AbstractComponentFactoryTestCase {
044    
045        XStream xs;
046    
047        protected void setUp() throws Exception {
048            super.setUp();
049            xs = new XStream();
050            xs.alias("RLS", ReflectionLifecycleStrategy.class);
051            xs.alias("CCM", ConsoleComponentMonitor.class);
052            xs.alias("Method-Injection", AnnotatedMethodInjector.class);
053            xs.alias("Field-Injection", AnnotatedFieldInjector.class);
054            xs.alias("Constructor-Injection", ConstructorInjector.class);
055            //xs.alias("CCM", ConsoleComponentMonitor.class);
056            xs.registerConverter(new Converter() {
057                public boolean canConvert(Class aClass) {
058                    return aClass.getName().equals("org.picocontainer.monitors.ConsoleComponentMonitor") ||
059                           aClass.getName().equals("org.picocontainer.lifecycle.ReflectionLifecycleStrategy");
060    
061                }
062    
063                public void marshal(Object object,
064                                    HierarchicalStreamWriter hierarchicalStreamWriter,
065                                    MarshallingContext marshallingContext)
066                {
067                }
068    
069                public Object unmarshal(HierarchicalStreamReader hierarchicalStreamReader,
070                                        UnmarshallingContext unmarshallingContext)
071                {
072                    return null;
073                }
074            });
075    
076        }
077    
078        protected ComponentFactory createComponentFactory() {
079            return new AdaptiveInjection();
080        }
081    
082        public void testInstantiateComponentWithNoDependencies() throws PicoCompositionException {
083            ComponentAdapter componentAdapter =
084                createComponentFactory().createComponentAdapter(new NullComponentMonitor(),
085                                                                new NullLifecycleStrategy(),
086                                                                new Properties(Characteristics.CDI),
087                                                                Touchable.class,
088                                                                SimpleTouchable.class,
089                                                                (Parameter[])null);
090    
091            Object comp = componentAdapter.getComponentInstance(new DefaultPicoContainer());
092            assertNotNull(comp);
093            assertTrue(comp instanceof SimpleTouchable);
094        }
095    
096        public void testSingleUsecanBeInstantiatedByDefaultComponentAdapter() {
097            ComponentAdapter componentAdapter = createComponentFactory().createComponentAdapter(new NullComponentMonitor(),
098                                                                                                new NullLifecycleStrategy(),
099                                                                                                new Properties(
100                                                                                                    Characteristics.CDI),
101                                                                                                "o",
102                                                                                                Object.class,
103                                                                                                (Parameter[])null);
104            Object component = componentAdapter.getComponentInstance(new DefaultPicoContainer());
105            assertNotNull(component);
106        }
107    
108    
109        public void testFactoryMakesConstructorInjector() {
110    
111            ComponentFactory cf = createComponentFactory();
112    
113            ConsoleComponentMonitor cm = new ConsoleComponentMonitor();
114            ComponentAdapter ca = cf.createComponentAdapter(cm, new ReflectionLifecycleStrategy(cm), new Properties(),
115                                                            Map.class, HashMap.class, Parameter.DEFAULT);
116    
117            String foo = xs.toXML(ca).replace("\"", "");
118    
119            assertEquals("<Constructor-Injection>\n" +
120                         "  <lifecycleStrategy class=RLS/>\n" +
121                         "  <componentKey class=java-class>java.util.Map</componentKey>\n" +
122                         "  <componentImplementation>java.util.HashMap</componentImplementation>\n" +
123                         "  <componentMonitor class=CCM/>\n" +
124                         "</Constructor-Injection>", foo);
125    
126    
127        }
128    
129        public void testFactoryMakesFieldAnnotationInjector() {
130    
131            ComponentFactory cf = createComponentFactory();
132    
133            ConsoleComponentMonitor cm = new ConsoleComponentMonitor();
134            ComponentAdapter ca = cf.createComponentAdapter(cm,
135                                                            new ReflectionLifecycleStrategy(cm),
136                                                            new Properties(),
137                                                            AnnotatedFieldInjectorTestCase.Helicopter.class,
138                                                            AnnotatedFieldInjectorTestCase.Helicopter.class,
139                                                            Parameter.DEFAULT);
140    
141            String foo = xs.toXML(ca).replace("\"", "");
142    
143            assertEquals("<Field-Injection>\n" +
144                         "  <injectionAnnotation>org.picocontainer.annotations.Inject</injectionAnnotation>\n" +
145                         "  <lifecycleStrategy class=RLS/>\n" +
146                         "  <componentKey class=java-class>org.picocontainer.injectors.AnnotatedFieldInjectorTestCase$Helicopter</componentKey>\n" +
147                         "  <componentImplementation>org.picocontainer.injectors.AnnotatedFieldInjectorTestCase$Helicopter</componentImplementation>\n" +
148                         "  <componentMonitor class=CCM/>\n" +
149                         "</Field-Injection>", foo);
150    
151    
152        }
153    
154        public void testFactoryMakesMethodAnnotationInjector() {
155    
156            ComponentFactory cf = createComponentFactory();
157    
158            ConsoleComponentMonitor cm = new ConsoleComponentMonitor();
159            ComponentAdapter ca = cf.createComponentAdapter(cm,
160                                                            new ReflectionLifecycleStrategy(cm),
161                                                            new Properties(),
162                                                            AnnotatedMethodInjectorTestCase.AnnotatedBurp.class,
163                                                            AnnotatedMethodInjectorTestCase.AnnotatedBurp.class,
164                                                            Parameter.DEFAULT);
165    
166            String foo = xs.toXML(ca).replace("\"", "");
167    
168            assertEquals("<Method-Injection>\n" +
169                         "  <injectionAnnotation>org.picocontainer.annotations.Inject</injectionAnnotation>\n" +
170                         "  <setterMethodPrefix></setterMethodPrefix>\n" +
171                         "  <lifecycleStrategy class=RLS/>\n" +
172                         "  <componentKey class=java-class>org.picocontainer.injectors.AnnotatedMethodInjectorTestCase$AnnotatedBurp</componentKey>\n" +
173                         "  <componentImplementation>org.picocontainer.injectors.AnnotatedMethodInjectorTestCase$AnnotatedBurp</componentImplementation>\n" +
174                         "  <componentMonitor class=CCM/>\n" +
175                         "</Method-Injection>", foo);
176    
177    
178        }
179    
180    
181    }