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