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 *
009 *****************************************************************************/
010 package org.picocontainer.behaviors;
011
012 import static org.junit.Assert.assertEquals;
013 import static org.junit.Assert.assertNotNull;
014
015 import org.junit.Test;
016 import org.picocontainer.DefaultPicoContainer;
017 import org.picocontainer.containers.EmptyPicoContainer;
018 import org.picocontainer.lifecycle.NullLifecycleStrategy;
019
020 public class InterceptingTestCase {
021
022 public static interface Person {
023 String greeting();
024 String parting(String who);
025 void sleep(int howLong);
026 public static class nullobject implements Person {
027 public String greeting() {
028 return null;
029 }
030 public String parting(String who) {
031 return null;
032 }
033 public void sleep(int howLong) {
034 }
035 }
036
037 }
038
039 public static class Englishman implements Person {
040 private StringBuilder sb;
041
042 public Englishman(StringBuilder sb) {
043 this.sb = sb;
044 }
045
046 public String greeting() {
047 String phrase = "How do you do?";
048 sb.append(phrase);
049 return phrase;
050 }
051
052 public String parting(String who) {
053 String phrase = "Goodbye " + who + ".";
054 sb.append(phrase);
055 return phrase;
056 }
057
058 public void sleep(int howLong) {
059 sb.append("Nap for " + howLong);
060 }
061 }
062
063 @Test public void testPreAndPostObservation() {
064 final StringBuilder sb = new StringBuilder();
065 DefaultPicoContainer pico = new DefaultPicoContainer(new Intercepting(), new NullLifecycleStrategy(), new EmptyPicoContainer());
066 pico.addComponent(StringBuilder.class, sb);
067 pico.addComponent(Person.class, Englishman.class);
068
069 Intercepted intercepted = pico.getComponentAdapter(Person.class).findAdapterOfType(Intercepted.class);
070 final Intercepted.Controller interceptor = intercepted.getController();
071 intercepted.addPostInvocation(Person.class, new Person.nullobject() {
072 public String greeting() {
073 sb.append("</english-greeting>");
074 return null;
075 }
076 });
077 intercepted.addPreInvocation(Person.class, new Person.nullobject() {
078 public String greeting() {
079 sb.append("<english-greeting>");
080 return null;
081 }
082 });
083
084
085 Person foo = pico.getComponent(Person.class);
086 assertNotNull(foo);
087 assertEquals("How do you do?", foo.greeting());
088 assertEquals("<english-greeting>How do you do?</english-greeting>", sb.toString());
089 assertEquals("Intercepted:ConstructorInjector-interface org.picocontainer.behaviors.InterceptingTestCase$Person", pico.getComponentAdapter(Person.class).toString());
090 }
091
092 @Test public void testPreAndPostObservationWithParameter() {
093 final StringBuilder sb = new StringBuilder();
094 DefaultPicoContainer pico = new DefaultPicoContainer(new Intercepting(), new NullLifecycleStrategy(), new EmptyPicoContainer());
095 pico.addComponent(StringBuilder.class, sb);
096 pico.addComponent(Person.class, Englishman.class);
097
098 Intercepted intercepted = pico.getComponentAdapter(Person.class).findAdapterOfType(Intercepted.class);
099 final Intercepted.Controller interceptor = intercepted.getController();
100 intercepted.addPostInvocation(Person.class, new Person.nullobject() {
101 public String parting(String a) {
102 assertEquals("Goodbye Fred.", interceptor.getOriginalRetVal().toString());
103 sb.append("</english-parting>");
104 return null;
105 }
106 });
107 intercepted.addPreInvocation(Person.class, new Person.nullobject() {
108 public String parting(String who) {
109 sb.append("<english-parting who='"+who+"'>");
110 return null;
111 }
112 });
113
114 Person foo = pico.getComponent(Person.class);
115 assertNotNull(foo);
116 assertEquals("Goodbye Fred.", foo.parting("Fred").trim());
117 assertEquals("<english-parting who='Fred'>Goodbye Fred.</english-parting>", sb.toString());
118 assertEquals("Intercepted:ConstructorInjector-interface org.picocontainer.behaviors.InterceptingTestCase$Person", pico.getComponentAdapter(Person.class).toString());
119 }
120
121 @Test public void testPreCanPreventInvocationWithAlternateReturnValue() {
122 final StringBuilder sb = new StringBuilder();
123 DefaultPicoContainer pico = new DefaultPicoContainer(new Intercepting(), new NullLifecycleStrategy(), new EmptyPicoContainer());
124 pico.addComponent(Person.class, Englishman.class);
125 pico.addComponent(StringBuilder.class, sb);
126
127 Intercepted intercepted = pico.getComponentAdapter(Person.class).findAdapterOfType(Intercepted.class);
128 final Intercepted.Controller interceptor = intercepted.getController();
129 intercepted.addPreInvocation(Person.class, new Person.nullobject() {
130 public String parting(String who) {
131 interceptor.veto();
132 return "Au revoir " + who + ".";
133 }
134 });
135
136 Person foo = pico.getComponent(Person.class);
137 assertNotNull(foo);
138 assertEquals("Au revoir Fred.", foo.parting("Fred"));
139 assertEquals("", sb.toString());
140 assertEquals("Intercepted:ConstructorInjector-interface org.picocontainer.behaviors.InterceptingTestCase$Person", pico.getComponentAdapter(Person.class).toString());
141 }
142
143 @Test public void testOverrideOfReturnValue() {
144 final StringBuilder sb = new StringBuilder();
145 DefaultPicoContainer pico = new DefaultPicoContainer(new Intercepting(), new NullLifecycleStrategy(), new EmptyPicoContainer());
146 pico.addComponent(Person.class, Englishman.class);
147 pico.addComponent(StringBuilder.class, sb);
148 Intercepted intercepted = pico.getComponentAdapter(Person.class).findAdapterOfType(Intercepted.class);
149 final Intercepted.Controller interceptor = intercepted.getController();
150 intercepted.addPreInvocation(Person.class, new Person.nullobject() {
151 public String parting(String who) {
152 sb.append("[Before parting]");
153 return null;
154 }
155 });
156 intercepted.addPostInvocation(Person.class, new Person() {
157 public String greeting() {
158 return null;
159 }
160
161 public String parting(String who) {
162 interceptor.override();
163 sb.append("[After parting]");
164 return "Arrivederci " + who;
165 }
166
167 public void sleep(int howLong) {
168 }
169 });
170
171 Person foo = pico.getComponent(Person.class);
172 assertNotNull(foo);
173 assertEquals("Arrivederci Fred", foo.parting("Fred"));
174 assertEquals("[Before parting]Goodbye Fred.[After parting]", sb.toString());
175 assertEquals("Intercepted:ConstructorInjector-interface org.picocontainer.behaviors.InterceptingTestCase$Person", pico.getComponentAdapter(Person.class).toString());
176 }
177
178 @Test public void testNothingHappensIfNoPreOrPost() {
179 final StringBuilder sb = new StringBuilder();
180 DefaultPicoContainer pico = new DefaultPicoContainer(new Intercepting(), new NullLifecycleStrategy(), new EmptyPicoContainer());
181 pico.addComponent(Person.class, Englishman.class);
182 pico.addComponent(StringBuilder.class, sb);
183 Person foo = pico.getComponent(Person.class);
184 assertNotNull(foo);
185 assertEquals("Goodbye Fred.", foo.parting("Fred"));
186 assertEquals("Goodbye Fred.", sb.toString());
187 assertEquals("Intercepted:ConstructorInjector-interface org.picocontainer.behaviors.InterceptingTestCase$Person", pico.getComponentAdapter(Person.class).toString());
188 }
189
190
191
192 }