summaryrefslogtreecommitdiffstats
path: root/sca-java-2.x
diff options
context:
space:
mode:
authorlresende <lresende@13f79535-47bb-0310-9956-ffa450edef68>2010-04-30 17:15:53 +0000
committerlresende <lresende@13f79535-47bb-0310-9956-ffa450edef68>2010-04-30 17:15:53 +0000
commitda0aff02c15c1e29b844717f4e8911e0d1e80f5b (patch)
tree00f543f3ed8fd7ca523426f96b72f9e6079dba65 /sca-java-2.x
parent80ca73f521b9c70ebe9bfdd6b43fde09ff6b799e (diff)
Enhanced support for JAX-RS annotations allowing @Path({id}) to be mapped to an operation expecting a id paramenter. This gives basic support for get and delete operations on a given resource
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@939744 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-java-2.x')
-rw-r--r--sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/operationselector/jaxrs/provider/JAXRSOperationSelectorInterceptor.java76
-rw-r--r--sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingListenerServlet.java11
-rw-r--r--sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTServiceBindingProvider.java36
-rw-r--r--sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/json/provider/JSONWireFormatInterceptor.java5
-rw-r--r--sca-java-2.x/trunk/modules/binding-rest-runtime/src/test/java/services/store/Catalog.java13
-rw-r--r--sca-java-2.x/trunk/modules/binding-rest-runtime/src/test/java/services/store/FruitsCatalogImpl.java12
6 files changed, 116 insertions, 37 deletions
diff --git a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/operationselector/jaxrs/provider/JAXRSOperationSelectorInterceptor.java b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/operationselector/jaxrs/provider/JAXRSOperationSelectorInterceptor.java
index 199ba0a696..d71762f11e 100644
--- a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/operationselector/jaxrs/provider/JAXRSOperationSelectorInterceptor.java
+++ b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/operationselector/jaxrs/provider/JAXRSOperationSelectorInterceptor.java
@@ -19,17 +19,22 @@
package org.apache.tuscany.sca.binding.rest.operationselector.jaxrs.provider;
+import java.lang.reflect.Method;
+import java.net.URLDecoder;
import java.util.List;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
import org.apache.tuscany.sca.common.http.HTTPContext;
+import org.apache.tuscany.sca.common.http.HTTPUtil;
import org.apache.tuscany.sca.core.ExtensionPointRegistry;
import org.apache.tuscany.sca.interfacedef.InterfaceContract;
import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.interfacedef.java.JavaOperation;
import org.apache.tuscany.sca.invocation.Interceptor;
import org.apache.tuscany.sca.invocation.Invoker;
import org.apache.tuscany.sca.invocation.Message;
@@ -69,13 +74,34 @@ public class JAXRSOperationSelectorInterceptor implements Interceptor {
}
public Message invoke(Message msg) {
- HTTPContext bindingContext = (HTTPContext) msg.getBindingContext();
-
- Operation operation = findOperation(bindingContext.getHttpRequest().getMethod());
-
- msg.setOperation(operation);
-
- return getNext().invoke(msg);
+ try {
+ HTTPContext bindingContext = (HTTPContext) msg.getBindingContext();
+
+ String path = URLDecoder.decode(HTTPUtil.getRequestPath(bindingContext.getHttpRequest()), "UTF-8");
+
+ if(path.startsWith("/")) {
+ path = path.substring(1);
+ }
+
+ List<Operation> operations = filterOperationsByHttpMethod(interfaceContract, bindingContext.getHttpRequest().getMethod());
+
+ Operation operation = findOperation(path, operations);
+
+ final JavaOperation javaOperation = (JavaOperation) operation;
+ final Method method = javaOperation.getJavaMethod();
+
+ if(path != null && path.length() > 0) {
+ if(method.getAnnotation(Path.class) != null) {
+ msg.setBody(new Object[]{path});
+ }
+ }
+
+ msg.setOperation(operation);
+
+ return getNext().invoke(msg);
+ } catch(Exception e) {
+ throw new RuntimeException(e);
+ }
}
/**
@@ -84,7 +110,7 @@ public class JAXRSOperationSelectorInterceptor implements Interceptor {
* @param http_method
* @return
*/
- private Operation findOperation(String http_method) {
+ private static List<Operation> filterOperationsByHttpMethod(InterfaceContract interfaceContract, String http_method) {
List<Operation> operations = null;
if(http_method.equalsIgnoreCase("get")) {
@@ -97,13 +123,35 @@ public class JAXRSOperationSelectorInterceptor implements Interceptor {
operations = (List<Operation>) interfaceContract.getInterface().getAttributes().get(DELETE.class);
}
- Operation result = null;
- if(operations != null) {
- if(! operations.isEmpty()) {
- result = operations.get(0);
+ return operations;
+ }
+
+ /**
+ * Find the operation from the component service contract
+ * @param componentService
+ * @param http_method
+ * @return
+ */
+ private Operation findOperation(String path, List<Operation> operations) {
+ Operation operation = null;
+
+ for(Operation op : operations) {
+ final JavaOperation javaOperation = (JavaOperation) op;
+ final Method method = javaOperation.getJavaMethod();
+
+ if(path != null && path.length() > 0) {
+ if(method.getAnnotation(Path.class) != null) {
+ operation = op;
+ break;
+ }
+ } else {
+ if(method.getAnnotation(Path.class) == null) {
+ operation = op;
+ break;
+ }
}
}
-
- return result;
+
+ return operation;
}
}
diff --git a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingListenerServlet.java b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingListenerServlet.java
index b96a45338a..cb65d74293 100644
--- a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingListenerServlet.java
+++ b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingListenerServlet.java
@@ -55,6 +55,7 @@ public class RESTBindingListenerServlet extends HttpServlet {
transient private Binding binding;
transient private Invoker bindingInvoker;
+ private Invoker invoker;
private Invoker getInvoker;
private Invoker conditionalGetInvoker;
private Invoker putInvoker;
@@ -421,6 +422,16 @@ public class RESTBindingListenerServlet extends HttpServlet {
}
}
+
+ public void setInvoker(Invoker invoker) {
+ this.invoker = invoker;
+ }
+
+ public Invoker getInvoker() {
+ return invoker;
+ }
+
+
/**
* @return the getInvoker
*/
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 a037e6e45c..514cb4cc96 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
@@ -98,7 +98,6 @@ public class RESTServiceBindingProvider implements EndpointProvider {
}
-
//clone the service contract to avoid databinding issues
try {
this.serviceContract = (InterfaceContract) service.getInterfaceContract().clone();
@@ -119,45 +118,42 @@ public class RESTServiceBindingProvider implements EndpointProvider {
Invoker bindingInvoker = endpoint.getBindingInvocationChain().getHeadInvoker();
bindingListenerServlet = new RESTBindingListenerServlet(binding, bindingInvoker, messageFactory );
for (InvocationChain invocationChain : endpoint.getInvocationChains()) {
+
Operation operation = invocationChain.getTargetOperation();
+ Invoker serviceInvoker = invocationChain.getHeadInvoker();
String operationName = operation.getName();
- if (operationName.equals("get")) {
- Invoker getInvoker = invocationChain.getHeadInvoker();
- bindingListenerServlet.setGetInvoker(getInvoker);
+
+ if (binding.getOperationSelector() != null || binding.getRequestWireFormat() != null) {
+ bindingListenerServlet.setInvoker(serviceInvoker);
+ servlet = bindingListenerServlet;
+ } else if (operationName.equals("get")) {
+ bindingListenerServlet.setGetInvoker(serviceInvoker);
servlet = bindingListenerServlet;
} else if (operationName.equals("conditionalGet")) {
- Invoker conditionalGetInvoker = invocationChain.getHeadInvoker();
- bindingListenerServlet.setConditionalGetInvoker(conditionalGetInvoker);
+ bindingListenerServlet.setConditionalGetInvoker(serviceInvoker);
servlet = bindingListenerServlet;
} else if (operationName.equals("delete")) {
- Invoker deleteInvoker = invocationChain.getHeadInvoker();
- bindingListenerServlet.setDeleteInvoker(deleteInvoker);
+ bindingListenerServlet.setDeleteInvoker(serviceInvoker);
servlet = bindingListenerServlet;
} else if (operationName.equals("conditionalDelete")) {
- Invoker conditionalDeleteInvoker = invocationChain.getHeadInvoker();
- bindingListenerServlet.setConditionalDeleteInvoker(conditionalDeleteInvoker);
+ bindingListenerServlet.setConditionalDeleteInvoker(serviceInvoker);
servlet = bindingListenerServlet;
} else if (operationName.equals("put")) {
- Invoker putInvoker = invocationChain.getHeadInvoker();
- bindingListenerServlet.setPutInvoker(putInvoker);
+ bindingListenerServlet.setPutInvoker(serviceInvoker);
servlet = bindingListenerServlet;
} else if (operationName.equals("conditionalPut")) {
- Invoker conditionalPutInvoker = invocationChain.getHeadInvoker();
- bindingListenerServlet.setConditionalPutInvoker(conditionalPutInvoker);
+ bindingListenerServlet.setConditionalPutInvoker(serviceInvoker);
servlet = bindingListenerServlet;
} else if (operationName.equals("post")) {
- Invoker postInvoker = invocationChain.getHeadInvoker();
- bindingListenerServlet.setPostInvoker(postInvoker);
+ bindingListenerServlet.setPostInvoker(serviceInvoker);
servlet = bindingListenerServlet;
} else if (operationName.equals("conditionalPost")) {
- Invoker conditionalPostInvoker = invocationChain.getHeadInvoker();
- bindingListenerServlet.setConditionalPostInvoker(conditionalPostInvoker);
+ bindingListenerServlet.setConditionalPostInvoker(serviceInvoker);
servlet = bindingListenerServlet;
} else if (operationName.equals("service")) {
- Invoker serviceInvoker = invocationChain.getHeadInvoker();
servlet = new RESTServiceListenerServlet(binding, serviceInvoker, messageFactory);
break;
- }
+ }
}
if (servlet == null) {
throw new IllegalStateException("No get or service method found on the service");
diff --git a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/json/provider/JSONWireFormatInterceptor.java b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/json/provider/JSONWireFormatInterceptor.java
index 353cf811a5..a8d9c08d08 100644
--- a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/json/provider/JSONWireFormatInterceptor.java
+++ b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/json/provider/JSONWireFormatInterceptor.java
@@ -21,6 +21,7 @@ package org.apache.tuscany.sca.binding.rest.wireformat.json.provider;
import java.io.CharArrayWriter;
+import org.apache.tuscany.sca.common.http.HTTPContext;
import org.apache.tuscany.sca.core.ExtensionPointRegistry;
import org.apache.tuscany.sca.invocation.Interceptor;
import org.apache.tuscany.sca.invocation.Invoker;
@@ -49,8 +50,10 @@ public class JSONWireFormatInterceptor implements Interceptor {
}
public Message invoke(Message msg) {
+ HTTPContext bindingContext = (HTTPContext) msg.getBindingContext();
+
try {
- if(msg.getBody() != null) {
+ if(bindingContext.getHttpRequest().getMethod().equalsIgnoreCase("get") == false && bindingContext.getHttpRequest().getMethod().equalsIgnoreCase("delete") == false && msg.getBody() != null) {
Object[] args = msg.getBody();
CharArrayWriter data = (CharArrayWriter) args[0];
diff --git a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/test/java/services/store/Catalog.java b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/test/java/services/store/Catalog.java
index f30176f70a..9ffe8fe931 100644
--- a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/test/java/services/store/Catalog.java
+++ b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/test/java/services/store/Catalog.java
@@ -19,9 +19,12 @@
package services.store;
+import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
import org.oasisopen.sca.annotation.Remotable;
@@ -30,11 +33,19 @@ import org.oasisopen.sca.annotation.Remotable;
public interface Catalog {
@GET
- Item[] get();
+ Item[] getItem();
+
+ @GET
+ @Path("{id}")
+ Item getItemById(@PathParam("id") String itemId);
@POST
void addItem(Item item);
@PUT
void updateItem(Item item);
+
+ @DELETE
+ @Path("{id}")
+ void deleteItem(@PathParam("id") String itemId);
}
diff --git a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/test/java/services/store/FruitsCatalogImpl.java b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/test/java/services/store/FruitsCatalogImpl.java
index b71bb28596..c7a9807878 100644
--- a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/test/java/services/store/FruitsCatalogImpl.java
+++ b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/test/java/services/store/FruitsCatalogImpl.java
@@ -46,12 +46,16 @@ public class FruitsCatalogImpl implements Catalog {
catalog.put("Pear", new Item("Pear", currencySymbol + currencyConverter.getConversion("USD", currencyCode, 1.55)));
}
- public Item[] get() {
+ public Item[] getItem() {
Item[] catalogArray = new Item[catalog.size()];
catalog.values().toArray(catalogArray);
return catalogArray;
}
+ public Item getItemById(String itemId) {
+ return catalog.get(itemId);
+ }
+
public void addItem(Item item) {
catalog.put(item.getName(),item);
}
@@ -61,4 +65,10 @@ public class FruitsCatalogImpl implements Catalog {
catalog.put(item.getName(), item);
}
}
+
+ public void deleteItem(String itemId) {
+ if(catalog.get(itemId) != null) {
+ catalog.remove(itemId);
+ }
+ }
}