001 package org.picocontainer.lifecycle; 002 003 import static org.junit.Assert.assertEquals; 004 import org.junit.Test; 005 import org.picocontainer.*; 006 import org.picocontainer.containers.EmptyPicoContainer; 007 import org.picocontainer.monitors.NullComponentMonitor; 008 009 import static org.picocontainer.Characteristics.CACHE; 010 011 public class LazyLifecycleStrategyTestCase { 012 013 @Test 014 public void testStartStopAndDisposeCanBeLazy() { 015 final StringBuilder sb = new StringBuilder(); 016 MutablePicoContainer pico = new DefaultPicoContainer(new StartableLifecycleStrategy(new NullComponentMonitor()) { 017 @Override 018 public boolean isLazy(ComponentAdapter<?> adapter) { 019 return true; 020 } 021 }, new EmptyPicoContainer()); 022 pico.addComponent(sb); 023 pico.as(CACHE).addComponent(MyStartableComp.class); 024 pico.start(); 025 assertEquals("", sb.toString()); // normally would be "<" here 026 pico.getComponent(MyStartableComp.class); 027 pico.getComponent(MyStartableComp.class); 028 assertEquals("<", sb.toString()); // only one start() issued even if two or more getComponents 029 pico.stop(); 030 assertEquals("<>", sb.toString()); 031 pico.dispose(); 032 assertEquals("<>!", sb.toString()); 033 } 034 035 @Test 036 public void testStartStopAndDisposeCanBeLazyWithoutGet() { 037 final StringBuilder sb = new StringBuilder(); 038 MutablePicoContainer pico = new DefaultPicoContainer(new StartableLifecycleStrategy(new NullComponentMonitor()) { 039 @Override 040 public boolean isLazy(ComponentAdapter<?> adapter) { 041 return true; 042 } 043 }, new EmptyPicoContainer()); 044 pico.addComponent(sb); 045 pico.as(CACHE).addComponent(MyStartableComp.class); 046 pico.start(); 047 assertEquals("", sb.toString()); 048 pico.stop(); 049 assertEquals("", sb.toString()); 050 pico.dispose(); 051 assertEquals("", sb.toString()); 052 } 053 054 @Test 055 public void testStartStopAndDisposeCanBeConditionallyLazy() { 056 final StringBuilder sb = new StringBuilder(); 057 MutablePicoContainer pico = new DefaultPicoContainer(new StartableLifecycleStrategy(new NullComponentMonitor()) { 058 @Override 059 public boolean isLazy(ComponentAdapter<?> adapter) { 060 return adapter.getComponentImplementation() == MyStartableComp.class; 061 } 062 }, new EmptyPicoContainer()); 063 pico.addComponent(sb); 064 pico.as(CACHE).addComponent(MyStartableComp.class); 065 pico.as(CACHE).addComponent(MyDifferentStartableComp.class); 066 pico.start(); 067 assertEquals("{", sb.toString()); // one component started, one not 068 pico.getComponent(MyStartableComp.class); 069 pico.getComponent(MyStartableComp.class); // should not start a second time 070 assertEquals("{<", sb.toString()); // both components now started, one lazily. 071 pico.stop(); 072 assertEquals("{<}>", sb.toString()); 073 pico.dispose(); 074 assertEquals("{<}>?!", sb.toString()); 075 } 076 077 public static class MyStartableComp implements Startable, Disposable { 078 private StringBuilder sb; 079 080 public MyStartableComp(StringBuilder sb) { 081 this.sb = sb; 082 } 083 084 public void start() { 085 sb.append("<"); 086 } 087 088 public void stop() { 089 sb.append(">"); 090 } 091 092 public void dispose() { 093 sb.append("!"); 094 } 095 } 096 097 public static class MyDifferentStartableComp implements Startable, Disposable { 098 private StringBuilder sb; 099 100 public MyDifferentStartableComp(StringBuilder sb) { 101 this.sb = sb; 102 } 103 104 public void start() { 105 sb.append("{"); 106 } 107 108 public void stop() { 109 sb.append("}"); 110 } 111 112 public void dispose() { 113 sb.append("?"); 114 } 115 } 116 117 }