summaryrefslogtreecommitdiffstats
path: root/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany
diff options
context:
space:
mode:
authorrfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68>2010-07-16 17:49:20 +0000
committerrfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68>2010-07-16 17:49:20 +0000
commit1725e763b9a7fdd4c862167accca060180c9dde1 (patch)
treedd70249c6d23593e8450b548aa4028427408ef2a /sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany
parent63cc1a8c2eb2116ce449456bde19ff6e282163df (diff)
Align the JAX-RS resource class/method checks with the spec
Allow the binding.rest client to issue RPC over GET calls git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@964880 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany')
-rw-r--r--sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSReader.java5
-rw-r--r--sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSWriter.java5
-rw-r--r--sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/JAXRSHelper.java80
-rw-r--r--sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingInvoker.java39
-rw-r--r--sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTServiceBindingProvider.java41
-rw-r--r--sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/json/provider/JSONWireFormatServiceProvider.java4
-rw-r--r--sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/xml/provider/XMLWireFormatServiceProvider.java4
7 files changed, 130 insertions, 48 deletions
diff --git a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSReader.java b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSReader.java
index d6df778feb..d38881eb28 100644
--- a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSReader.java
+++ b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSReader.java
@@ -66,7 +66,10 @@ public class DataBindingJAXRSReader<T> extends DataBindingJAXRSProvider implemen
// 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();
diff --git a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSWriter.java b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSWriter.java
index 740b685b22..be2a9555d7 100644
--- a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSWriter.java
+++ b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/DataBindingJAXRSWriter.java
@@ -69,7 +69,10 @@ public class DataBindingJAXRSWriter<T> extends DataBindingJAXRSProvider implemen
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;
diff --git a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/JAXRSHelper.java b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/JAXRSHelper.java
new file mode 100644
index 0000000000..2bf95f0677
--- /dev/null
+++ b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/JAXRSHelper.java
@@ -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;
+
+ }
+}
diff --git a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingInvoker.java b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingInvoker.java
index c8089904ae..1673f3aefa 100644
--- a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingInvoker.java
+++ b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingInvoker.java
@@ -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 implements Invoker {
private RestClient createRestClient() {
ClientConfig config = new ClientConfig();
-
+
// configureBasicAuth(config, userName, password);
-
+
config.applications(new Application() {
@Override
@@ -127,6 +128,9 @@ public class RESTBindingInvoker implements Invoker {
});
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 implements Invoker {
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 implements Invoker {
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 implements Invoker {
isEntity = false;
cookieParams.put(cookieParam.value(), args[i]);
}
- if(isEntity) {
+ if (isEntity) {
entity = args[i];
}
}
@@ -212,10 +225,10 @@ public class RESTBindingInvoker implements Invoker {
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 implements Invoker {
}
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());
diff --git a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTServiceBindingProvider.java b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTServiceBindingProvider.java
index a12c28715a..9a9e5a108e 100644
--- a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTServiceBindingProvider.java
+++ b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTServiceBindingProvider.java
@@ -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 implements EndpointProvider {
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 implements EndpointProvider {
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 implements EndpointProvider {
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 implements EndpointProvider {
return false;
}
-
/**
* Register a Tuscany REST Servlet to handle JAX-RS Resources on a binding endpoint
* @return
@@ -251,7 +251,8 @@ public class RESTServiceBindingProvider implements EndpointProvider {
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 implements EndpointProvider {
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 implements EndpointProvider {
}
}
- 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
*/
diff --git a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/json/provider/JSONWireFormatServiceProvider.java b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/json/provider/JSONWireFormatServiceProvider.java
index 126d2ead40..fcb311a105 100644
--- a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/json/provider/JSONWireFormatServiceProvider.java
+++ b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/json/provider/JSONWireFormatServiceProvider.java
@@ -22,7 +22,7 @@ package org.apache.tuscany.sca.binding.rest.wireformat.json.provider;
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 JSONWireFormatServiceProvider implements WireFormatProvider {
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;
}
}
diff --git a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/xml/provider/XMLWireFormatServiceProvider.java b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/xml/provider/XMLWireFormatServiceProvider.java
index 2725de15b8..32d718b509 100644
--- a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/xml/provider/XMLWireFormatServiceProvider.java
+++ b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/xml/provider/XMLWireFormatServiceProvider.java
@@ -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 XMLWireFormatServiceProvider implements WireFormatProvider {
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;
}
}