You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mb...@apache.org on 2010/09/16 19:11:16 UTC

svn commit: r997852 - in /commons/proper/proxy/branches/version-2.0-work/stub/src: main/java/org/apache/commons/proxy2/stub/ test/java/org/apache/commons/proxy2/stub/

Author: mbenson
Date: Thu Sep 16 17:11:15 2010
New Revision: 997852

URL: http://svn.apache.org/viewvc?rev=997852&view=rev
Log:
since AnnotationFactory now uses a single StubFactory instance internally, the annotationType() handling can be handled therein.  Having taken away AnnotationStubConfigurer's only reason for being, it is deleted.

Removed:
    commons/proper/proxy/branches/version-2.0-work/stub/src/main/java/org/apache/commons/proxy2/stub/AnnotationStubConfigurer.java
Modified:
    commons/proper/proxy/branches/version-2.0-work/stub/src/main/java/org/apache/commons/proxy2/stub/AnnotationFactory.java
    commons/proper/proxy/branches/version-2.0-work/stub/src/test/java/org/apache/commons/proxy2/stub/AbstractAnnotationFactoryTest.java

Modified: commons/proper/proxy/branches/version-2.0-work/stub/src/main/java/org/apache/commons/proxy2/stub/AnnotationFactory.java
URL: http://svn.apache.org/viewvc/commons/proper/proxy/branches/version-2.0-work/stub/src/main/java/org/apache/commons/proxy2/stub/AnnotationFactory.java?rev=997852&r1=997851&r2=997852&view=diff
==============================================================================
--- commons/proper/proxy/branches/version-2.0-work/stub/src/main/java/org/apache/commons/proxy2/stub/AnnotationFactory.java (original)
+++ commons/proper/proxy/branches/version-2.0-work/stub/src/main/java/org/apache/commons/proxy2/stub/AnnotationFactory.java Thu Sep 16 17:11:15 2010
@@ -26,9 +26,9 @@ import org.apache.commons.proxy2.ProxyUt
 
 /**
  * {@link AnnotationFactory} provides a simplified API over {@link StubProxyFactory}
- * to stub a Java {@link Annotation}.  Non-stubbed methods will return the values
- * that would have been returned from a "real" annotation whose methods' values
- * were unspecified.
+ * to stub a Java {@link Annotation}.  Non-stubbed methods including
+ * {@link Annotation#annotationType()} will return the values that would have been
+ * returned from a "real" annotation whose methods' values were unspecified.
  *
  * @author Matt Benson
  */
