You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by rf...@apache.org on 2008/06/11 17:25:59 UTC

svn commit: r666703 - /incubator/tuscany/java/sca/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceIntrospectorImpl.java

Author: rfeng
Date: Wed Jun 11 08:25:58 2008
New Revision: 666703

URL: http://svn.apache.org/viewvc?rev=666703&view=rev
Log:
Add the missing file in the previous commit

Modified:
    incubator/tuscany/java/sca/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceIntrospectorImpl.java

Modified: incubator/tuscany/java/sca/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceIntrospectorImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceIntrospectorImpl.java?rev=666703&r1=666702&r2=666703&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceIntrospectorImpl.java (original)
+++ incubator/tuscany/java/sca/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceIntrospectorImpl.java Wed Jun 11 08:25:58 2008
@@ -69,15 +69,16 @@
         this.visitors = javaFactory.getInterfaceVisitors();
     }
 
-    public void introspectInterface(JavaInterface javaInterface, Class<?> clazz) throws InvalidInterfaceException {
+    public void introspectInterface(JavaInterface javaInterface, Class<?> clazz)
+        throws InvalidInterfaceException {
         javaInterface.setJavaClass(clazz);
 
         boolean remotable = clazz.isAnnotationPresent(Remotable.class);
-        
+
         // Consider @javax.ejb.Remote, java.rmi.Remote and javax.ejb.EJBObject
         // equivalent to @Remotable
         if (!remotable) {
-            for (Annotation annotation: clazz.getAnnotations()) {
+            for (Annotation annotation : clazz.getAnnotations()) {
                 if ("javax.ejb.Remote".equals(annotation.annotationType().getName())) {
                     remotable = true;
                     break;
@@ -85,14 +86,14 @@
             }
         }
         if (!remotable) {
-            for (Class<?> superInterface: clazz.getInterfaces()) {
+            for (Class<?> superInterface : clazz.getInterfaces()) {
                 if (Remote.class == superInterface || "javax.ejb.EJBObject".equals(superInterface.getName())) {
                     remotable = true;
                     break;
                 }
             }
         }
-        
+
         javaInterface.setRemotable(remotable);
 
         boolean conversational = clazz.isAnnotationPresent(Conversational.class);
@@ -103,10 +104,10 @@
         if (callback != null && !Void.class.equals(callback.value())) {
             callbackClass = callback.value();
             if (remotable && !callbackClass.isAnnotationPresent(Remotable.class)) {
-            	throw new InvalidCallbackException("Callback must be remotable on a remotable interface");
+                throw new InvalidCallbackException("Callback must be remotable on a remotable interface");
             }
             if (!remotable && callbackClass.isAnnotationPresent(Remotable.class)) {
-            	throw new InvalidCallbackException("Callback must not be remotable on a local interface");
+                throw new InvalidCallbackException("Callback must not be remotable on a local interface");
             }
         } else if (callback != null && Void.class.equals(callback.value())) {
             throw new InvalidCallbackException("No callback interface specified on annotation");
@@ -141,10 +142,15 @@
         return rawType;
     }
 
-    private <T> List<Operation> getOperations(Class<T> clazz, boolean remotable, boolean conversational, String ns)
-        throws InvalidInterfaceException {
-
-        Type[] genericInterfaces = clazz.getGenericInterfaces();
+    private <T> List<Operation> getOperations(Class<T> clazz,
+                                              boolean remotable,
+                                              boolean conversational,
+                                              String ns) throws InvalidInterfaceException {
+
+        Set<Type> genericInterfaces = new HashSet<Type>();
+        for (Type t : clazz.getGenericInterfaces()) {
+            genericInterfaces.add(t);
+        }
         Map<String, Type> typeBindings = new HashMap<String, Type>();
         for (Type genericInterface : genericInterfaces) {
             if (genericInterface instanceof ParameterizedType) {
@@ -182,16 +188,16 @@
             boolean nonBlocking = method.isAnnotationPresent(OneWay.class);
             if (nonBlocking) {
                 if (!(returnType == void.class)) {
-                        throw new InvalidOperationException(
-                             "Method should return 'void' when declared with an @OneWay annotation. "+method,
-                             method);
+                    throw new InvalidOperationException(
+                                                        "Method should return 'void' when declared with an @OneWay annotation. " + method,
+                                                        method);
                 }
                 if (!(faultTypes.length == 0)) {
-                        throw new InvalidOperationException(
-                             "Method should not declare exceptions with an @OneWay annotation. "+method,
-                             method);
+                    throw new InvalidOperationException(
+                                                        "Method should not declare exceptions with an @OneWay annotation. " + method,
+                                                        method);
                 }
-             }
+            }
 
             ConversationSequence conversationSequence = ConversationSequence.CONVERSATION_NONE;
             if (method.isAnnotationPresent(EndsConversation.class)) {
@@ -208,23 +214,29 @@
             // Set outputType to null for void
             XMLType xmlReturnType = new XMLType(new QName(ns, "return"), null);
             DataType<XMLType> returnDataType =
-                returnType == void.class ? null : new DataTypeImpl<XMLType>(UNKNOWN_DATABINDING, returnType,
-                                                                            xmlReturnType);
+                returnType == void.class ? null : new DataTypeImpl<XMLType>(UNKNOWN_DATABINDING, returnType, method
+                    .getGenericReturnType(), xmlReturnType);
             List<DataType> paramDataTypes = new ArrayList<DataType>(parameterTypes.length);
+            Type[] genericParamTypes = method.getGenericParameterTypes();
             for (int i = 0; i < parameterTypes.length; i++) {
                 Class paramType = parameterTypes[i];
                 XMLType xmlParamType = new XMLType(new QName(ns, "arg" + i), null);
-                paramDataTypes.add(new DataTypeImpl<XMLType>(UNKNOWN_DATABINDING, paramType, xmlParamType));
+                paramDataTypes.add(new DataTypeImpl<XMLType>(UNKNOWN_DATABINDING, paramType, genericParamTypes[i],
+                                                             xmlParamType));
             }
             List<DataType> faultDataTypes = new ArrayList<DataType>(faultTypes.length);
-            for (Class<?> faultType : faultTypes) {
+            Type[] genericFaultTypes = method.getGenericExceptionTypes();
+            for (int i = 0; i < faultTypes.length; i++) {
+                Class<?> faultType = faultTypes[i];
                 // Only add checked exceptions
                 // JAXWS Specification v2.1 section 3.7 says RemoteException should not be mapped
                 if (Exception.class.isAssignableFrom(faultType) && (!RuntimeException.class.isAssignableFrom(faultType))
                     && (!RemoteException.class.isAssignableFrom(faultType))) {
                     XMLType xmlFaultType = new XMLType(new QName(ns, faultType.getSimpleName()), null);
-                    DataType<XMLType> faultDataType = new DataTypeImpl<XMLType>(faultType, xmlFaultType);
-                    faultDataTypes.add(new DataTypeImpl<DataType>(UNKNOWN_DATABINDING, faultType, faultDataType));
+                    DataType<XMLType> faultDataType =
+                        new DataTypeImpl<XMLType>(UNKNOWN_DATABINDING, faultType, genericFaultTypes[i], xmlFaultType);
+                    faultDataTypes.add(new DataTypeImpl<DataType>(UNKNOWN_DATABINDING, faultType, genericFaultTypes[i],
+                                                                  faultDataType));
                 }
             }