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/05/28 08:17:24 UTC

svn commit: r949110 - 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/test/java/services/store/ interface-java-jaxrs/src/main/java/org/apache/tuscany/sca/...

Author: rfeng
Date: Fri May 28 06:17:24 2010
New Revision: 949110

URL: http://svn.apache.org/viewvc?rev=949110&view=rev
Log:
Add a workaround for TUSCANY-3572

Modified:
    tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSProvider.java
    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/RESTServiceBindingProvider.java
    tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/TuscanyRESTServlet.java
    tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/test/java/services/store/FruitsCatalogImpl.java
    tuscany/sca-java-2.x/trunk/modules/interface-java-jaxrs/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxrs/RootResourceClassGenerator.java

Modified: tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSProvider.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/DataBindingJAXRSProvider.java?rev=949110&r1=949109&r2=949110&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSProvider.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSProvider.java Fri May 28 06:17:24 2010
@@ -90,8 +90,10 @@ public abstract class DataBindingJAXRSPr
     }
 
     protected boolean supports(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
-        return MediaType.APPLICATION_JSON_TYPE.equals(mediaType) || MediaType.APPLICATION_XML_TYPE.equals(mediaType)
-        || MediaType.TEXT_XML_TYPE.equals(mediaType);
+        // Some media types have parameters
+        mediaType = new MediaType(mediaType.getType(), mediaType.getSubtype());
+        return MediaType.APPLICATION_JSON_TYPE.isCompatible(mediaType) || MediaType.APPLICATION_XML_TYPE.isCompatible(mediaType)
+        || MediaType.TEXT_XML_TYPE.isCompatible(mediaType);
     }
 
     protected Object convert(InputStream content, String contentType, Class<?> type) throws IOException {

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=949110&r1=949109&r2=949110&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 May 28 06:17:24 2010
@@ -62,6 +62,7 @@ public class DataBindingJAXRSReader<T> e
     
         String dataBinding = null;
         
+        mediaType = new MediaType(mediaType.getType(), mediaType.getSubtype());
         // FIXME: [rfeng] This is a hack to handle application/json
         if (MediaType.APPLICATION_JSON_TYPE.equals(mediaType)) {
             dataBinding = mediaType.toString() + "#" + InputStream.class.getName();

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=949110&r1=949109&r2=949110&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 May 28 06:17:24 2010
@@ -62,7 +62,7 @@ public class DataBindingJAXRSWriter<T> e
                         MultivaluedMap<String, Object> httpHeaders,
                         OutputStream entityStream) throws IOException, WebApplicationException {
         DataType dataType = createDataType(type, genericType);
-
+        mediaType = new MediaType(mediaType.getType(), mediaType.getSubtype());
         String dataBinding = OutputStream.class.getName();
         // FIXME: [rfeng] This is a hack to handle application/json
         if (MediaType.APPLICATION_JSON_TYPE.equals(mediaType)) {

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=949110&r1=949109&r2=949110&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 May 28 06:17:24 2010
@@ -221,7 +221,7 @@ public class RESTServiceBindingProvider 
             if (isJAXRS) {
                 application = new SimpleApplication(interfaze);
 
-                TuscanyRESTServlet restServlet = new TuscanyRESTServlet(extensionPoints);
+                TuscanyRESTServlet restServlet = new TuscanyRESTServlet(extensionPoints, application.resourceClass);
 
                 // Create our HTTP service listener Servlet and register it with the
                 // Servlet host

Modified: tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/TuscanyRESTServlet.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/TuscanyRESTServlet.java?rev=949110&r1=949109&r2=949110&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/TuscanyRESTServlet.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/TuscanyRESTServlet.java Fri May 28 06:17:24 2010
@@ -24,14 +24,15 @@ import java.util.Enumeration;
 
 import javax.servlet.FilterConfig;
 import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.HttpMethod;
+import javax.ws.rs.core.MediaType;
 
 import org.apache.tuscany.sca.core.ExtensionPointRegistry;
 import org.apache.wink.common.internal.registry.ProvidersRegistry;
+import org.apache.wink.common.internal.registry.metadata.MethodMetadata;
 import org.apache.wink.server.internal.DeploymentConfiguration;
 import org.apache.wink.server.internal.RequestProcessor;
-import org.apache.wink.server.internal.handlers.ServerMessageContext;
+import org.apache.wink.server.internal.registry.ResourceRecord;
 import org.apache.wink.server.internal.servlet.RestServlet;
 
 /**
@@ -40,10 +41,13 @@ import org.apache.wink.server.internal.s
 public class TuscanyRESTServlet extends RestServlet {
     private static final long serialVersionUID = 89997233133964915L;
     private ExtensionPointRegistry registry;
+    private Class<?> resourceClass;
+    private boolean fixed;
 
-    public TuscanyRESTServlet(ExtensionPointRegistry registry) {
+    public TuscanyRESTServlet(ExtensionPointRegistry registry, Class<?> resourceClass) {
         super();
         this.registry = registry;
+        this.resourceClass = resourceClass;
     }
 
     @Override
@@ -52,19 +56,19 @@ public class TuscanyRESTServlet extends 
         DeploymentConfiguration config = super.getDeploymentConfiguration();
         // [rfeng] FIXME: This is a hack to fool Apache wink to not remove the servlet path
         config.setFilterConfig(new FilterConfig() {
-            
+
             public ServletContext getServletContext() {
                 return getServletContext();
             }
-            
+
             public Enumeration getInitParameterNames() {
                 return getInitParameterNames();
             }
-            
+
             public String getInitParameter(String arg0) {
                 return getInitParameter(arg0);
             }
-            
+
             public String getFilterName() {
                 return getServletName();
             }
@@ -72,23 +76,50 @@ public class TuscanyRESTServlet extends 
         ProvidersRegistry providers = config.getProvidersRegistry();
         providers.addProvider(new DataBindingJAXRSReader(registry), 0.001, true);
         providers.addProvider(new DataBindingJAXRSWriter(registry), 0.001, true);
+
         return config;
     }
 
-    @Override
-    public RequestProcessor getRequestProcessor() {
-        return super.getRequestProcessor();
+    private synchronized void fixMediaTypes(DeploymentConfiguration config) {
+        if (fixed) {
+            return;
+        }
+        // FIXME: A hacky workaround for https://issues.apache.org/jira/browse/TUSCANY-3572
+        ResourceRecord record = config.getResourceRegistry().getRecord(resourceClass);
+
+        for (MethodMetadata methodMetadata : record.getMetadata().getResourceMethods()) {
+            String method = methodMetadata.getHttpMethod();
+            if (HttpMethod.GET.equals(method) || HttpMethod.HEAD.equals(method) || HttpMethod.DELETE.equals(method)) {
+                methodMetadata.addConsumes(MediaType.APPLICATION_OCTET_STREAM_TYPE);
+                methodMetadata.addConsumes(MediaType.WILDCARD_TYPE);
+            }
+            if (HttpMethod.HEAD.equals(method) || HttpMethod.DELETE.equals(method)) {
+                methodMetadata.addProduces(MediaType.APPLICATION_OCTET_STREAM_TYPE);
+                methodMetadata.addConsumes(MediaType.WILDCARD_TYPE);
+            }
+        }
+        for (MethodMetadata methodMetadata : record.getMetadata().getSubResourceMethods()) {
+            String method = methodMetadata.getHttpMethod();
+            if (HttpMethod.GET.equals(method) || HttpMethod.HEAD.equals(method) || HttpMethod.DELETE.equals(method)) {
+                methodMetadata.addConsumes(MediaType.APPLICATION_OCTET_STREAM_TYPE);
+                methodMetadata.addConsumes(MediaType.WILDCARD_TYPE);
+            }
+            if (HttpMethod.HEAD.equals(method) || HttpMethod.DELETE.equals(method)) {
+                methodMetadata.addProduces(MediaType.APPLICATION_OCTET_STREAM_TYPE);
+                methodMetadata.addConsumes(MediaType.WILDCARD_TYPE);
+            }
+        }
+        fixed = true;
     }
 
-    public ServerMessageContext createMessageContext(HttpServletRequest request, HttpServletResponse response) {
-        ServerMessageContext messageContext;
-        try {
-            messageContext = new ServerMessageContext(request, response, getDeploymentConfiguration());
-        } catch (Exception e) {
-            throw new IllegalArgumentException(e);
+    @Override
+    public RequestProcessor getRequestProcessor() {
+        RequestProcessor processor = super.getRequestProcessor();
+        // The 1st call returns null
+        if (processor != null) {
+            fixMediaTypes(processor.getConfiguration());
         }
-        return messageContext;
+        return processor;
     }
-    
 
 }

Modified: tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/test/java/services/store/FruitsCatalogImpl.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/test/java/services/store/FruitsCatalogImpl.java?rev=949110&r1=949109&r2=949110&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/test/java/services/store/FruitsCatalogImpl.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/binding-rest-runtime/src/test/java/services/store/FruitsCatalogImpl.java Fri May 28 06:17:24 2010
@@ -21,6 +21,7 @@ package services.store;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.oasisopen.sca.annotation.Init;
@@ -49,7 +50,12 @@ public class FruitsCatalogImpl implement
 
     public Items getItem() {
         Items items = new Items();
-        items.setItems(new ArrayList<Item>(catalog.values()));
+        // Add by order so that we can test in the json array
+        List<Item> list = new ArrayList<Item>();
+        list.add(catalog.get("Pear"));
+        list.add(catalog.get("Apple"));
+        list.add(catalog.get("Orange"));
+        items.setItems(list);
         return items;
     }
     

Modified: tuscany/sca-java-2.x/trunk/modules/interface-java-jaxrs/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxrs/RootResourceClassGenerator.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/RootResourceClassGenerator.java?rev=949110&r1=949109&r2=949110&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/interface-java-jaxrs/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxrs/RootResourceClassGenerator.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/interface-java-jaxrs/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxrs/RootResourceClassGenerator.java Fri May 28 06:17:24 2010
@@ -22,6 +22,10 @@ package org.apache.tuscany.sca.interface
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.HEAD;
+
 import org.objectweb.asm.AnnotationVisitor;
 import org.objectweb.asm.ClassWriter;
 import org.objectweb.asm.FieldVisitor;
@@ -34,7 +38,8 @@ public class RootResourceClassGenerator 
 
     private static final String DELEGATE_FIELD = "delegate";
 
-    public static Class<?> generateRootResourceClass(Class<?> interfaze, String path, String consumes, String produces) throws Exception {
+    public static Class<?> generateRootResourceClass(Class<?> interfaze, String path, String consumes, String produces)
+        throws Exception {
         if (!interfaze.isInterface()) {
             throw new IllegalArgumentException(interfaze + " is not an interface.");
         }
@@ -48,7 +53,7 @@ public class RootResourceClassGenerator 
         Class<?> cls = classLoader.getGeneratedClass(className, content);
         return cls;
     }
-    
+
     public static void injectProxy(Class<?> generatedResourceClass, Object proxy) throws Exception {
         Field field = generatedResourceClass.getField("delegate");
         field.set(null, proxy);
@@ -71,7 +76,7 @@ public class RootResourceClassGenerator 
 
         for (Method method : interfaze.getMethods()) {
             if (!(method.getDeclaringClass() == Object.class)) {
-                generateMethod(cw, interfaceName, className, method);
+                generateMethod(cw, interfaceName, className, method, consumes, produces);
             }
         }
         cw.visitEnd();
@@ -80,11 +85,17 @@ public class RootResourceClassGenerator 
     }
 
     // public <ReturnType> method(<Type0> arg0, ..., <TypeN> argN) throws <ExpectionType0>, ..., <ExceptionTypeK>
-    private static void generateMethod(ClassWriter cw, String interfaceName, String className, Method method) {
+    private static void generateMethod(ClassWriter cw,
+                                       String interfaceName,
+                                       String className,
+                                       Method method,
+                                       String consumes,
+                                       String produces) {
         String methodDescriptor = Type.getMethodDescriptor(method);
 
         MethodVisitor mv =
             cw.visitMethod(ACC_PUBLIC, method.getName(), methodDescriptor, null, getExceptionInternalNames(method));
+
         mv.visitCode();
         mv.visitFieldInsn(GETSTATIC, className, DELEGATE_FIELD, getSignature(interfaceName));
         Class<?>[] paramTypes = method.getParameterTypes();
@@ -152,7 +163,7 @@ public class RootResourceClassGenerator 
         av.visit("value", path);
         av.visitEnd();
     }
-    
+
     // @Consumes(<contentTypes>)
     // @Provides(<contentTypes>)
     private static void annotateContentTypes(ClassWriter cw, String consumes, String produces) {
@@ -176,4 +187,28 @@ public class RootResourceClassGenerator 
             av.visitEnd();
         }
     }
+
+    // @Consumes(<contentTypes>)
+    // @Provides(<contentTypes>)
+    private static void annotateContentTypes(MethodVisitor mv, String consumes, String produces) {
+        AnnotationVisitor av = null;
+        if (consumes != null) {
+            av = mv.visitAnnotation("Ljavax/ws/rs/Consumes;", true);
+            AnnotationVisitor av1 = av.visitArray("value");
+            for (String s : consumes.split("(,| )")) {
+                av1.visit(null, s.trim());
+            }
+            av1.visitEnd();
+            av.visitEnd();
+        }
+        if (produces != null) {
+            av = mv.visitAnnotation("Ljavax/ws/rs/Produces;", true);
+            AnnotationVisitor av1 = av.visitArray("value");
+            for (String s : produces.split("(,| )")) {
+                av1.visit(null, s.trim());
+            }
+            av1.visitEnd();
+            av.visitEnd();
+        }
+    }
 }