@@ -49,7 +49,8 @@ public class AnnotationFactory {
 
     private static final ThreadLocal<Object> CONFIGURER = new ThreadLocal<Object>();
 
-    private static final AnnotationStubConfigurer<Annotation> SHARED_CONFIGURER = new AnnotationStubConfigurer<Annotation>() {
+    private static final StubConfigurer<Annotation> SHARED_CONFIGURER = new StubConfigurer<Annotation>() {
+        
         /**
          * {@inheritDoc}
          */
@@ -62,11 +63,12 @@ public class AnnotationFactory {
          * {@inheritDoc}
          */
         @Override
-        protected void configureAnnotation(Annotation stub) {
+        protected void configure(Annotation stub) {
+            when(stub.annotationType()).thenReturn(getStubType());
             Object o = CONFIGURER.get();
-            if (o instanceof AnnotationStubConfigurer<?>) {
+            if (o instanceof StubConfigurer<?>) {
                 @SuppressWarnings("unchecked")
-                final AnnotationStubConfigurer<Annotation> configurer = (AnnotationStubConfigurer<Annotation>) o;
+                final StubConfigurer<Annotation> configurer = (StubConfigurer<Annotation>) o;
                 configurer.configure(requireStubInterceptor(), stub);
             }
         }
@@ -98,13 +100,13 @@ public class AnnotationFactory {
      * @return stubbed annotation proxy
      */
     public <A extends Annotation> A create(
-            AnnotationStubConfigurer<A> configurer) {
+        StubConfigurer<A> configurer) {
         @SuppressWarnings("unchecked")
         final A result = (A) createInternal(Thread.currentThread()
-                .getContextClassLoader(), configurer);
+            .getContextClassLoader(), configurer);
         return result;
     }
-
+    
     /**
      * Create an annotation of the type supported by <code>configurer</code> in the specified classpath.
      * @param <A>
@@ -113,12 +115,12 @@ public class AnnotationFactory {
      * @return stubbed annotation proxy
      */
     public <A extends Annotation> A create(ClassLoader classLoader,
-            AnnotationStubConfigurer<A> configurer) {
+        StubConfigurer<A> configurer) {
         @SuppressWarnings("unchecked")
         final A result = (A) createInternal(classLoader, configurer);
         return result;
     }
-
+    
     /**
      * Create an annotation of <code>annotationType</code> with fully default behavior.
      * @param <A>
@@ -149,6 +151,7 @@ public class AnnotationFactory {
 
     private <A extends Annotation> A createInternal(ClassLoader classLoader,
             Object configurer) {
+        final Object existingConfigurer = CONFIGURER.get();
         try {
             CONFIGURER.set(configurer);
             @SuppressWarnings("unchecked")
@@ -156,7 +159,11 @@ public class AnnotationFactory {
                     ANNOTATION_INVOKER, getStubType());
             return result;
         } finally {
-            CONFIGURER.remove();
+            if (existingConfigurer == null) {
+                CONFIGURER.remove();
+            } else {
+                CONFIGURER.set(existingConfigurer);
+            }
         }
     }
 
@@ -168,7 +175,7 @@ public class AnnotationFactory {
             return result;
         }
         @SuppressWarnings("unchecked")
-        final AnnotationStubConfigurer<A> configurer = (AnnotationStubConfigurer<A>) o;
+        final StubConfigurer<A> configurer = (StubConfigurer<A>) o;
         return configurer.getStubType();
     }
 }

Modified: commons/proper/proxy/branches/version-2.0-work/stub/src/test/java/org/apache/commons/proxy2/stub/AbstractAnnotationFactoryTest.java
URL: http://svn.apache.org/viewvc/commons/proper/proxy/branches/version-2.0-work/stub/src/test/java/org/apache/commons/proxy2/stub/AbstractAnnotationFactoryTest.java?rev=997852&r1=997851&r2=997852&view=diff
==============================================================================
--- commons/proper/proxy/branches/version-2.0-work/stub/src/test/java/org/apache/commons/proxy2/stub/AbstractAnnotationFactoryTest.java (original)
+++ commons/proper/proxy/branches/version-2.0-work/stub/src/test/java/org/apache/commons/proxy2/stub/AbstractAnnotationFactoryTest.java Thu Sep 16 17:11:15 2010
@@ -20,8 +20,6 @@ package org.apache.commons.proxy2.stub;
 import static org.junit.Assert.*;
 
 import org.apache.commons.proxy2.ProxyFactory;
-import org.apache.commons.proxy2.stub.AnnotationFactory;
-import org.apache.commons.proxy2.stub.AnnotationStubConfigurer;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -50,10 +48,10 @@ public abstract class AbstractAnnotation
 
     @Test
     public void testStubbedAnnotation() {
-        CustomAnnotation customAnnotation = annotationFactory.create(new AnnotationStubConfigurer<CustomAnnotation>() {
+        CustomAnnotation customAnnotation = annotationFactory.create(new StubConfigurer<CustomAnnotation>() {
 
             @Override
-            protected void configureAnnotation(CustomAnnotation stub) {
+            protected void configure(CustomAnnotation stub) {
                 when(stub.someType()).thenReturn(Object.class).when(stub.finiteValues())
                     .thenReturn(FiniteValues.ONE, FiniteValues.THREE).when(stub.annString()).thenReturn("hey");
             }
@@ -65,6 +63,28 @@ public abstract class AbstractAnnotation
         assertEquals(Object.class, customAnnotation.someType());
     }
 
+    @Test
+    public void testNestedStubbedAnnotation() {
+        NestingAnnotation nestingAnnotation =
+            annotationFactory.create(new StubConfigurer<NestingAnnotation>() {
+                @Override
+                protected void configure(NestingAnnotation stub) {
+                    when(stub.child()).thenReturn(annotationFactory.create(CustomAnnotation.class))
+                        .when(stub.somethingElse()).thenReturn("somethingElse");
+                }
+            });
+        assertEquals("", nestingAnnotation.child().annString());
+        assertEquals(0, nestingAnnotation.child().finiteValues().length);
+        assertEquals(null, nestingAnnotation.child().someType());
+        assertEquals("somethingElse", nestingAnnotation.somethingElse());
+    }
+
+    public @interface NestingAnnotation {
+        CustomAnnotation child();
+
+        String somethingElse();
+    }
+
     public @interface CustomAnnotation {
         String annString() default "";