1 /* 2 * 3 * The Seasar Software License, Version 1.1 4 * 5 * Copyright (c) 2003-2004 The Seasar Project. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or 8 * without modification, are permitted provided that the following 9 * conditions are met: 10 * 11 * 1. Redistributions of source code must retain the above 12 * copyrightnotice, this list of conditions and the following 13 * disclaimer. 14 * 15 * 2. Redistributions in binary form must reproduce the above 16 * copyright notice, this list of conditions and the following 17 * disclaimer in the documentation and/or other materials provided 18 * with the distribution. 19 * 20 * 3. The end-user documentation included with the redistribution, 21 * if any, must include the following acknowledgement: 22 * "This product includes software developed by the 23 * Seasar Project (http://www.seasar.org/)." 24 * Alternately, this acknowledgement may appear in the software 25 * itself, if and wherever such third-party acknowledgements 26 * normally appear. 27 * 28 * 4. Neither the names "The Seasar Project" nor the name of its 29 * contributors ay be used to endour or promote products derived 30 * from this software without specific prior written permission of 31 * the Seasar Project. 32 * 33 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR 34 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 35 * WARRANTIESOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 36 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE SEASER PROJECT 37 * OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 38 * INCIDENTAL,SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 39 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 40 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 41 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 42 * WHETHER IN CONTRACT, STRICT LIABILITY,OR TORT (INCLUDING 43 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 44 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 45 */ 46 package org.seasar.groovy; 47 48 import groovy.lang.Closure; 49 50 import org.aopalliance.intercept.MethodInterceptor; 51 import org.aopalliance.intercept.MethodInvocation; 52 53 /*** 54 * Groovyのクロージャを呼びだすMethodInterceptor。 55 * MethodInvocationはClosureAroundAdviceのコンストラクターに渡されたClosureへと 56 * 引数としてそのまま渡される。 57 * <p> 58 * Closureの戻り値はそのままMethodInterceptorの戻り値として扱われるので、 59 * なんらかの値を返さなくてはならない場合は、Closure内で値を返すこと。 60 * <p> 61 * サンプル: 62 * <pre> 63 * closure = {invocation| 64 * invocation.getArgs()[1][0] // => 1 65 * invocation.getArgs()[1][1] // => 2 66 * result = invocation.proceed() // => 3 67 * return result + 1 // => 4 68 * } 69 * pointcut = new PointcutImpl(Calc) 70 * aspect = new AspectImpl(new ClosureAroundAdvice(closure), pointcut); 71 * proxy = new AopProxy(Calc, new Aspect[]{ aspect }) 72 * calc = proxy.create() 73 * println calc.plus(1, 2) 74 * </pre> 75 * 76 * @since 0.2 77 * @author takai 78 */ 79 public class ClosureAroundAdvice implements MethodInterceptor { 80 81 private Closure _closure; 82 83 /*** 84 * コンストラクター。 85 * コンストラクターに渡されたクロージャがJoinPointを処理する。 86 * 87 * @param closure JoinPointが渡されるクロージャ。 88 */ 89 public ClosureAroundAdvice(Closure closure) { 90 _closure = closure; 91 } 92 93 /*** 94 * @param invocation ジョインポイント。 95 * @return クロージャの戻り値。 96 */ 97 public Object invoke(MethodInvocation invocation) throws Throwable { 98 return _closure.call(invocation); 99 } 100 101 }