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