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 2010/07/16 19:49:21 UTC

svn commit: r964880 - in /tuscany/sca-java-2.x/trunk/modules: binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/ binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/json/provider/ binding-rest...

Author: rfeng
Date: Fri Jul 16 17:49:20 2010
New Revision: 964880

URL: http://svn.apache.org/viewvc?rev=964880&view=rev
Log:
Align the JAX-RS resource class/method checks with the spec
Allow the binding.rest client to issue RPC over GET calls

Added:
    tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/JAXRSHelper.java   (with props)
Modified:
    tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSReader.java
    tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSWriter.java
    tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingInvoker.java
    tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTServiceBindingProvider.java
    tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/json/provider/JSONWireFormatServiceProvider.java
    tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/xml/provider/XMLWireFormatServiceProvider.java
    tuscany/sca-java-2.x/trunk/modules/interface-java-jaxrs/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxrs/JAXRSJavaInterfaceProcessor.java

Modified: tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSReader.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSReader.java?rev=964880&r1=964879&r2=964880&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSReader.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSReader.java Fri Jul 16 17:49:20 2010
@@ -66,7 +66,10 @@ public class DataBindingJAXRSReader<T> e
         // FIXME: [rfeng] This is a hack to handle application/json
         if (MediaType.APPLICATION_JSON_TYPE.equals(mediaType)) {
             dataBinding = mediaType.toString() + "#" + InputStream.class.getName();
-        } else if (MediaType.APPLICATION_XML_TYPE.equals(mediaType) || MediaType.TEXT_XML_TYPE.equals(mediaType)) {
+        } else if ("application/x-protobuf".equals(mediaType.toString())) {
+            dataBinding = mediaType.toString() + "#" + InputStream.class.getName();
+        }
+        else if (MediaType.APPLICATION_XML_TYPE.equals(mediaType) || MediaType.TEXT_XML_TYPE.equals(mediaType)) {
             dataBinding = InputStream.class.getName();
         } else {
             dataBinding = targetDataType.getDataBinding();

Modified: tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSWriter.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSWriter.java?rev=964880&r1=964879&r2=964880&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSWriter.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSWriter.java Fri Jul 16 17:49:20 2010
@@ -69,7 +69,10 @@ public class DataBindingJAXRSWriter<T> e
             dataBinding = mediaType.toString() + "#" + OutputStream.class.getName();
         } else if (MediaType.APPLICATION_XML_TYPE.equals(mediaType) || MediaType.TEXT_XML_TYPE.equals(mediaType)) {
             dataBinding = OutputStream.class.getName();
-        } else {
+        } else if ("application/x-protobuf".equals(mediaType.toString())) {
+            dataBinding = mediaType.toString() + "#" + OutputStream.class.getName();
+        }
+        else {
             dataBinding = dataType.getDataBinding();
             write(entityStream, t, type);
             return;

Added: tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/JAXRSHelper.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/JAXRSHelper.java?rev=964880&view=auto
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/JAXRSHelper.java (added)
+++ tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/JAXRSHelper.java Fri Jul 16 17:49:20 2010
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.apache.tuscany.sca.binding.rest.provider;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+
+import javax.ws.rs.HttpMethod;
+import javax.ws.rs.Path;
+
+/**
+ * A utility class that deals with JAX-RS annotations
+ */
+public class JAXRSHelper {
+    private JAXRSHelper() {
+
+    }
+
+    /**
+     * A resource class is a Java class that uses JAX-RS annotations to implement a corresponding Web resource.
+     * Resource classes are POJOs that have at least one method annotated with @Path or a request method designator.
+     * @param cls
+     * @return
+     */
+    public static boolean isJAXRSResource(Class<?> cls) {
+        for (Method method : cls.getMethods()) {
+            if (method.isAnnotationPresent(Path.class)) {
+                return true;
+            }
+            if (isResourceMethod(method)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Root resource class is a resource class annotated with @Path. Root resource classes provide the roots of the
+     * resource class tree and provide access to sub-resources
+     * @param cls
+     * @return
+     */
+    public static boolean isJAXRSRootResource(Class<?> cls) {
+        return cls.isAnnotationPresent(Path.class) && isJAXRSResource(cls);
+    }
+
+    public static boolean isResourceMethod(Method method) {
+        for (Annotation a : method.getAnnotations()) {
+            Class<?> annotationType = a.annotationType();
+            if (annotationType == HttpMethod.class) {
+                return true;
+            }
+            // Http method related annotations such as @GET, @POST will have itself annotated with
+            // @HttpMethod
+            HttpMethod m = a.annotationType().getAnnotation(HttpMethod.class);
+            if (m != null) {
+                return true;
+            }
+        }
+        return false;
+
+    }
+}

Propchange: tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/JAXRSHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/JAXRSHelper.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingInvoker.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingInvoker.java?rev=964880&r1=964879&r2=964880&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingInvoker.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingInvoker.java Fri Jul 16 17:49:20 2010
@@ -43,6 +43,7 @@ import javax.ws.rs.MatrixParam;
 import javax.ws.rs.OPTIONS;
 import javax.ws.rs.POST;
 import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
@@ -107,9 +108,9 @@ public class RESTBindingInvoker implemen
 
     private RestClient createRestClient() {
         ClientConfig config = new ClientConfig();
-        
+
         // configureBasicAuth(config, userName, password);
-        
+
         config.applications(new Application() {
 
             @Override
@@ -127,6 +128,9 @@ public class RESTBindingInvoker implemen
 
         });
         RestClient client = new RestClient(config);
+        
+        // Default to GET for RPC
+        httpMethod = HttpMethod.GET;
 
         for (Map.Entry<Class<?>, String> e : mapping.entrySet()) {
             if (operation.getAttributes().get(e.getKey()) != null) {
@@ -154,12 +158,21 @@ public class RESTBindingInvoker implemen
 
         Object entity = null;
         Object[] args = msg.getBody();
-        
+
         URI uri = URI.create(binding.getURI());
         UriBuilder uriBuilder = UriBuilder.fromUri(uri);
 
         Method method = ((JavaOperation)operation).getJavaMethod();
-        uriBuilder.path(method);
+
+        if (method.isAnnotationPresent(Path.class)) {
+            // Only for resource method
+            uriBuilder.path(method);
+        }
+
+        if (!JAXRSHelper.isResourceMethod(method)) {
+            // This is RPC over GET
+            uriBuilder.replaceQueryParam("method", method.getName());
+        }
 
         Map<String, Object> pathParams = new HashMap<String, Object>();
         Map<String, Object> matrixParams = new HashMap<String, Object>();
@@ -168,8 +181,8 @@ public class RESTBindingInvoker implemen
         Map<String, Object> formParams = new HashMap<String, Object>();
         Map<String, Object> cookieParams = new HashMap<String, Object>();
 
-        boolean isEntity = true;
         for (int i = 0; i < method.getParameterTypes().length; i++) {
+            boolean isEntity = true;
             Annotation[] annotations = method.getParameterAnnotations()[i];
             PathParam pathParam = getAnnotation(annotations, PathParam.class);
             if (pathParam != null) {
@@ -201,7 +214,7 @@ public class RESTBindingInvoker implemen
                 isEntity = false;
                 cookieParams.put(cookieParam.value(), args[i]);
             }
-            if(isEntity) {
+            if (isEntity) {
                 entity = args[i];
             }
         }
@@ -212,10 +225,10 @@ public class RESTBindingInvoker implemen
         for (Map.Entry<String, Object> p : matrixParams.entrySet()) {
             uriBuilder.replaceMatrixParam(p.getKey(), p.getValue());
         }
-        
+
         uri = uriBuilder.buildFromMap(pathParams);
         Resource resource = restClient.resource(uri);
-        
+
         for (Map.Entry<String, Object> p : headerParams.entrySet()) {
             resource.header(p.getKey(), String.valueOf(p.getValue()));
         }
@@ -226,18 +239,18 @@ public class RESTBindingInvoker implemen
         }
 
         resource.contentType(getContentType());
-        resource.accept(getAccepts());        
-        
+        resource.accept(getAccepts());
+
         //handles declarative headers configured on the composite
-        for(HTTPHeader header : binding.getHttpHeaders()) {
+        for (HTTPHeader header : binding.getHttpHeaders()) {
             //treat special headers that need to be calculated
-            if(header.getName().equalsIgnoreCase("Expires")) {
+            if (header.getName().equalsIgnoreCase("Expires")) {
                 GregorianCalendar calendar = new GregorianCalendar();
                 calendar.setTime(new Date());
 
                 calendar.add(Calendar.HOUR, Integer.parseInt(header.getValue()));
 
-                resource.header("Expires", HTTPCacheContext.RFC822DateFormat.format( calendar.getTime() ));
+                resource.header("Expires", HTTPCacheContext.RFC822DateFormat.format(calendar.getTime()));
             } else {
                 //default behaviour to pass the header value to HTTP response
                 resource.header(header.getName(), header.getValue());

Modified: tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTServiceBindingProvider.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTServiceBindingProvider.java?rev=964880&r1=964879&r2=964880&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTServiceBindingProvider.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTServiceBindingProvider.java Fri Jul 16 17:49:20 2010
@@ -19,8 +19,6 @@
 
 package org.apache.tuscany.sca.binding.rest.provider;
 
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Method;
 import java.net.URI;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -114,7 +112,8 @@ public class RESTServiceBindingProvider 
         if (binding.getOperationSelector() != null) {
             // Configure the interceptors for operation selection
             OperationSelectorProviderFactory osProviderFactory =
-                (OperationSelectorProviderFactory)providerFactories.getProviderFactory(binding.getOperationSelector().getClass());
+                (OperationSelectorProviderFactory)providerFactories.getProviderFactory(binding.getOperationSelector()
+                    .getClass());
             if (osProviderFactory != null) {
                 this.osProvider = osProviderFactory.createServiceOperationSelectorProvider(endpoint);
             }
@@ -123,16 +122,18 @@ public class RESTServiceBindingProvider 
         if (binding.getRequestWireFormat() != null) {
             // Configure the interceptors for wire format
             WireFormatProviderFactory wfProviderFactory =
-                (WireFormatProviderFactory)providerFactories.getProviderFactory(binding.getRequestWireFormat().getClass());
+                (WireFormatProviderFactory)providerFactories.getProviderFactory(binding.getRequestWireFormat()
+                    .getClass());
             if (wfProviderFactory != null) {
                 this.wfProvider = wfProviderFactory.createServiceWireFormatProvider(endpoint);
             }
         }
 
-        if (binding.getResponseWireFormat() != null ) {
+        if (binding.getResponseWireFormat() != null) {
             // Configure the interceptors for wire format
             WireFormatProviderFactory wfProviderFactory =
-                (WireFormatProviderFactory)providerFactories.getProviderFactory(binding.getResponseWireFormat().getClass());
+                (WireFormatProviderFactory)providerFactories.getProviderFactory(binding.getResponseWireFormat()
+                    .getClass());
             if (wfProviderFactory != null) {
                 this.wfResponseProvider = wfProviderFactory.createServiceWireFormatProvider(endpoint);
             }
@@ -143,11 +144,11 @@ public class RESTServiceBindingProvider 
             this.serviceContract = (InterfaceContract)service.getInterfaceContract().clone();
 
             // configure data binding
-            if (wfProvider != null ) {
+            if (wfProvider != null) {
                 wfProvider.configureWireFormatInterfaceContract(serviceContract);
             }
 
-            if(wfResponseProvider != null) {
+            if (wfResponseProvider != null) {
                 wfResponseProvider.configureWireFormatInterfaceContract(serviceContract);
             }
         } catch (CloneNotSupportedException e) {
@@ -239,7 +240,6 @@ public class RESTServiceBindingProvider 
         return false;
     }
 
-
     /**
      * Register a Tuscany REST Servlet to handle JAX-RS Resources on a binding endpoint
      * @return
@@ -251,7 +251,8 @@ public class RESTServiceBindingProvider 
             JavaInterface javaInterface = (JavaInterface)endpoint.getComponentServiceInterfaceContract().getInterface();
             Class<?> interfaze = javaInterface.getJavaClass();
 
-            boolean isJAXRS = isJAXRSResource(interfaze);
+            // The @Path annotation can be from the binding uri
+            boolean isJAXRS = JAXRSHelper.isJAXRSResource(interfaze);
             if (isJAXRS) {
                 application = new SimpleApplication(interfaze);
 
@@ -314,7 +315,7 @@ public class RESTServiceBindingProvider 
                 String path = URI.create(uri).getPath();
 
                 // FIXME: [rfeng] We need to have a better way to deal with URI template for bindings
-                if(path.startsWith(servletHost.getContextPath())) {
+                if (path.startsWith(servletHost.getContextPath())) {
                     path = path.substring(servletHost.getContextPath().length());
                 }
                 Class<?> cls =
@@ -336,24 +337,6 @@ public class RESTServiceBindingProvider 
         }
     }
 
-    public static boolean isJAXRSResource(Class<?> cls) {
-        for (Annotation a : cls.getAnnotations()) {
-            if (a.annotationType().getName().startsWith("javax.ws.rs.")) {
-                return true;
-            }
-        }
-        for (Method method : cls.getMethods()) {
-            for (Annotation a : method.getAnnotations()) {
-                if (a.annotationType().getName().startsWith("javax.ws.rs.")) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-
-
     /**
      * Add specific rest interceptor to invocation chain
      */

Modified: tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/json/provider/JSONWireFormatServiceProvider.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/json/provider/JSONWireFormatServiceProvider.java?rev=964880&r1=964879&r2=964880&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/json/provider/JSONWireFormatServiceProvider.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/json/provider/JSONWireFormatServiceProvider.java Fri Jul 16 17:49:20 2010
@@ -22,7 +22,7 @@ package org.apache.tuscany.sca.binding.r
 import java.util.List;
 
 import org.apache.tuscany.sca.assembly.Binding;
-import org.apache.tuscany.sca.binding.rest.provider.RESTServiceBindingProvider;
+import org.apache.tuscany.sca.binding.rest.provider.JAXRSHelper;
 import org.apache.tuscany.sca.binding.rest.wireformat.json.JSONWireFormat;
 import org.apache.tuscany.sca.core.ExtensionPointRegistry;
 import org.apache.tuscany.sca.databinding.javabeans.SimpleJavaDataBinding;
@@ -60,7 +60,7 @@ public class JSONWireFormatServiceProvid
     private boolean isJAXRSResource() {
         Interface interfaze = endpoint.getComponentServiceInterfaceContract().getInterface();
         if (interfaze instanceof JavaInterface) {
-            if (RESTServiceBindingProvider.isJAXRSResource(((JavaInterface)interfaze).getJavaClass())) {
+            if (JAXRSHelper.isJAXRSResource(((JavaInterface)interfaze).getJavaClass())) {
                 return true;
             }
         }

Modified: tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/xml/provider/XMLWireFormatServiceProvider.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/xml/provider/XMLWireFormatServiceProvider.java?rev=964880&r1=964879&r2=964880&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/xml/provider/XMLWireFormatServiceProvider.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/xml/provider/XMLWireFormatServiceProvider.java Fri Jul 16 17:49:20 2010
@@ -24,7 +24,7 @@ import java.util.List;
 import javax.xml.stream.XMLStreamReader;
 
 import org.apache.tuscany.sca.assembly.Binding;
-import org.apache.tuscany.sca.binding.rest.provider.RESTServiceBindingProvider;
+import org.apache.tuscany.sca.binding.rest.provider.JAXRSHelper;
 import org.apache.tuscany.sca.binding.rest.wireformat.xml.XMLWireFormat;
 import org.apache.tuscany.sca.core.ExtensionPointRegistry;
 import org.apache.tuscany.sca.databinding.javabeans.SimpleJavaDataBinding;
@@ -65,7 +65,7 @@ public class XMLWireFormatServiceProvide
     private boolean isJAXRSResource() {
         Interface interfaze = endpoint.getComponentServiceInterfaceContract().getInterface();
         if (interfaze instanceof JavaInterface) {
-            if (RESTServiceBindingProvider.isJAXRSResource(((JavaInterface)interfaze).getJavaClass())) {
+            if (JAXRSHelper.isJAXRSResource(((JavaInterface)interfaze).getJavaClass())) {
                 return true;
             }
         }

Modified: tuscany/sca-java-2.x/trunk/modules/interface-java-jaxrs/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxrs/JAXRSJavaInterfaceProcessor.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/interface-java-jaxrs/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxrs/JAXRSJavaInterfaceProcessor.java?rev=964880&r1=964879&r2=964880&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/interface-java-jaxrs/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxrs/JAXRSJavaInterfaceProcessor.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/interface-java-jaxrs/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxrs/JAXRSJavaInterfaceProcessor.java Fri Jul 16 17:49:20 2010
@@ -19,6 +19,7 @@
 
 package org.apache.tuscany.sca.interfacedef.java.jaxrs;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -54,22 +55,26 @@ public class JAXRSJavaInterfaceProcessor
         Method method = operation.getJavaMethod();
 
         String methodName = null;
-        HttpMethod httpMethod = method.getAnnotation(HttpMethod.class);
-        if (httpMethod != null) {
-            methodName = httpMethod.value();
-        }
-        if (method.isAnnotationPresent(GET.class)) {
-            methodName = HttpMethod.GET;
-        } else if (method.isAnnotationPresent(POST.class)) {
-            methodName = HttpMethod.POST;
-        } else if (method.isAnnotationPresent(PUT.class)) {
-            methodName = HttpMethod.PUT;
-        } else if (method.isAnnotationPresent(DELETE.class)) {
-            methodName = HttpMethod.DELETE;
-        } else if (method.isAnnotationPresent(HEAD.class)) {
-            methodName = HttpMethod.HEAD;
-        } else if (method.isAnnotationPresent(OPTIONS.class)) {
-            methodName = HttpMethod.OPTIONS;
+
+        /**
+         * A request method designator is a runtime annotation that is annotated with the @HttpMethod annotation.
+         * JAX-RS defines a set of request method designators for the common HTTP methods: @GET, @POST, @PUT,
+         * @DELETE, @HEAD. Users may define their own custom request method designators including alternate 
+         * designators for the common HTTP methods.
+         */
+        for (Annotation a : method.getAnnotations()) {
+            Class<?> annotationType = a.annotationType();
+            if (annotationType == HttpMethod.class) {
+                methodName = ((HttpMethod)a).value();
+                break;
+            }
+            // Http method related annotations such as @GET, @POST will have itself annotated with
+            // @HttpMethod
+            HttpMethod m = a.annotationType().getAnnotation(HttpMethod.class);
+            if (m != null) {
+                methodName = m.value();
+                break;
+            }
         }
 
         boolean jaxrs = false;