svnno****@sourc*****
svnno****@sourc*****
2009年 10月 8日 (木) 11:19:06 JST
Revision: 3730 http://sourceforge.jp/projects/jiemamy/svn/view?view=rev&revision=3730 Author: ashigeru Date: 2009-10-08 11:19:06 +0900 (Thu, 08 Oct 2009) Log Message: ----------- AOP Alliance向けのドライバを最低限実装 Modified Paths: -------------- leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/driver/AopAllianceDriver.java Modified: leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/driver/AopAllianceDriver.java =================================================================== --- leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/driver/AopAllianceDriver.java 2009-10-07 18:49:11 UTC (rev 3729) +++ leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/driver/AopAllianceDriver.java 2009-10-08 02:19:06 UTC (rev 3730) @@ -29,24 +29,48 @@ import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; +import org.jiemamy.utils.enhancer.FactoryEnhancer; +import org.jiemamy.utils.enhancer.InterfaceEnhancer; import org.jiemamy.utils.enhancer.Invocation; import org.jiemamy.utils.enhancer.InvocationHandler; /** - * TODO for Suguru ARAKAWA + * AOP Allianceが提供するインターセプタの定義を、Jiemamyが提供する + * {@link FactoryEnhancer}, {@link InterfaceEnhancer}でそれぞれ利用可能にするドライバ。 * + * <p> + * それぞれのインターセプタに渡される{@link org.aopalliance.intercept.Invocation}は + * 本来の仕様と多少異なる場合がある。 + * たとえば、 {@link org.aopalliance.intercept.Invocation#getStaticPart()}は + * インターセプタのチェインがインストールされた実体を正確に指さない場合がある。 + * また、その値を利用する + * {@link MethodInvocation#getMethod()}, {@link ConstructorInvocation#getConstructor()}は + * なども同様に正しい値を返さない場合があるので、注意が必要である。 + * </p> + * * @version 0.2.0 * @since 0.2.0 * @version $Id$ * @author Suguru ARAKAWA + * @see <a href="http://aopalliance.sourceforge.net/">AOP Alliance</a> */ public class AopAllianceDriver { /** - * TODO for Suguru ARAKAWA + * 指定の{@link MethodInterceptor}に処理を委譲する{@link InvocationHandler}を生成して返す。 + * <p> + * 返されるハンドラがメソッド起動をハンドルした場合、 + * 引数に渡された {@link MethodInterceptor#invoke(MethodInvocation)}に対して処理を委譲する。 + * この引数に渡される{@link MethodInvocation}オブジェクトは、 + * {@link InvocationHandler}が受け取った{@link Invocation}オブジェクトをラップしたものである。 + * </p> + * <p> + * 返されるハンドラがインスタンス生成処理をハンドルした場合、 + * そのハンドラは次のハンドラまたは実際の処理を直接実行する ({@link Invocation#proceed()})。 + * </p> * - * @param interceptor - * @return + * @param interceptor 委譲先のインターセプタ + * @return 引数に渡されたインターセプタ * @throws NullPointerException 引数に{@code null}が指定された場合 */ public static InvocationHandler toHandler(MethodInterceptor interceptor) { @@ -57,10 +81,20 @@ } /** - * TODO for Suguru ARAKAWA + * 指定の{@link MethodInterceptor}に処理を委譲する{@link InvocationHandler}を生成して返す。 + * <p> + * 返されるハンドラがメソッド起動をハンドルした場合、 + * 引数に渡された {@link MethodInterceptor#invoke(MethodInvocation)}に対して処理を委譲する。 + * この引数に渡される{@link MethodInvocation}オブジェクトは、 + * {@link InvocationHandler}が受け取った{@link Invocation}オブジェクトをラップしたものである。 + * </p> + * <p> + * 返されるハンドラがインスタンス生成処理をハンドルした場合、 + * そのハンドラは次のハンドラまたは実際の処理を直接実行する ({@link Invocation#proceed()})。 + * </p> * - * @param interceptor - * @return + * @param interceptor 委譲先のインターセプタ + * @return 引数に渡されたインターセプタ * @throws NullPointerException 引数に{@code null}が指定された場合 */ public static InvocationHandler toHandler(ConstructorInterceptor interceptor) { @@ -70,7 +104,15 @@ return new ConstructorInterceptorDriver(interceptor); } + /** + * {@link Invocation#proceed() invocation.proceed()}を実行する。 + * @param invocation {@link Invocation#proceed()}を実行する対象 + * @return {@code invocation.proceed()}の実行結果 + * @throws IllegalArgumentException {@code invocation.proceed()}が同例外をスローする場合 + * @throws Throwable {@code invocation.proceed()}が例外を返す場合 + */ static Object doProceed(Invocation invocation) throws Throwable { + assert invocation != null; try { return invocation.proceed(); } catch (InvocationTargetException e) { @@ -78,16 +120,15 @@ } } - /** - * TODO for Suguru ARAKAWA - * - * @version 0.2.0 - * @since 0.2.0 - * @version $Id$ - * @author Suguru ARAKAWA + * インスタンス生成の禁止。 */ - public static class MethodInterceptorDriver implements InvocationHandler { + private AopAllianceDriver() { + throw new AssertionError(); + } + + + private static class MethodInterceptorDriver implements InvocationHandler { private MethodInterceptor interceptor; @@ -96,12 +137,9 @@ * インスタンスを生成する。 * * @param interceptor ラップする {@link MethodInterceptor} - * @throws NullPointerException 引数に{@code null}が指定された場合 */ public MethodInterceptorDriver(MethodInterceptor interceptor) { - if (interceptor == null) { - throw new NullPointerException("interceptor is null"); //$NON-NLS-1$ - } + assert interceptor != null; this.interceptor = interceptor; } @@ -113,16 +151,7 @@ } } - /** - * - * TODO for Suguru ARAKAWA - * - * @version 0.2.0 - * @since 0.2.0 - * @version $Id$ - * @author Suguru ARAKAWA - */ - public static class ConstructorInterceptorDriver implements InvocationHandler { + private static class ConstructorInterceptorDriver implements InvocationHandler { private ConstructorInterceptor interceptor; @@ -131,12 +160,9 @@ * インスタンスを生成する。 * * @param interceptor ラップする {@link ConstructorInterceptor} - * @throws NullPointerException 引数に{@code null}が指定された場合 */ public ConstructorInterceptorDriver(ConstructorInterceptor interceptor) { - if (interceptor == null) { - throw new NullPointerException("interceptor is null"); //$NON-NLS-1$ - } + assert interceptor != null; this.interceptor = interceptor; } @@ -148,36 +174,26 @@ } } - private static class MethodInvocationDriver implements MethodInvocation { + private abstract static class AbstractInvocationDriver implements org.aopalliance.intercept.Invocation { private Invocation invocation; - private Method executable; - /** * インスタンスを生成する。 * @param invocation 呼び出しを表現するオブジェクト */ - public MethodInvocationDriver(Invocation invocation) { + public AbstractInvocationDriver(Invocation invocation) { assert invocation != null; this.invocation = invocation; - - Member target = invocation.getTarget(); - assert target instanceof Method; - executable = (Method) target; } - public Method getMethod() { - return executable; - } - public Object[] getArguments() { return invocation.getArguments(); } public AccessibleObject getStaticPart() { - return executable; + return (AccessibleObject) invocation.getTarget(); } public Object getThis() { @@ -189,10 +205,29 @@ } } - private static class ConstructorInvocationDriver implements ConstructorInvocation { + private static class MethodInvocationDriver extends AbstractInvocationDriver implements MethodInvocation { - private Invocation invocation; + private Method executable; + + /** + * インスタンスを生成する。 + * @param invocation 呼び出しを表現するオブジェクト + */ + public MethodInvocationDriver(Invocation invocation) { + super(invocation); + Member target = invocation.getTarget(); + assert target instanceof Method; + executable = (Method) target; + } + + public Method getMethod() { + return executable; + } + } + + private static class ConstructorInvocationDriver extends AbstractInvocationDriver implements ConstructorInvocation { + private Constructor<?> executable; @@ -201,9 +236,7 @@ * @param invocation 呼び出しを表現するオブジェクト */ public ConstructorInvocationDriver(Invocation invocation) { - assert invocation != null; - this.invocation = invocation; - + super(invocation); Member target = invocation.getTarget(); assert target instanceof Constructor<?>; executable = (Constructor<?>) target; @@ -212,21 +245,5 @@ public Constructor<?> getConstructor() { return executable; } - - public Object[] getArguments() { - return invocation.getArguments(); - } - - public AccessibleObject getStaticPart() { - return executable; - } - - public Object getThis() { - return invocation.getInvoker(); - } - - public Object proceed() throws Throwable { - return doProceed(invocation); - } } }