[Jiemamy-notify:2808] commit [3730] AOP Alliance向けのドライバを最低限実装

Back to archive index

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);
-		}
 	}
 }




Jiemamy-notify メーリングリストの案内
Back to archive index