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