Author: kelvingoodson
Date: Thu Jul  9 09:13:52 2009
New Revision: 792466

URL: http://svn.apache.org/viewvc?rev=792466&view=rev
Log:
TUSCANY-3130 ReferenceProcessor's visitMethod method now checks that args are 
not annotated as references

Modified:
    
tuscany/java/sca/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/ReferenceProcessor.java
    
tuscany/java/sca/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/AbstractProcessorTest.java
    
tuscany/java/sca/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/ConstructorReferenceTestCase.java

Modified: 
tuscany/java/sca/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/ReferenceProcessor.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/ReferenceProcessor.java?rev=792466&r1=792465&r2=792466&view=diff
==============================================================================
--- 
tuscany/java/sca/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/ReferenceProcessor.java
 (original)
+++ 
tuscany/java/sca/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/ReferenceProcessor.java
 Thu Jul  9 09:13:52 2009
@@ -20,6 +20,7 @@
 
 import static 
org.apache.tuscany.sca.implementation.java.introspect.JavaIntrospectionHelper.getBaseType;
 
+import java.lang.annotation.Annotation;
 import java.lang.annotation.ElementType;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
@@ -60,27 +61,39 @@
     @Override
     public void visitMethod(Method method, JavaImplementation type) throws 
IntrospectionException {
         Reference annotation = method.getAnnotation(Reference.class);
-        if (annotation == null) {
-            return; // Not a reference annotation.
-        }
-        if (!JavaIntrospectionHelper.isSetter(method)) {
-            throw new IllegalReferenceException("Annotated method is not a 
setter: " + method, method);
-        }
-        String name = annotation.name();
-        if ("".equals(name)) {
-            name = JavaIntrospectionHelper.toPropertyName(method.getName());
-        }
-        JavaElementImpl ref = type.getReferenceMembers().get(name);
-        // Setter override field
-        if (ref != null && ref.getElementType() != ElementType.FIELD) {
-            throw new DuplicateReferenceException(name);
-        }
-        removeReference(ref, type);
-
-        JavaElementImpl element = new JavaElementImpl(method, 0);
-        org.apache.tuscany.sca.assembly.Reference reference = 
createReference(element, name);
-        type.getReferences().add(reference);
-        type.getReferenceMembers().put(name, element);
+        if (annotation != null) {
+       
+               if (!JavaIntrospectionHelper.isSetter(method)) {
+                   throw new IllegalReferenceException("Annotated method is 
not a setter: " + method, method);
+               }
+               String name = annotation.name();
+               if ("".equals(name)) {
+                   name = 
JavaIntrospectionHelper.toPropertyName(method.getName());
+               }
+               JavaElementImpl ref = type.getReferenceMembers().get(name);
+               // Setter override field
+               if (ref != null && ref.getElementType() != ElementType.FIELD) {
+                   throw new DuplicateReferenceException(name);
+               }
+               removeReference(ref, type);
+       
+               JavaElementImpl element = new JavaElementImpl(method, 0);
+               org.apache.tuscany.sca.assembly.Reference reference = 
createReference(element, name);
+               type.getReferences().add(reference);
+               type.getReferenceMembers().put(name, element);
+        }
+        
+        // enforce the constraint that an ordinary method's argument can not 
be a reference
+        Annotation paramsAnnotations[][] = method.getParameterAnnotations();
+        for (int i = 0; i < paramsAnnotations.length; i++) {
+               Annotation argAnnotations[] = paramsAnnotations[i];
+               for (int j = 0; j < argAnnotations.length; j++) {
+                       Annotation ann = argAnnotations[j];
+                       if(argAnnotations[j].annotationType() == 
Reference.class) {
+                               throw new IllegalReferenceException("Argument " 
+ (i+1) + " of method " + method.getName() + " in class " + 
method.getDeclaringClass() + " can not be a Reference");
+                       }
+               }
+               }
     }
 
 

Modified: 
tuscany/java/sca/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/AbstractProcessorTest.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/AbstractProcessorTest.java?rev=792466&r1=792465&r2=792466&view=diff
==============================================================================
--- 
tuscany/java/sca/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/AbstractProcessorTest.java
 (original)
+++ 
tuscany/java/sca/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/AbstractProcessorTest.java
 Thu Jul  9 09:13:52 2009
@@ -19,6 +19,7 @@
 package org.apache.tuscany.sca.implementation.java.introspect.impl;
 
 import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
 
 import org.apache.tuscany.sca.assembly.AssemblyFactory;
 import org.apache.tuscany.sca.assembly.DefaultAssemblyFactory;
@@ -39,8 +40,8 @@
     protected AssemblyFactory factory;
     protected JavaInterfaceFactory javaFactory;
     protected ConstructorProcessor constructorProcessor;
-    private ReferenceProcessor referenceProcessor;
-    private PropertyProcessor propertyProcessor;
+    protected ReferenceProcessor referenceProcessor;
+    protected PropertyProcessor propertyProcessor;
     private ResourceProcessor resourceProcessor;
 
 
@@ -63,6 +64,7 @@
             definition = new JavaConstructorImpl<T>(constructor);
             type.getConstructors().put(constructor, definition);
         }
+        
         JavaParameterImpl[] parameters = definition.getParameters();
         for (int i = 0; i < parameters.length; i++) {
             referenceProcessor.visitConstructorParameter(parameters[i], type);
@@ -71,4 +73,6 @@
             // monitorProcessor.visitConstructorParameter(parameters[i], type);
         }
     }
