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     * Original code by Aslak Hellesoy and Paul Hammant                          *
009     *****************************************************************************/
010    package org.picocontainer.script.xml;
011    
012    import static org.junit.Assert.assertEquals;
013    import static org.junit.Assert.assertNotNull;
014    import static org.junit.Assert.assertNull;
015    import static org.junit.Assert.assertSame;
016    
017    import java.io.Reader;
018    import java.io.StringReader;
019    
020    import org.junit.Test;
021    import org.picocontainer.script.AbstractScriptedContainerBuilderTestCase;
022    import org.picocontainer.script.testmodel.DefaultWebServerConfig;
023    import org.picocontainer.script.testmodel.ThingThatTakesParamsInConstructor;
024    import org.picocontainer.script.testmodel.WebServerImpl;
025    import org.picocontainer.script.xml.XStreamContainerBuilder;
026    import org.picocontainer.ComponentAdapter;
027    import org.picocontainer.MutablePicoContainer;
028    import org.picocontainer.NameBinding;
029    import org.picocontainer.PicoBuilder;
030    import org.picocontainer.PicoContainer;
031    import org.picocontainer.behaviors.AbstractBehavior;
032    import org.picocontainer.behaviors.Cached;
033    import org.picocontainer.behaviors.Locked;
034    
035    public class XStreamContainerBuilderTestCase extends AbstractScriptedContainerBuilderTestCase {
036    
037        @Test public void testContainerBuilding() {
038    
039            Reader script = new StringReader("" +
040                    "<container>" +
041                    "    <instance key='foo'>" +
042                    "       <string>foo bar</string>" +
043                    "    </instance>" +
044                    "    <instance key='bar'>" +
045                    "       <int>239</int>" +
046                    "    </instance>" +
047                    "    <instance>" +
048                    "       <org.picocontainer.script.testmodel.DefaultWebServerConfig>" +
049                    "                       <port>555</port>" +
050                    "       </org.picocontainer.script.testmodel.DefaultWebServerConfig>" +
051                    "    </instance>" +
052                    "        <implementation class='org.picocontainer.script.testmodel.WebServerImpl'>" +
053                    "               <dependency class='org.picocontainer.script.testmodel.DefaultWebServerConfig'/>" +
054                    "        </implementation>" +
055                    "        <implementation key='konstantin needs beer' class='org.picocontainer.script.testmodel.ThingThatTakesParamsInConstructor'>" +
056                    "               <constant>" +
057                    "                       <string>it's really late</string>" +
058                    "               </constant>" +
059                    "               <constant>" +
060                    "                       <int>239</int>" +
061                    "               </constant>" +
062                    "        </implementation>" +
063                    "</container>");
064    
065            PicoContainer pico = buildContainer(new XStreamContainerBuilder(script, getClass().getClassLoader()), null, "SOME_SCOPE");
066            assertEquals(5, pico.getComponents().size());
067            assertEquals("foo bar", pico.getComponent("foo"));
068            assertEquals(239, pico.getComponent("bar"));
069            assertEquals(555, pico.getComponent(DefaultWebServerConfig.class).getPort());
070    
071            assertNotNull(pico.getComponent(WebServerImpl.class));
072            assertNotNull(pico.getComponent(ThingThatTakesParamsInConstructor.class));
073            final Object o = pico.getComponent("konstantin needs beer");
074            final ThingThatTakesParamsInConstructor o2 = pico.getComponent(ThingThatTakesParamsInConstructor.class);
075            assertSame(o, o2);
076            assertEquals("it's really late239", ((ThingThatTakesParamsInConstructor) pico.getComponent("konstantin needs beer")).getValue());
077        }
078    
079        @Test public void testComponentAdapterInjection() throws Throwable {
080            Reader script = new StringReader("<container>" +
081                    "<adapter key='testAdapter'>" +
082                    "<instance key='firstString'>" +
083                    "<string>bla bla</string>" +
084                    "</instance>" +
085                    "<instance key='secondString' >" +
086                    "<string>glarch</string>" +
087                    "</instance>" +
088                    "<instance key='justInt'>" +
089                    "<int>777</int>" +
090                    "</instance>" +
091                    "<implementation key='testAdapter' class='org.picocontainer.script.xml.TestAdapter'>" +
092                    "<dependency key='firstString'/>" +
093                    "<dependency key='justInt'/>" +
094                    "<dependency key='secondString'/>" +
095                    "</implementation>" +
096                    "</adapter>" +
097                    "</container>");
098    
099            PicoContainer pico = buildContainer(new XStreamContainerBuilder(script, getClass().getClassLoader()), null, "SOME_SCOPE");
100            Cached<TestAdapter> ca = (Cached<TestAdapter>) pico.getComponentAdapter(TestAdapter.class, (NameBinding) null);
101    
102            assertNotNull((TestAdapter)ca.getDelegate());
103        }
104    
105        @Test public void testInstantiationOfComponentsWithInstancesOfSameComponent() throws Exception {
106            Reader script = new StringReader("" +
107                    "<container>" +
108                    "  <instance key='bean1'>" +
109                    "       <org.picocontainer.script.xml.TestBean>" +
110                    "               <foo>10</foo>" +
111                    "               <bar>hello1</bar>" +
112                    "       </org.picocontainer.script.xml.TestBean>" +
113                    "  </instance>" +
114                    "  <instance key='bean2'>" +
115                    "       <org.picocontainer.script.xml.TestBean>" +
116                    "               <foo>10</foo>" +
117                    "               <bar>hello2</bar>" +
118                    "       </org.picocontainer.script.xml.TestBean>" +
119                    "  </instance>" +
120                    "  <implementation class='org.picocontainer.script.xml.TestBeanComposer'>" +
121                    "               <dependency key='bean1'/>" +
122                    "               <dependency key='bean2'/>" +
123                    "  </implementation>" +
124                    "</container>");
125            PicoContainer pico = buildContainer(new XStreamContainerBuilder(script, getClass().getClassLoader()), null, "SOME_SCOPE");
126            assertNotNull(pico.getComponent(TestBeanComposer.class));
127            TestBeanComposer composer = pico.getComponent(TestBeanComposer.class);
128            assertEquals("bean1", "hello1", composer.getBean1().getBar());
129            assertEquals("bean2", "hello2", composer.getBean2().getBar());
130        }
131        
132        // do not know how to extract parameters off adapter....
133        @Test public void testThatDependencyUsesClassAsKey() {
134            Reader script = new StringReader("" +
135            "<container>" +                                          
136            "   <implementation class='java.lang.String'/>" +
137            "   <implementation key='foo' class='org.picocontainer.script.xml.TestBean'>" +
138            "       <dependency class='java.lang.String'/>" +
139            "   </implementation>" + 
140            "</container>"
141            );
142            
143            PicoContainer pico = buildContainer(new XStreamContainerBuilder(script, getClass().getClassLoader()), null,
144                    null);
145            ComponentAdapter<?> componentAdapter = pico.getComponentAdapter("foo");
146            AbstractBehavior<?> adapter = (AbstractBehavior<?>) componentAdapter;
147            assertNotNull(adapter);
148        }
149        
150        
151        @Test public void testDefaultContsructorRegistration() throws Exception {
152            
153            Reader script = new StringReader(
154            "<container>" + 
155            "   <implementation class='org.picocontainer.script.xml.TestBean' constructor='default'/>" +
156            "   <instance>" + 
157            "       <string>blurge</string>" + 
158            "   </instance>" + 
159            "</container>"
160             );  
161            
162            
163            PicoContainer pico = buildContainer(new XStreamContainerBuilder(script, getClass().getClassLoader()), null,null);
164            TestBean bean = pico.getComponent(TestBean.class);
165            assertEquals("default",bean.getConstructorCalled());
166        }
167        
168        
169        @Test
170        public void testInheritanceOfBehaviorsFromParentContainer() {
171            Reader comparison = new StringReader("" +
172                            "<container inheritBehaviors=\"false\">\n" +
173                    "  <implementation class='org.picocontainer.script.testmodel.DefaultWebServerConfig'/>" +
174                    "</container>"
175                    );      
176    
177            MutablePicoContainer parent = new PicoBuilder().withLocking().build();
178            PicoContainer comparisonPico = buildContainer(new XStreamContainerBuilder(comparison, getClass().getClassLoader()), parent, "SOME_SCOPE");
179            //Verify not locking by default
180            //assertTrue(comparisonPico.getComponent(DefaultWebServerConfig.class) != comparisonPico.getComponent(DefaultWebServerConfig.class));
181            assertNull(comparisonPico.getComponentAdapter(DefaultWebServerConfig.class).findAdapterOfType(Locked.class));
182            
183            //Verify parent caching propagates to child.
184            Reader script = new StringReader("" +
185                    "<container inheritBehaviors=\"true\">\n" +
186                "  <implementation class='org.picocontainer.script.testmodel.DefaultWebServerConfig'/>" +
187                "</container>"
188            );
189            
190            parent = new PicoBuilder().withLocking().build();
191            PicoContainer pico = buildContainer(new XStreamContainerBuilder(script, getClass().getClassLoader()), parent, "SOME_SCOPE");
192            
193            assertNotNull(pico.getComponentAdapter(DefaultWebServerConfig.class).findAdapterOfType(Locked.class));
194        }
195        
196        @Test
197        public void testParameterZero() {
198            Reader script = new StringReader("" + 
199                    "<container>\n" +
200                                    "<implementation key='java.util.List' class='java.util.ArrayList'> \n" +  
201                                    "    <parameter-zero/>\n" +
202                                    "</implementation> \n" +
203                                    "<implementation key='java.util.Set' class='java.util.HashSet'> \n" +
204                                    "    <parameter-zero/>\n" +
205                                    "</implementation>\n" +
206                    "</container>\n"
207            );
208            PicoContainer pico = buildContainer(new XStreamContainerBuilder(script, getClass().getClassLoader()), null, "SOME_SCOPE");      
209            assertNotNull(pico.getComponent(java.util.List.class));
210            assertNotNull(pico.getComponent(java.util.Set.class));
211        }
212        
213        
214    }
215