001 /*****************************************************************************
002 * Copyright (C) NanoContainer 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.nanocontainer.script.xml;
011
012 import org.nanocontainer.script.AbstractScriptedContainerBuilderTestCase;
013 import org.nanocontainer.testmodel.DefaultWebServerConfig;
014 import org.nanocontainer.testmodel.ThingThatTakesParamsInConstructor;
015 import org.nanocontainer.testmodel.WebServerImpl;
016 import org.picocontainer.PicoContainer;
017 import org.picocontainer.defaults.DecoratingComponentAdapter;
018
019 import java.io.Reader;
020 import java.io.StringReader;
021
022 public class XStreamContainerBuilderTestCase extends AbstractScriptedContainerBuilderTestCase {
023
024 public void testContainerBuilding() {
025
026 Reader script = new StringReader("" +
027 "<container>" +
028 " <instance key='foo'>" +
029 " <string>foo bar</string>" +
030 " </instance>" +
031 " <instance key='bar'>" +
032 " <int>239</int>" +
033 " </instance>" +
034 " <instance>" +
035 " <org.nanocontainer.testmodel.DefaultWebServerConfig>" +
036 " <port>555</port>" +
037 " </org.nanocontainer.testmodel.DefaultWebServerConfig>" +
038 " </instance>" +
039 " <implementation class='org.nanocontainer.testmodel.WebServerImpl'>" +
040 " <dependency class='org.nanocontainer.testmodel.DefaultWebServerConfig'/>" +
041 " </implementation>" +
042 " <implementation key='konstantin needs beer' class='org.nanocontainer.testmodel.ThingThatTakesParamsInConstructor'>" +
043 " <constant>" +
044 " <string>it's really late</string>" +
045 " </constant>" +
046 " <constant>" +
047 " <int>239</int>" +
048 " </constant>" +
049 " </implementation>" +
050 "</container>");
051
052 PicoContainer pico = buildContainer(new XStreamContainerBuilder(script, getClass().getClassLoader()), null, "SOME_SCOPE");
053 assertEquals(5, pico.getComponentInstances().size());
054 assertEquals("foo bar", pico.getComponentInstance("foo"));
055 assertEquals(new Integer(239), pico.getComponentInstance("bar"));
056 assertEquals(555, ((DefaultWebServerConfig) pico.getComponentInstance(DefaultWebServerConfig.class)).getPort());
057
058 assertNotNull(pico.getComponentInstanceOfType(WebServerImpl.class));
059 assertNotNull(pico.getComponentInstanceOfType(ThingThatTakesParamsInConstructor.class));
060 assertSame(pico.getComponentInstance("konstantin needs beer"), pico.getComponentInstanceOfType(ThingThatTakesParamsInConstructor.class));
061 assertEquals("it's really late239", ((ThingThatTakesParamsInConstructor) pico.getComponentInstance("konstantin needs beer")).getValue());
062 }
063
064 public void testComponentAdapterInjection() throws Throwable {
065 Reader script = new StringReader("<container>" +
066 "<adapter key='testAdapter'>" +
067 "<instance key='firstString'>" +
068 "<string>bla bla</string>" +
069 "</instance>" +
070 "<instance key='secondString' >" +
071 "<string>glarch</string>" +
072 "</instance>" +
073 "<instance key='justInt'>" +
074 "<int>777</int>" +
075 "</instance>" +
076 "<implementation key='testAdapter' class='org.nanocontainer.script.xml.TestComponentAdapter'>" +
077 "<dependency key='firstString'/>" +
078 "<dependency key='justInt'/>" +
079 "<dependency key='secondString'/>" +
080 "</implementation>" +
081 "</adapter>" +
082 "</container>");
083
084 PicoContainer pico = buildContainer(new XStreamContainerBuilder(script, getClass().getClassLoader()), null, "SOME_SCOPE");
085 TestComponentAdapter tca = (TestComponentAdapter) pico.getComponentAdapter(TestComponentAdapter.class);
086 assertNotNull(tca);
087 }
088
089 public void testInstantiationOfComponentsWithInstancesOfSameComponent() throws Exception {
090 Reader script = new StringReader("" +
091 "<container>" +
092 " <instance key='bean1'>" +
093 " <org.nanocontainer.script.xml.TestBean>" +
094 " <foo>10</foo>" +
095 " <bar>hello1</bar>" +
096 " </org.nanocontainer.script.xml.TestBean>" +
097 " </instance>" +
098 " <instance key='bean2'>" +
099 " <org.nanocontainer.script.xml.TestBean>" +
100 " <foo>10</foo>" +
101 " <bar>hello2</bar>" +
102 " </org.nanocontainer.script.xml.TestBean>" +
103 " </instance>" +
104 " <implementation class='org.nanocontainer.script.xml.TestBeanComposer'>" +
105 " <dependency key='bean1'/>" +
106 " <dependency key='bean2'/>" +
107 " </implementation>" +
108 "</container>");
109 PicoContainer pico = buildContainer(new XStreamContainerBuilder(script, getClass().getClassLoader()), null, "SOME_SCOPE");
110 assertNotNull(pico.getComponentInstance(TestBeanComposer.class));
111 TestBeanComposer composer = (TestBeanComposer) pico.getComponentInstance(TestBeanComposer.class);
112 assertEquals("bean1", "hello1", composer.getBean1().getBar());
113 assertEquals("bean2", "hello2", composer.getBean2().getBar());
114 }
115
116 // do not know how to extract parameters off adapter....
117 public void testThatDependencyUsesClassAsKey() {
118 Reader script = new StringReader("" +
119 "<container>" +
120 " <implementation class='java.lang.String'/>" +
121 " <implementation key='foo' class='org.nanocontainer.script.xml.TestBean'>" +
122 " <dependency class='java.lang.String'/>" +
123 " </implementation>" +
124 "</container>"
125 );
126
127 PicoContainer pico = buildContainer(new XStreamContainerBuilder(script, getClass().getClassLoader()), null,null);
128 DecoratingComponentAdapter adapter = (DecoratingComponentAdapter)pico.getComponentAdapter("foo");
129 assertNotNull(adapter);
130 }
131
132
133 public void testDefaultContsructorRegistration() throws Exception {
134
135 Reader script = new StringReader(
136 "<container>" +
137 " <implementation class='org.nanocontainer.script.xml.TestBean' constructor='default'/>" +
138 " <instance>" +
139 " <string>blurge</string>" +
140 " </instance>" +
141 "</container>"
142 );
143
144
145 PicoContainer pico = buildContainer(new XStreamContainerBuilder(script, getClass().getClassLoader()), null,null);
146 TestBean bean = (TestBean)pico.getComponentInstanceOfType(TestBean.class);
147 assertEquals("default",bean.getConstructorCalled());
148 }
149 }
150