001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package org.apache.commons.proxy.interceptor;
019
020 import junit.framework.TestCase;
021 import org.aopalliance.intercept.MethodInterceptor;
022 import org.aopalliance.intercept.MethodInvocation;
023 import org.apache.commons.proxy.ProxyUtils;
024 import org.apache.commons.proxy.factory.javassist.JavassistProxyFactory;
025 import org.apache.commons.proxy.util.Echo;
026 import org.apache.commons.proxy.util.EchoImpl;
027
028 public class TestMethodInterceptorAdapter extends TestCase
029 {
030 public void testMethodInterception()
031 {
032 final Echo proxy = ( Echo ) new JavassistProxyFactory().createInterceptorProxy( new EchoImpl(),
033 new MethodInterceptorAdapter( new SuffixMethodInterceptor(
034 " suffix" ) ),
035 new Class[]{ Echo.class } );
036 assertEquals( "message suffix", proxy.echoBack( "message" ) );
037 }
038
039 public void testMethodInvocationImplementation() throws Exception
040 {
041 final InterceptorTester tester = new InterceptorTester();
042 final EchoImpl target = new EchoImpl();
043 final Echo proxy = ( Echo ) new JavassistProxyFactory().createInterceptorProxy( target, new MethodInterceptorAdapter( tester ), new Class[] { Echo.class } );
044 proxy.echo();
045 assertNotNull( tester.invocation.getArguments() );
046 assertEquals( 0, tester.invocation.getArguments().length );
047 assertEquals( Echo.class.getMethod( "echo", new Class[] {} ), tester.invocation.getMethod() );
048 assertEquals( Echo.class.getMethod( "echo", new Class[] {} ), tester.invocation.getStaticPart() );
049 assertEquals( target, tester.invocation.getThis() );
050 proxy.echoBack( "Hello" );
051 assertNotNull( tester.invocation.getArguments() );
052 assertEquals( 1, tester.invocation.getArguments().length );
053 assertEquals( "Hello", tester.invocation.getArguments()[0] );
054 assertEquals( Echo.class.getMethod( "echoBack", new Class[] { String.class } ), tester.invocation.getMethod() );
055 assertEquals( Echo.class.getMethod( "echoBack", new Class[] { String.class } ), tester.invocation.getStaticPart() );
056 proxy.echoBack( "Hello", "World" );
057 assertNotNull( tester.invocation.getArguments() );
058 assertEquals( 2, tester.invocation.getArguments().length );
059 assertEquals( "Hello", tester.invocation.getArguments()[0] );
060 assertEquals( "World", tester.invocation.getArguments()[1] );
061 assertEquals( Echo.class.getMethod( "echoBack", new Class[] { String.class, String.class } ), tester.invocation.getMethod() );
062 assertEquals( Echo.class.getMethod( "echoBack", new Class[] { String.class, String.class } ), tester.invocation.getStaticPart() );
063 }
064 private static class InterceptorTester implements MethodInterceptor
065 {
066 private MethodInvocation invocation;
067
068 public Object invoke( MethodInvocation methodInvocation ) throws Throwable
069 {
070 this.invocation = methodInvocation;
071 return methodInvocation.proceed();
072 }
073 }
074 private class SuffixMethodInterceptor implements MethodInterceptor
075 {
076 private final String suffix;
077
078 public SuffixMethodInterceptor( String suffix )
079 {
080 this.suffix = suffix;
081 }
082
083 public Object invoke( MethodInvocation methodInvocation ) throws Throwable
084 {
085 return methodInvocation.proceed() + suffix;
086 }
087 }
088 }