001    package org.picocontainer.script.xml;
002    
003    import static org.junit.Assert.assertNotNull;
004    
005    import java.io.Reader;
006    import java.io.StringReader;
007    
008    import org.junit.Test;
009    import org.picocontainer.script.AbstractScriptedContainerBuilderTestCase;
010    import org.picocontainer.script.xml.XMLContainerBuilder;
011    import org.picocontainer.PicoContainer;
012    import org.picocontainer.injectors.SetterInjection;
013    
014    public class ServiceDependencyTestCase extends AbstractScriptedContainerBuilderTestCase {
015    
016        @SuppressWarnings("serial")
017        public static class MySetterInjection extends SetterInjection {
018            public MySetterInjection() {
019            }
020        }
021    
022        //TODO - make sure that this container builder can supply a LifecycleStrategy.
023        //       meaning MySetterInjection can be swapped for SetterInjectionComponentFactory
024        @Test public void testCanInstantiateProcessWithSDIDependencies() {
025            Reader script = new StringReader("" +
026                    "<container component-adapter-factory='"+ MySetterInjection.class.getName()+"'>"+
027                    "  <component-implementation class='"+Service1Impl.class.getName()+"'/>"+
028                    "  <component-implementation class='"+ServiceAImpl.class.getName()+"'/>"+
029                    "  <component-implementation class='"+Service2Impl.class.getName()+"'/>"+
030                    "  <component-implementation class='"+ServiceBImpl.class.getName()+"'/>"+
031                    "  <component-implementation class='"+Process.class.getName()+"'/>"+
032                    "</container>");
033            assertProcessWithDependencies(script);
034        }
035    
036        private void assertProcessWithDependencies(Reader script) {
037            PicoContainer pico = buildContainer(script);
038            assertNotNull(pico);
039            Process process = pico.getComponent(Process.class);
040            assertNotNull(process);
041            assertNotNull(process.getServiceA());
042            assertNotNull(process.getServiceA().getService1());
043            assertNotNull(process.getServiceB());
044            assertNotNull(process.getServiceB().getService2());
045        }
046    
047        private PicoContainer buildContainer(Reader script) {
048            return buildContainer(new XMLContainerBuilder(script, getClass().getClassLoader()), null, "SOME_SCOPE");
049        }
050        
051        public static class Process {
052            private ServiceA serviceA;
053    
054            private ServiceB serviceB;
055    
056            // use with SDI
057            public Process() {
058            }
059    
060            public ServiceA getServiceA() {
061                return serviceA;
062            }
063    
064            public void setServiceA(ServiceA serviceA) {
065                this.serviceA = serviceA;
066            }
067    
068            public ServiceB getServiceB() {
069                return serviceB;
070            }
071    
072            public void setServiceB(ServiceB serviceB) {
073                this.serviceB = serviceB;
074            }
075        }
076    
077        public static interface Service1 {
078        }
079    
080        public static interface Service2 {
081        }
082    
083        public static class Service1Impl implements Service1 {
084            public Service1Impl() {
085            }
086        }
087    
088        public static class Service2Impl implements Service2 {
089            public Service2Impl() {
090            }
091        }
092    
093        public static interface ServiceA {
094            public Service1 getService1();
095        }
096    
097        public static interface ServiceB {
098            public Service2 getService2();
099        }
100    
101        public static class ServiceAImpl implements ServiceA {
102            private Service1 service1;
103            public ServiceAImpl() {
104            }
105            public Service1 getService1() {
106                return service1;
107            }
108            public void setService1(Service1 service1) {
109                this.service1 = service1;
110            }        
111        }
112    
113        public static class ServiceBImpl implements ServiceB {
114            private Service2 service2;
115            public ServiceBImpl() {
116            }
117            public Service2 getService2() {
118                return service2;
119            }
120            public void setService2(Service2 service2) {
121                this.service2 = service2;
122            }        
123        }
124    }
125    
126