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 }