[Jiemamy-notify:2810] commit [3732] ProxyDriver, AopAllianceDriverのテストをそれぞれ追加。

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2009年 10月 8日 (木) 21:39:30 JST


Revision: 3732
          http://sourceforge.jp/projects/jiemamy/svn/view?view=rev&revision=3732
Author:   ashigeru
Date:     2009-10-08 21:39:30 +0900 (Thu, 08 Oct 2009)

Log Message:
-----------
ProxyDriver, AopAllianceDriverのテストをそれぞれ追加。

Modified Paths:
--------------
    leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/FactoryEnhancer.java
    leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/InterfaceEnhancer.java
    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/ProxyDriver.java
    leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/InterfaceEnhancerTest.java

Added Paths:
-----------
    leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/InterfaceProductEx.java
    leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/ParameterConflictInterfaceFactory.java
    leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/SimpleInterfaceFactoryEx.java
    leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/
    leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/AopAllianceDriverTest.java
    leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/DriverTestRoot.java
    leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/ProxyDriverTest.java
    leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/RunnableEx.java
    leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/RunnableExImpl.java

Modified: leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/FactoryEnhancer.java
===================================================================
--- leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/FactoryEnhancer.java	2009-10-08 07:54:36 UTC (rev 3731)
+++ leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/FactoryEnhancer.java	2009-10-08 12:39:30 UTC (rev 3732)
@@ -181,6 +181,21 @@
 	 *   </li>
 	 * </ul>
 	 * <p>
