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();
+ }
+ }
}