+    
+ 
 }

Modified: 
tuscany/java/sca/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/ConstructorReferenceTestCase.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/ConstructorReferenceTestCase.java?rev=792466&r1=792465&r2=792466&view=diff
==============================================================================
--- 
tuscany/java/sca/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/ConstructorReferenceTestCase.java
 (original)
+++ 
tuscany/java/sca/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/ConstructorReferenceTestCase.java
 Thu Jul  9 09:13:52 2009
@@ -24,15 +24,22 @@
 import static org.junit.Assert.fail;
 
 import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
 import java.util.List;
 
 import org.apache.tuscany.sca.assembly.Multiplicity;
 import 
org.apache.tuscany.sca.implementation.java.DefaultJavaImplementationFactory;
+import org.apache.tuscany.sca.implementation.java.JavaConstructorImpl;
 import org.apache.tuscany.sca.implementation.java.JavaImplementation;
 import org.apache.tuscany.sca.implementation.java.JavaImplementationFactory;
+import org.apache.tuscany.sca.implementation.java.JavaParameterImpl;
+import org.junit.Ignore;
 import org.junit.Test;
+import org.oasisopen.sca.annotation.Property;
 import org.oasisopen.sca.annotation.Reference;
 
+import com.sun.xml.internal.ws.model.JavaMethodImpl;
+
 /**
  * @version $Rev$ $Date$
  */
@@ -110,6 +117,21 @@
             // expected
         }
     }
+    
+    @Test
+    public void testClassWithBadMethodArgReference() throws Exception {
+        JavaImplementation type = 
javaImplementationFactory.createJavaImplementation();
+        Method meth = BadFoo2.class.getMethod("BadFoo2Method", String.class);
+
+        try {
+               referenceProcessor.visitMethod(meth, type);
+               
+            fail();
+        } catch (IllegalReferenceException e) {
+               e.printStackTrace();
+               System.out.println("Exception successfully received");
+        }
+    }
 
 //    public void testMultiplicityRequired() throws Exception {
     // TODO multiplicity
@@ -169,5 +191,19 @@
         }
 
     }
+    
+    private static class BadFoo2 {
+
+        @org.oasisopen.sca.annotation.Constructor()
+        public BadFoo2(@Property(name = "myProp", required = true)String prop) 
{
+
+        }
+        
+        /** Java can't tell that the @reference argument is disallowed by SCA, 
but the run time must reject it*/
+        public void BadFoo2Method(@Reference(name = "badMethodArgRef")String 
methArg) 
+        {}
+
+ 
+    }
 
 }


Reply via email to