+	 * 拡張対象の判定は、{@code enhanceList}に含まれるそれぞれの{@link Enhance}が返す、
+	 * {@link InvocationPointcut}によって行われる。
+	 * </p>
+	 * <p>
+	 * 単一のジョインポイント(メソッド起動やインスタンス生成)を複数のエンハンスが同時に拡張する場合、
+	 * 引数{@code enhanceList}に指定された順にハンドラが実行される。
+	 * たとえば、{@code enhanceList}に対してあるメソッド呼び出しに対して
+	 * 同時に適用可能な拡張{@code [a, b, c]}が含まれる場合、
+	 * {@code a, b, c}の順に含まれる{@link InvocationHandler}が実行された後、
+	 * 最後の{@code c}から実際のメソッドが呼び出される。
+	 * これらの途中で後続する処理を実行しなかった場合、それらの拡張は実際には利用されない。
+	 * つまり、{@code b}の拡張がハンドラの内部で{@link Invocation#proceed()}を実行しなかった場合、
+	 * それに続く{@code c}および実際のメソッドは実行されないことになる。
+	 * </p>
+	 * <p>
 	 * なお、プロダクトクラスが拡張される場合、このオブジェクトが作成するファクトリは
 	 * 拡張されたプロダクトクラスをインスタンス化して返す。
 	 * ただし、拡張対象となるプロダクトクラスのうち、{@code public}でない
@@ -206,7 +221,9 @@
 	 *     {@code factoryImplementation}が{@code java.lang.Object}の
 	 *     直接のサブクラスでない場合
 	 */
-	public FactoryEnhancer(Class<T> factoryInterface, Class<? extends T> factoryImplementation,
+	public FactoryEnhancer(
+			Class<T> factoryInterface,
+			Class<? extends T> factoryImplementation,
 			List<? extends Enhance> enhanceList) {
 		super();
 		if (factoryInterface == null) {

Modified: leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/InterfaceEnhancer.java
===================================================================
--- leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/InterfaceEnhancer.java	2009-10-08 07:54:36 UTC (rev 3731)
+++ leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/InterfaceEnhancer.java	2009-10-08 12:39:30 UTC (rev 3732)
@@ -128,6 +128,53 @@
 	 *   <li> {@code productSuperClass}は(列挙でない)クラス型を表現する </li>
 	 *   <li> {@code productSuperClass}は引数をとらない{@code public}コンストラクタを提供する </li>
 	 * </ul>
+	 * <p>
+	 * このエンハンサによって拡張されたファクトリは、次のような性質を持つことになる。
+	 * </p>
+	 * <ul>
+	 * <li>
+	 * 	 ファクトリインターフェースの各メソッド(以下、ファクトリメソッド)は、
+	 *   その戻り値型に指定されたインターフェース(以下、プロダクトインターフェース)を
+	 *   実装するクラスのインスタンス(以下、プロダクトインスタンス)を返す。
+	 * </li>
+	 * <li>
+	 *   プロダクトインターフェースの各メソッドに対して、{@code enhanceList}に指定された拡張が存在する場合、
+	 *   対応するプロダクトインスタンスの各メソッドはその拡張が適用された状態になっている。
+	 * </li>
+	 * <li>
+	 *   各ファクトリメソッドは、プロダクトインスタンスの生成に関するジョインポイントを提供する。
+	 *   これに対して拡張を行う場合、次のようなポイントカットを用意する。 
+	 *   <ul>
+	 *   <li>
+	 *     {@link InvocationPointcut#isTarget(CtClass, javassist.CtBehavior)}の
+	 *     第1引数に、対象のファクトリメソッドの戻り値の型(つまり、ファクトリインターフェース)が渡されることを許可する。
+	 *   </li>
+	 *   <li>
+	 *     {@link InvocationPointcut#isTarget(CtClass, javassist.CtBehavior)}の
+	 *     第2引数に、対象のファクトリメソッドと同じパラメータリストを持つコンストラクタが渡されることを許可する。
+	 *   </li>
+	 *   </ul>
+	 *   このジョインポイントに対する{@link InvocationHandler}において、独自のクラスインスタンスを返した場合、
+	 *   それらはプロダクトインスタンスとみなされない。
+	 *   つまり、{@code enhanceList}に指定されたメソッドジョインポイントに関する拡張は、
+	 *   それらのインスタンスに対して適用されない。
+	 * </li>
+	 * </ul>
+	 * <p>
+	 * 拡張対象の判定は、{@code enhanceList}に含まれるそれぞれの{@link Enhance}が返す、
+	 * {@link InvocationPointcut}によって行われる。
+	 * </p>
+	 * <p>
+	 * 単一のジョインポイント(メソッド起動やインスタンス生成)を複数のエンハンスが同時に拡張する場合、
+	 * 引数{@code enhanceList}に指定された順にハンドラが実行される。
+	 * たとえば、{@code enhanceList}に対してあるメソッド呼び出しに対して
+	 * 同時に適用可能な拡張{@code [a, b, c]}が含まれる場合、
+	 * {@code a, b, c}の順に含まれる{@link InvocationHandler}が実行された後、
+	 * 最後の{@code c}から実際のメソッドが呼び出される。
+	 * これらの途中で後続する処理を実行しなかった場合、それらの拡張は実際には利用されない。
+	 * つまり、{@code b}の拡張がハンドラの内部で{@link Invocation#proceed()}を実行しなかった場合、
+	 * それに続く{@code c}および実際のメソッドは実行されないことになる。
+	 * </p>
 	 * @param factoryInterface 実装を生成する対象のファクトリインターフェース
 	 * @param productSuperClass それぞれのプロダクトが実装する親クラス
 	 * @param enhanceList 拡張を定義するオブジェクトの一覧

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-08 07:54:36 UTC (rev 3731)
+++ leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/driver/AopAllianceDriver.java	2009-10-08 12:39:30 UTC (rev 3732)
@@ -23,6 +23,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Member;
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 
 import org.aopalliance.intercept.ConstructorInterceptor;
 import org.aopalliance.intercept.ConstructorInvocation;
@@ -81,15 +82,15 @@
 	}
 	
 	/**
-	 * 指定の{@link MethodInterceptor}に処理を委譲する{@link InvocationHandler}を生成して返す。
+	 * 指定の{@link ConstructorInterceptor}に処理を委譲する{@link InvocationHandler}を生成して返す。
 	 * <p>
-	 * 返されるハンドラがメソッド起動をハンドルした場合、
-	 * 引数に渡された {@link MethodInterceptor#invoke(MethodInvocation)}に対して処理を委譲する。
-	 * この引数に渡される{@link MethodInvocation}オブジェクトは、
+	 * 返されるハンドラがインスタンス生成処理をハンドルした場合、
+	 * 引数に渡された {@link ConstructorInterceptor#construct(ConstructorInvocation)}に対して処理を委譲する。
+	 * この引数に渡される{@link ConstructorInvocation}オブジェクトは、
 	 * {@link InvocationHandler}が受け取った{@link Invocation}オブジェクトをラップしたものである。
 	 * </p>
 	 * <p>
-	 * 返されるハンドラがインスタンス生成処理をハンドルした場合、
+	 * 返されるハンドラがメソッド起動をハンドルした場合、
 	 * そのハンドラは次のハンドラまたは実際の処理を直接実行する ({@link Invocation#proceed()})。
 	 * </p>
 	 * 
@@ -108,11 +109,14 @@
 	 * {@link Invocation#proceed() invocation.proceed()}を実行する。
 	 * @param invocation {@link Invocation#proceed()}を実行する対象
 	 * @return {@code invocation.proceed()}の実行結果
+	 * @throws NullPointerException 引数に{@code null}が指定された場合
 	 * @throws IllegalArgumentException {@code invocation.proceed()}が同例外をスローする場合
 	 * @throws Throwable {@code invocation.proceed()}が例外を返す場合
 	 */
 	static Object doProceed(Invocation invocation) throws Throwable {
-		assert invocation != null;
+		if (invocation == null) {
+			throw new NullPointerException("invocation is null"); //$NON-NLS-1$
+		}
 		try {
 			return invocation.proceed();
 		} catch (InvocationTargetException e) {
@@ -128,6 +132,12 @@
 	}
 	
 
+	/**
+	 * {@link MethodInterceptor}をラップして{@link InvocationHandler}としての振る舞いを提供する。
+	 * 
+	 * @version $Id$
+	 * @author Suguru ARAKAWA
+	 */
 	private static class MethodInterceptorDriver implements InvocationHandler {
 		
 		private MethodInterceptor interceptor;
@@ -151,6 +161,12 @@
 		}
 	}
 	
+	/**
+	 * {@link ConstructorInterceptor}をラップして{@link InvocationHandler}としての振る舞いを提供する。
+	 * 
+	 * @version $Id$
+	 * @author Suguru ARAKAWA
+	 */
 	private static class ConstructorInterceptorDriver implements InvocationHandler {
 		
 		private ConstructorInterceptor interceptor;
@@ -174,9 +190,25 @@
 		}
 	}
 	
+	/**
+	 * {@link org.jiemamy.utils.enhancer.Invocation}をラップして、
+	 * {@link org.aopalliance.intercept.Invocation}としての振る舞いを提供する。
+	 * <p>
+	 * ただし、AOP AllienceのAPIでは、
+	 * {@code org.aopalliance.intercept.Invocation}インターフェースを直接実装する
+	 * クラスは存在せず、それぞれ{@link MethodInvocation}や{@link ConstructorInvocation}
+	 * として提供しているようである。
+	 * このため、このクラスは抽象クラスとして提供し、そのサブクラスでそれぞれのインターフェースを実装している。
+	 * </p>
+	 * @version $Id$
+	 * @author Suguru ARAKAWA
+	 */
 	private abstract static class AbstractInvocationDriver implements org.aopalliance.intercept.Invocation {
 		
-		private Invocation invocation;
+		/**
+		 * ラップする{@link Invocation}。
+		 */
+		protected final Invocation invocation;
 		
 
 		/**
@@ -196,15 +228,18 @@
 			return (AccessibleObject) invocation.getTarget();
 		}
 		
-		public Object getThis() {
-			return invocation.getInvoker();
-		}
-		
 		public Object proceed() throws Throwable {
 			return doProceed(invocation);
 		}
 	}
 	
+	/**
+	 * {@link org.jiemamy.utils.enhancer.Invocation}をラップして、
+	 * {@link MethodInvocation}としての振る舞いを提供する。
+	 * 
+	 * @version $Id$
+	 * @author Suguru ARAKAWA
+	 */
 	private static class MethodInvocationDriver extends AbstractInvocationDriver implements MethodInvocation {
 		
 		private Method executable;
@@ -221,11 +256,25 @@
 			executable = (Method) target;
 		}
 		
+		public Object getThis() {
+			if (Modifier.isStatic(executable.getModifiers()) == false) {
+				return invocation.getInvoker();
+			}
+			return null;
+		}
+		
 		public Method getMethod() {
 			return executable;
 		}
 	}
 	
+	/**
+	 * {@link org.jiemamy.utils.enhancer.Invocation}をラップして、
+	 * {@link ConstructorInvocation}としての振る舞いを提供する。
+	 * 
+	 * @version $Id$
+	 * @author Suguru ARAKAWA
+	 */
 	private static class ConstructorInvocationDriver extends AbstractInvocationDriver implements ConstructorInvocation {
 		
 		private Constructor<?> executable;
@@ -242,6 +291,10 @@
 			executable = (Constructor<?>) target;
 		}
 		
+		public Object getThis() {
+			return null;
+		}
+		
 		public Constructor<?> getConstructor() {
 			return executable;
 		}

Modified: leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/driver/ProxyDriver.java
===================================================================
--- leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/driver/ProxyDriver.java	2009-10-08 07:54:36 UTC (rev 3731)
+++ leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/driver/ProxyDriver.java	2009-10-08 12:39:30 UTC (rev 3732)
@@ -29,15 +29,35 @@
 
 /**
  * {@link java.lang.reflect.Proxy}のインスタンスを生成するための{@link Enhance}を作成する。
+ * <p>
+ * このクラスを利用して作成したエンハンスは、インターフェースのインスタンス生成に関するもののみである。
+ * そのため、
+ * {@link org.jiemamy.utils.enhancer.FactoryEnhancer}でこれを利用することはできず
+ * {@link org.jiemamy.utils.enhancer.InterfaceEnhancer}のみで利用できる。
+ * </p>
+ * <p>
+ * また、このクラスを利用して作成したエンハンスは、インスタンス生成時に既定のインスタンス生成プロセスを利用せず、
+ * {@code java.lang.reflect.Proxy}を利用してインスタンスを直接生成する。
+ * このため、コンストラクタ起動に対するエンハンスのチェインがあった場合においても、
+ * このクラスを利用して作成したエンハンスは、後続するエンハンスのチェインを利用しない。
+ * そのため、インスタンス生成に対してさらに拡張を行う場合、このエンハンスは
+ * エンハンスチェインの末尾におかれる必要がある。
+ * </p>
  * @version $Date$
  * @author Suguru ARAKAWA
  */
 public class ProxyDriver {
 	
 	/**
-	 * 指定のインターフェースが表すインターフェースプロダクトを作成する際に、
-	 * {@link java.lang.reflect.Proxy}を利用してプロダクトインスタンスの代わりに
-	 * Proxyを返すためのエンハンスを作成する。
+	 * {@link java.lang.reflect.Proxy}を利用したエンハンスを作成する。
+	 * <p>
+	 * 返されるエンハンスは、指定のインターフェースが表すインターフェースプロダクトを作成する際に、
+	 * 本来のプロダクトインスタンスではなく{@link java.lang.reflect.Proxy}を利用した
+	 * プロクシインスタンスを生成して返す。
+	 * その際に利用する{@link java.lang.reflect.InvocationHandler}は
+	 * 引数に指定したものを利用する。
+	 * このハンドラオブジェクトは、同一のエンハンスが生成するすべてのプロクシインスタンスで共有する。
+	 * <p>
 	 * @param anInterface Proxyを作成する対象のインターフェース
 	 * @param handler 指定のインターフェースに対するメソッド呼び出しをハンドルするハンドラ
 	 *     これはfactory-enhancerの{@link InvocationHandler}ではなく、
@@ -91,12 +111,9 @@
 		/**
 		 * インスタンスを生成する。
 		 * @param targetName 対象インターフェースの名称
-		 * @throws NullPointerException 引数に{@code null}が指定された場合
 		 */
 		public ProxyPointcut(String targetName) {
-			if (targetName == null) {
-				throw new NullPointerException("targetName is null"); //$NON-NLS-1$
-			}
+			assert targetName != null;
 			this.targetName = targetName;
 		}
 		
@@ -131,17 +148,12 @@
 		 * インスタンスを生成する。
 		 * @param proxyCreator 該当Proxyのインスタンスを生成するコンストラクタ
 		 * @param handler 該当Proxyの各メソッド呼び出しに対するハンドラ
-		 * @throws NullPointerException 引数に{@code null}が指定された場合
 		 */
 		public ProxyHandler(
 				Constructor<?> proxyCreator,
 				java.lang.reflect.InvocationHandler handler) {
-			if (proxyCreator == null) {
-				throw new NullPointerException("proxyCreator is null"); //$NON-NLS-1$
-			}
-			if (handler == null) {
-				throw new NullPointerException("handler is null"); //$NON-NLS-1$
-			}
+			assert proxyCreator != null;
+			assert handler != null;
 			this.proxyCreator = proxyCreator;
 			this.handler = handler;
 		}
@@ -151,7 +163,7 @@
 		 * 代わりにProxyインスタンスを生成して返す。
 		 */
 		public Object handle(Invocation invocation) throws Throwable {
-			// ハンドラインスタンスを共有しない方法も考えたい
+			assert invocation != null;
 			return proxyCreator.newInstance(new Object[] {
 				handler
 			});

Modified: leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/InterfaceEnhancerTest.java
===================================================================
--- leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/InterfaceEnhancerTest.java	2009-10-08 07:54:36 UTC (rev 3731)
+++ leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/InterfaceEnhancerTest.java	2009-10-08 12:39:30 UTC (rev 3732)
@@ -178,6 +178,32 @@
 	}
 	
 	/**
+	 * Test method for {@link AbstractEnhancer#getFactory()}.
+	 * @throws Exception if occur
+	 */
+	@Test
+	public void testGetFactory_ParameterConflict() throws Exception {
+		Enhance enhance = new Enhance(new StringResultPointcut(), new InvocationHandler() {
+			
+			public Object handle(Invocation invocation) {
+				return "Hello";
+			}
+		});
+		InterfaceEnhancer<ParameterConflictInterfaceFactory> enhancer =
+				new InterfaceEnhancer<ParameterConflictInterfaceFactory>(
+				ParameterConflictInterfaceFactory.class,
+				Object.class,
+				enhances(enhance));
+		Factory<? extends ParameterConflictInterfaceFactory> metaFactory = enhancer.getFactory();
+		ParameterConflictInterfaceFactory factory = metaFactory.newInstance();
+		
+		InterfaceProduct p1 = factory.new1(1);
+		InterfaceProduct p2 = factory.new1(2);
+		assertThat(p1.getMessage(), is("Hello"));
+		assertThat(p2.getMessage(), is("Hello"));
+	}
+	
+	/**
 	 * Test method for {@link org.jiemamy.utils.enhancer.AbstractEnhancer#getFactory()}.
 	 * @throws Exception if occur
 	 */
@@ -195,6 +221,39 @@
 	}
 	
 	/**
+	 * Test method for {@link org.jiemamy.utils.enhancer.AbstractEnhancer#getFactory()}.
+	 * @throws Exception if occur
+	 */
+	@Test
+	public void testGetFactory_Inherited() throws Exception {
+		Enhance enhance = new Enhance(new StringResultPointcut(), new InvocationHandler() {
+			
+			public Object handle(Invocation invocation) {
+				if (invocation.getInvoker() instanceof InterfaceProductEx) {
+					return "inherited";
+				}
+				if (invocation.getInvoker() instanceof InterfaceProduct) {
+					return "base";
+				}
+				throw new AssertionError();
+			}
+		});
+		InterfaceEnhancer<SimpleInterfaceFactoryEx> enhancer = new InterfaceEnhancer<SimpleInterfaceFactoryEx>(
+				SimpleInterfaceFactoryEx.class,
+				Object.class,
+				enhances(enhance));
+		Factory<? extends SimpleInterfaceFactoryEx> metaFactory = enhancer.getFactory();
+		SimpleInterfaceFactoryEx factory = metaFactory.newInstance();
+		
+		InterfaceProduct product = factory.newProduct();
+		assertThat(product.getMessage(), is("base"));
+		
+		InterfaceProductEx productEx = factory.newProductEx();
+		assertThat(productEx.getMessage(), is("inherited"));
+		assertThat(productEx.getMessageEx(), is("inherited"));
+	}
+	
+	/**
 	 * Test method for {@link InterfaceEnhancer#InterfaceEnhancer(java.lang.Class, java.lang.Class, java.util.List)}.
 	 */
 	@Test(expected = IllegalArgumentException.class)

Added: leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/InterfaceProductEx.java
===================================================================
--- leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/InterfaceProductEx.java	                        (rev 0)
+++ leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/InterfaceProductEx.java	2009-10-08 12:39:30 UTC (rev 3732)
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2007-2009 Jiemamy Project and the Others.
+ * Created on 2009/10/04
+ *
+ * This file is part of Jiemamy.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.jiemamy.utils.enhancer;
+
+/**
+ * 単純なプロダクト。
+ * @version $Id$
+ * @author Suguru ARAKAWA
+ */
+public interface InterfaceProductEx extends InterfaceProduct {
+	
+	/**
+	 * @return nothing
+	 */
+	String getMessageEx();
+}


Property changes on: leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/InterfaceProductEx.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Author Id Revision HeadURL
Added: svn:eol-style
   + native

Added: leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/ParameterConflictInterfaceFactory.java
===================================================================
--- leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/ParameterConflictInterfaceFactory.java	                        (rev 0)
+++ leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/ParameterConflictInterfaceFactory.java	2009-10-08 12:39:30 UTC (rev 3732)
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2007-2009 Jiemamy Project and the Others.
+ * Created on 2009/10/04
+ *
+ * This file is part of Jiemamy.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.jiemamy.utils.enhancer;
+
+/**
+ * 単純なインターフェースファクトリ。
+ * @version $Id$
+ * @author Suguru ARAKAWA
+ */
+public interface ParameterConflictInterfaceFactory {
+	
+	/**
+	 * @param a A parameter
+	 * @return {@link InterfaceProduct}
+	 */
+	InterfaceProduct new1(int a);
+	
+	/**
+	 * @param a A parameter
+	 * @return {@link InterfaceProduct}
+	 */
+	InterfaceProduct new2(int a);
+}


Property changes on: leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/ParameterConflictInterfaceFactory.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Author Id Revision HeadURL
Added: svn:eol-style
   + native

Added: leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/SimpleInterfaceFactoryEx.java
===================================================================
--- leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/SimpleInterfaceFactoryEx.java	                        (rev 0)
+++ leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/SimpleInterfaceFactoryEx.java	2009-10-08 12:39:30 UTC (rev 3732)
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2007-2009 Jiemamy Project and the Others.
+ * Created on 2009/10/04
+ *
+ * This file is part of Jiemamy.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.jiemamy.utils.enhancer;
+
+/**
+ * 単純なインターフェースファクトリ。
+ * @version $Id$
+ * @author Suguru ARAKAWA
+ */
+public interface SimpleInterfaceFactoryEx extends SimpleInterfaceFactory {
+	
+	/**
+	 * @return {@link InterfaceProductEx}
+	 */
+	InterfaceProductEx newProductEx();
+}


Property changes on: leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/SimpleInterfaceFactoryEx.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Author Id Revision HeadURL
Added: svn:eol-style
   + native

Added: leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/AopAllianceDriverTest.java
===================================================================
--- leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/AopAllianceDriverTest.java	                        (rev 0)
+++ leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/AopAllianceDriverTest.java	2009-10-08 12:39:30 UTC (rev 3732)
@@ -0,0 +1,261 @@
+/*
+ * Copyright 2007-2009 Jiemamy Project and the Others.
+ * Created on 2009/10/08
+ *
+ * This file is part of Jiemamy.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.jiemamy.utils.enhancer.driver;
+
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+import java.lang.reflect.Constructor;
+
+import org.aopalliance.intercept.ConstructorInterceptor;
+import org.aopalliance.intercept.ConstructorInvocation;
+import org.aopalliance.intercept.MethodInterceptor;
+import org.aopalliance.intercept.MethodInvocation;
+import org.junit.Test;
+
+/**
+ * Test for {@link AopAllianceDriver}.
+ * @version $Id$
+ * @author Suguru ARAKAWA
+ */
+public class AopAllianceDriverTest extends DriverTestRoot {
+	
+	/**
+	 * Test method for {@link AopAllianceDriver#toHandler(org.aopalliance.intercept.MethodInterceptor)}.
+	 * @throws Throwable if occur
+	 */
+	@Test
+	public void testToHandler_Method_Through() throws Throwable {
+		MethodInterceptor itor = new MethodInterceptor() {
+			
+			public Object invoke(MethodInvocation invocation) throws Throwable {
+				assertThat(invocation.getThis(), is((Object) "Hello"));
+				assertThat(invocation.getMethod().getName(), is("charAt"));
+				return invocation.proceed();
+			}
+		};
+		Object result = invoke(
+				AopAllianceDriver.toHandler(itor),
+				String.class.getMethod("charAt", int.class),
+				"Hello",
+				0);
+		assertThat(result, is((Object) 'H'));
+	}
+	
+	/**
+	 * Test method for {@link AopAllianceDriver#toHandler(org.aopalliance.intercept.MethodInterceptor)}.
+	 * @throws Throwable if occur
+	 */
+	@Test
+	public void testToHandler_Method_Static() throws Throwable {
+		MethodInterceptor itor = new MethodInterceptor() {
+			
+			public Object invoke(MethodInvocation invocation) throws Throwable {
+				assertThat(invocation.getThis(), is(nullValue()));
+				return invocation.proceed();
+			}
+		};
+		Object result = invoke(
+				AopAllianceDriver.toHandler(itor),
+				Math.class.getMethod("abs", int.class),
+				Math.class,
+				-1);
+		assertThat(result, is((Object) 1));
+	}
+	
+	/**
+	 * Test method for {@link AopAllianceDriver#toHandler(org.aopalliance.intercept.MethodInterceptor)}.
+	 * @throws Throwable if occur
+	 */
+	@Test
+	public void testToHandler_Method_RewriteResult() throws Throwable {
+		MethodInterceptor itor = new MethodInterceptor() {
+			
+			public Object invoke(MethodInvocation invocation) {
+				return "World";
+			}
+		};
+		Object result = invoke(
+				AopAllianceDriver.toHandler(itor),
+				String.class.getMethod("toString"),
+				"Hello");
+		assertThat(result, is((Object) "World"));
+	}
+	
+	/**
+	 * Test method for {@link AopAllianceDriver#toHandler(org.aopalliance.intercept.MethodInterceptor)}.
+	 * @throws Throwable if occur
+	 */
+	@Test
+	public void testToHandler_Method_RewriteArgument() throws Throwable {
+		MethodInterceptor itor = new MethodInterceptor() {
+			
+			public Object invoke(MethodInvocation invocation) throws Throwable {
+				Object[] args = invocation.getArguments();
+				assertThat(args[0], is((Object) 1));
+				args[0] = 2;
+				return invocation.proceed();
+			}
+		};
+		Object result = invoke(
+				AopAllianceDriver.toHandler(itor),
+				String.class.getMethod("charAt", int.class),
+				"Hello",
+				1);
+		assertThat(result, is((Object) 'l'));
+	}
+	
+	/**
+	 * Test method for {@link AopAllianceDriver#toHandler(org.aopalliance.intercept.MethodInterceptor)}.
+	 * @throws Throwable if occur
+	 */
+	@Test(expected = UnsupportedOperationException.class)
+	public void testToHandler_Method_Exception() throws Throwable {
+		MethodInterceptor itor = new MethodInterceptor() {
+			
+			public Object invoke(MethodInvocation invocation) {
+				throw new UnsupportedOperationException();
+			}
+		};
+		invoke(AopAllianceDriver.toHandler(itor),
+				String.class.getMethod("toString"),
+				"Hello");
+	}
+	
+	/**
+	 * Test method for {@link AopAllianceDriver#toHandler(org.aopalliance.intercept.MethodInterceptor)}.
+	 * @throws Throwable if occur
+	 */
+	@Test
+	public void testToHandler_Method_Construct() throws Throwable {
+		MethodInterceptor itor = new MethodInterceptor() {
+			
+			public Object invoke(MethodInvocation invocation) {
+				throw new UnsupportedOperationException();
+			}
+		};
+		Object result = construct(AopAllianceDriver.toHandler(itor),
+				String.class.getConstructor(String.class),
+				"Hello");
+		assertThat(result, is((Object) "Hello"));
+	}
+	
+	/**
+	 * Test method for {@link AopAllianceDriver#toHandler(org.aopalliance.intercept.ConstructorInterceptor)}.
+	 * @throws Throwable if occur
+	 */
+	@Test
+	public void testToHandler_Constructor_Through() throws Throwable {
+		ConstructorInterceptor itor = new ConstructorInterceptor() {
+			
+			public Object construct(ConstructorInvocation invocation) throws Throwable {
+				assertThat(invocation.getThis(), is(nullValue()));
+				Constructor<?> ctor = invocation.getConstructor();
+				assertThat(ctor.getParameterTypes().length, is(1));
+				assertThat(ctor.getParameterTypes()[0], is((Object) String.class));
+				return invocation.proceed();
+			}
+		};
+		Object result = construct(
+				AopAllianceDriver.toHandler(itor),
+				String.class.getConstructor(String.class),
+				"Hello");
+		assertThat(result, is((Object) "Hello"));
+	}
+	
+	/**
+	 * Test method for {@link AopAllianceDriver#toHandler(org.aopalliance.intercept.ConstructorInterceptor)}.
+	 * @throws Throwable if occur
+	 */
+	@Test
+	public void testToHandler_Constructor_RewriteResult() throws Throwable {
+		ConstructorInterceptor itor = new ConstructorInterceptor() {
+			
+			public Object construct(ConstructorInvocation invocation) {
+				return new String("World".toCharArray());
+			}
+		};
+		Object result = construct(
+				AopAllianceDriver.toHandler(itor),
+				String.class.getConstructor(String.class),
+				"Hello");
+		assertThat(result, is((Object) "World"));
+	}
+	
+	/**
+	 * Test method for {@link AopAllianceDriver#toHandler(org.aopalliance.intercept.ConstructorInterceptor)}.
+	 * @throws Throwable if occur
+	 */
+	@Test
+	public void testToHandler_Constructor_RewriteArgument() throws Throwable {
+		ConstructorInterceptor itor = new ConstructorInterceptor() {
+			
+			public Object construct(ConstructorInvocation invocation) throws Throwable {
+				Object[] arguments = invocation.getArguments();
+				assertThat(arguments.length, is(1));
+				arguments[0] = "World";
+				return invocation.proceed();
+			}
+		};
+		Object result = construct(
+				AopAllianceDriver.toHandler(itor),
+				String.class.getConstructor(String.class),
+				"Hello");
+		assertThat(result, is((Object) "World"));
+	}
+	
+	/**
+	 * Test method for {@link AopAllianceDriver#toHandler(org.aopalliance.intercept.ConstructorInterceptor)}.
+	 * @throws Throwable if occur
+	 */
+	@Test(expected = IllegalStateException.class)
+	public void testToHandler_Constructor_Exception() throws Throwable {
+		ConstructorInterceptor itor = new ConstructorInterceptor() {
+			
+			public Object construct(ConstructorInvocation invocation) throws Throwable {
+				throw new IllegalStateException();
+			}
+		};
+		construct(
+				AopAllianceDriver.toHandler(itor),
+				String.class.getConstructor(String.class),
+				"Hello");
+	}
+	
+	/**
+	 * Test method for {@link AopAllianceDriver#toHandler(org.aopalliance.intercept.ConstructorInterceptor)}.
+	 * @throws Throwable if occur
+	 */
+	@Test
+	public void testToHandler_Constructor_Invoke() throws Throwable {
+		ConstructorInterceptor itor = new ConstructorInterceptor() {
+			
+			public Object construct(ConstructorInvocation invocation) throws Throwable {
+				throw new AssertionError();
+			}
+		};
+		Object result = invoke(
+				AopAllianceDriver.toHandler(itor),
+				String.class.getMethod("charAt", int.class),
+				"Hello",
+				1);
+		assertThat(result, is((Object) 'e'));
+	}
+}


Property changes on: leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/AopAllianceDriverTest.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Author Id Revision HeadURL
Added: svn:eol-style
   + native

Added: leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/DriverTestRoot.java
===================================================================
--- leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/DriverTestRoot.java	                        (rev 0)
+++ leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/DriverTestRoot.java	2009-10-08 12:39:30 UTC (rev 3732)
@@ -0,0 +1,229 @@
+/*
+ * Copyright 2007-2009 Jiemamy Project and the Others.
+ * Created on 2009/10/08
+ *
+ * This file is part of Jiemamy.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.jiemamy.utils.enhancer.driver;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Member;
+import java.lang.reflect.Method;
+
+import javassist.ClassPool;
+import javassist.CtClass;
+import javassist.CtConstructor;
+import javassist.CtMethod;
+import javassist.LoaderClassPath;
+import javassist.NotFoundException;
+
+import org.junit.Before;
+
+import org.jiemamy.utils.enhancer.Invocation;
+import org.jiemamy.utils.enhancer.InvocationHandler;
+import org.jiemamy.utils.enhancer.InvocationPointcut;
+
+/**
+ * このパッケージのテストで利用するテスト基底クラス。
+ * @version $Id$
+ * @author Suguru ARAKAWA
+ */
+public class DriverTestRoot {
+	
+	/**
+	 * 現在のクラスローダを元に構築したクラスプール。
+	 */
+	protected ClassPool pool;
+	
+
+	/**
+	 * テストを初期化する。
+	 * @throws Exception if occur
+	 */
+	@Before
+	public void setUp() throws Exception {
+		pool = new ClassPool();
+		pool.appendClassPath(new LoaderClassPath(getClass().getClassLoader()));
+	}
+	
+	/**
+	 * コンストラクタ起動を指定のハンドラにハンドルさせる。
+	 * @param handler 対象のハンドラ
+	 * @param constructor 対象のコンストラクタ
+	 * @param arguments 引数リスト
+	 * @return {@code handler.handle()}の実行結果
+	 * @throws Throwable {@code handler.handle()}の実行時に例外が発生した場合
+	 */
+	protected Object construct(
+			InvocationHandler handler,
+			final Constructor<?> constructor,
+			final Object... arguments) throws Throwable {
+		Invocation invocation = new Invocation() {
+			
+			public Object proceed() throws InvocationTargetException {
+				try {
+					return constructor.newInstance(arguments);
+				} catch (InstantiationException e) {
+					throw new AssertionError(e);
+				} catch (IllegalAccessException e) {
+					throw new AssertionError(e);
+				}
+			}
+			
+			public Member getTarget() {
+				return constructor;
+			}
+			
+			public Object getInvoker() {
+				return constructor.getDeclaringClass();
+			}
+			
+			public Object[] getArguments() {
+				return arguments;
+			}
+		};
+		return handler.handle(invocation);
+	}
+	
+	/**
+	 * コンストラクタ起動を指定のハンドラにハンドルさせる。
+	 * @param handler 対象のハンドラ
+	 * @param method 対象のメソッド
+	 * @param self 対象のコンテキスト(may be {@code this} keyword)
+	 * @param arguments 引数リスト
+	 * @return {@code handler.handle()}の実行結果
+	 * @throws Throwable {@code handler.handle()}の実行時に例外が発生した場合
+	 */
+	protected Object invoke(
+			InvocationHandler handler,
+			final Method method,
+			final Object self,
+			final Object... arguments) throws Throwable {
+		Invocation invocation = new Invocation() {
+			
+			public Object proceed() throws InvocationTargetException {
+				try {
+					return method.invoke(self, arguments);
+				} catch (IllegalAccessException e) {
+					throw new AssertionError();
+				}
+			}
+			
+			public Member getTarget() {
+				return method;
+			}
+			
+			public Object getInvoker() {
+				return self;
+			}
+			
+			public Object[] getArguments() {
+				return arguments;
+			}
+		};
+		return handler.handle(invocation);
+	}
+	
+	/**
+	 * 対象のポイントカットに対し、指定のメソッドが対象となるかどうかを表明する。
+	 * @param targetOrNot {@code true}ならば対象であることを表明する
+	 * @param pointcut テスト対象のポイントカット
+	 * @param selfClass メソッドを公開するクラス
+	 * @param declaringClass メソッドを実際に宣言するクラス
+	 * @param name メソッド名
+	 * @param descriptor メソッドデスクリプタ
+	 */
+	protected void assertTargetMethod(
+			boolean targetOrNot,
+			InvocationPointcut pointcut,
+			Class<?> selfClass,
+			Class<?> declaringClass,
+			String name,
+			String descriptor) {
+		try {
+			CtClass ctSelfClass = pool.get(selfClass.getName());
+			CtClass ctDeclaringClass = pool.get(declaringClass.getName());
+			CtMethod method = findMethod(ctDeclaringClass, name, descriptor);
+			assertThat(
+					ctSelfClass.getName() + "." + name + descriptor,
+					pointcut.isTarget(ctSelfClass, method),
+					is(targetOrNot));
+		} catch (NotFoundException e) {
+			throw new AssertionError(e);
+		}
+	}
+	
+	/**
+	 * 対象のポイントカットに対し、指定のメソッドが対象となるかどうかを表明する。
+	 * @param targetOrNot {@code true}ならば対象であることを表明する
+	 * @param pointcut テスト対象のポイントカット
+	 * @param selfClass コンストラクタを公開するクラス
+	 * @param declaringClass コンストラクタを実際に宣言するクラス
+	 * @param descriptor メソッドデスクリプタ
+	 */
+	protected void assertTargetConstructor(
+			boolean targetOrNot,
+			InvocationPointcut pointcut,
+			Class<?> selfClass,
+			Class<?> declaringClass,
+			String descriptor) {
+		try {
+			CtClass ctSelfClass = pool.get(selfClass.getName());
+			CtClass ctDeclaringClass = pool.get(declaringClass.getName());
+			CtConstructor ctor = findConstructor(ctDeclaringClass, descriptor);
+			assertThat(
+					ctSelfClass.getName() + descriptor,
+					pointcut.isTarget(ctSelfClass, ctor),
+					is(targetOrNot));
+		} catch (NotFoundException e) {
+			throw new AssertionError(e);
+		}
+	}
+	
+	private CtMethod findMethod(
+			CtClass declaring,
+			String name,
+			String descriptor) {
+		for (CtMethod method : declaring.getDeclaredMethods()) {
+			if (method.getName().equals(name) == false) {
+				continue;
+			}
+			if (method.getSignature().equals(descriptor) == false) {
+				continue;
+			}
+			return method;
+		}
+		throw new AssertionError(declaring.getName() + "." + name + descriptor);
+	}
+	
+	private CtConstructor findConstructor(
+			CtClass declaring,
+			String descriptor) {
+		for (CtConstructor ctor : declaring.getDeclaredConstructors()) {
+			if (ctor.isClassInitializer()) {
+				continue;
+			}
+			if (ctor.getSignature().equals(descriptor) == false) {
+				continue;
+			}
+			return ctor;
+		}
+		throw new AssertionError(declaring.getName() + "." + descriptor);
+	}
+}


Property changes on: leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/DriverTestRoot.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Author Id Revision HeadURL
Added: svn:eol-style
   + native

Added: leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/ProxyDriverTest.java
===================================================================
--- leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/ProxyDriverTest.java	                        (rev 0)
+++ leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/ProxyDriverTest.java	2009-10-08 12:39:30 UTC (rev 3732)
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2007-2009 Jiemamy Project and the Others.
+ * Created on 2009/10/08
+ *
+ * This file is part of Jiemamy.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.jiemamy.utils.enhancer.driver;
+
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.junit.Assert.assertThat;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+
+import org.junit.Test;
+
+import org.jiemamy.utils.enhancer.Enhance;
+
+/**
+ * Test for {@link ProxyDriver}.
+ * @version $Id$
+ * @author Suguru ARAKAWA
+ */
+public class ProxyDriverTest extends DriverTestRoot {
+	
+	private static InvocationHandler DUMMY = new InvocationHandler() {
+		
+		public Object invoke(Object proxy, Method method, Object[] args) {
+			throw new AssertionError();
+		}
+	};
+	
+
+	/**
+	 * Test method for {@link ProxyDriver#newEnhance(java.lang.Class, java.lang.reflect.InvocationHandler)}.
+	 */
+	@Test(expected = IllegalArgumentException.class)
+	public void testNewEnhance_NotInterface() {
+		ProxyDriver.newEnhance(Object.class, DUMMY);
+	}
+	
+	/**
+	 * Test method for {@link ProxyDriver#newEnhance(java.lang.Class, java.lang.reflect.InvocationHandler)}.
+	 */
+	@Test
+	public void testNewEnhance_TargetInterface() {
+		Enhance enhance = ProxyDriver.newEnhance(Runnable.class, DUMMY);
+		assertTargetConstructor(true, enhance.getPointcut(),
+				Runnable.class,
+				Thread.class,
+				"()V");
+		assertTargetConstructor(true, enhance.getPointcut(),
+				Runnable.class,
+				Thread.class,
+				"(Ljava/lang/String;)V");
+	}
+	
+	/**
+	 * Test method for {@link ProxyDriver#newEnhance(java.lang.Class, java.lang.reflect.InvocationHandler)}.
+	 */
+	@Test
+	public void testNewEnhance_TargetSubInterface() {
+		Enhance enhance = ProxyDriver.newEnhance(Runnable.class, DUMMY);
+		assertTargetConstructor(false, enhance.getPointcut(),
+				RunnableEx.class,
+				RunnableExImpl.class,
+				"()V");
+	}
+	
+	/**
+	 * Test method for {@link ProxyDriver#newEnhance(java.lang.Class, java.lang.reflect.InvocationHandler)}.
+	 */
+	@Test
+	public void testNewEnhance_TargetMethod() {
+		Enhance enhance = ProxyDriver.newEnhance(Runnable.class, DUMMY);
+		assertTargetMethod(false, enhance.getPointcut(),
+				Runnable.class,
+				Runnable.class,
+				"run",
+				"()V");
+	}
+	
+	/**
+	 * Test method for {@link ProxyDriver#newEnhance(java.lang.Class, java.lang.reflect.InvocationHandler)}.
+	 * @throws Throwable if occur
+	 */
+	@Test
+	public void testNewEnhance_Handle() throws Throwable {
+		Enhance enhance = ProxyDriver.newEnhance(CharSequence.class, new InvocationHandler() {
+			
+			public Object invoke(Object proxy, Method method, Object[] args) {
+				assertThat(method.getName(), is("toString"));
+				return "OK";
+			}
+		});
+		
+		Object result = construct(enhance.getHandler(),
+				String.class.getConstructor());
+		
+		assertThat(result, instanceOf(CharSequence.class));
+		assertThat(result, not(instanceOf(String.class)));
+		CharSequence proxy = (CharSequence) result;
+		assertThat(proxy.toString(), is("OK"));
+	}
+}


Property changes on: leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/ProxyDriverTest.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Author Id Revision HeadURL
Added: svn:eol-style
   + native

Added: leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/RunnableEx.java
===================================================================
--- leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/RunnableEx.java	                        (rev 0)
+++ leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/RunnableEx.java	2009-10-08 12:39:30 UTC (rev 3732)
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2007-2009 Jiemamy Project and the Others.
+ * Created on 2009/10/08
+ *
+ * This file is part of Jiemamy.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.jiemamy.utils.enhancer.driver;
+
+/**
+ * {@link Runnable}を拡張したインターフェース。
+ * @version $Id$
+ * @author Suguru ARAKAWA
+ */
+public interface RunnableEx extends Runnable {
+	
+}


Property changes on: leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/RunnableEx.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Author Id Revision HeadURL
Added: svn:eol-style
   + native

Added: leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/RunnableExImpl.java
===================================================================
--- leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/RunnableExImpl.java	                        (rev 0)
+++ leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/RunnableExImpl.java	2009-10-08 12:39:30 UTC (rev 3732)
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2007-2009 Jiemamy Project and the Others.
+ * Created on 2009/10/08
+ *
+ * This file is part of Jiemamy.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.jiemamy.utils.enhancer.driver;
+
+/**
+ * {@link RunnableEx}の実装。
+ * @version $Id$
+ * @author Suguru ARAKAWA
+ */
+public class RunnableExImpl implements RunnableEx {
+	
+	public void run() {
+		return;
+	}
+}


Property changes on: leto/factory-enhancer/branches/interface-enhancer/src/test/java/org/jiemamy/utils/enhancer/driver/RunnableExImpl.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Author Id Revision HeadURL
Added: svn:eol-style
   + native




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