summaryrefslogtreecommitdiffstats
path: root/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org
diff options
context:
space:
mode:
authorlresende <lresende@13f79535-47bb-0310-9956-ffa450edef68>2010-07-09 02:22:29 +0000
committerlresende <lresende@13f79535-47bb-0310-9956-ffa450edef68>2010-07-09 02:22:29 +0000
commit4c5685db052033f40a69cf17f7d462118af6a8e5 (patch)
treed76763834d06e85363cfb466f0170f324094c63f /sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org
parentb3243c64346cda94f30f9c7ab6a25b32a666e09c (diff)
TUSCANY-3618 - Enhancing type mapping for RPC over GET invocation using REST binding
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@962391 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org')
-rw-r--r--sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/operationselector/rpc/provider/RPCOperationSelectorInterceptor.java64
1 files changed, 45 insertions, 19 deletions
diff --git a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/operationselector/rpc/provider/RPCOperationSelectorInterceptor.java b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/operationselector/rpc/provider/RPCOperationSelectorInterceptor.java
index 0eb81cfda5..0df6e5e0fb 100644
--- a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/operationselector/rpc/provider/RPCOperationSelectorInterceptor.java
+++ b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/operationselector/rpc/provider/RPCOperationSelectorInterceptor.java
@@ -6,20 +6,21 @@
* 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.
+ * under the License.
*/
package org.apache.tuscany.sca.binding.rest.operationselector.rpc.provider;
import java.lang.annotation.Annotation;
+import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.net.URLDecoder;
import java.util.ArrayList;
@@ -32,9 +33,12 @@ import javax.ws.rs.QueryParam;
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.core.UtilityExtensionPoint;
+import org.apache.tuscany.sca.databinding.SimpleTypeMapper;
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.interfacedef.util.TypeInfo;
import org.apache.tuscany.sca.invocation.Interceptor;
import org.apache.tuscany.sca.invocation.Invoker;
import org.apache.tuscany.sca.invocation.Message;
@@ -43,11 +47,13 @@ import org.apache.tuscany.sca.runtime.RuntimeEndpoint;
/**
* RPC operation selector Interceptor.
- *
+ *
* @version $Rev$ $Date$
*/
public class RPCOperationSelectorInterceptor implements Interceptor {
private ExtensionPointRegistry extensionPoints;
+ private SimpleTypeMapper simpleTypeMapper;
+
private RuntimeEndpoint endpoint;
private RuntimeComponentService service;
@@ -58,6 +64,10 @@ public class RPCOperationSelectorInterceptor implements Interceptor {
public RPCOperationSelectorInterceptor(ExtensionPointRegistry extensionPoints, RuntimeEndpoint endpoint) {
this.extensionPoints = extensionPoints;
+
+ UtilityExtensionPoint utilityExtensionPoint = extensionPoints.getExtensionPoint(UtilityExtensionPoint.class);
+ this.simpleTypeMapper = utilityExtensionPoint.getUtility(SimpleTypeMapper.class);
+
this.endpoint = endpoint;
this.service = (RuntimeComponentService)endpoint.getService();
@@ -86,11 +96,11 @@ public class RPCOperationSelectorInterceptor implements Interceptor {
if (path.startsWith("/")) {
path = path.substring(1);
}
-
+
String operationName = bindingContext.getHttpRequest().getParameter("method");
Operation operation = findOperation( operationName );
-
+
if (operation == null) {
throw new RuntimeException("Invalid Operation '" + operationName + "'" );
}
@@ -105,32 +115,48 @@ public class RPCOperationSelectorInterceptor implements Interceptor {
QueryParam queryParam = (QueryParam) annotation;
String name = queryParam.value();
String[] values = bindingContext.getHttpRequest().getParameterValues(name);
+
if(values.length == 1) {
- messageParameters.add(values[0]);
+ //process value, making necessary map from string to expected value
+ Class<?> clazz = method.getParameterTypes()[i];
+ TypeInfo typeInfo = simpleTypeMapper.getXMLType(clazz);
+ Object v = simpleTypeMapper.toJavaObject(typeInfo.getQName(), values[0], null);
+ messageParameters.add(v);
} else {
- messageParameters.add(values);
+ //process value, making necessary map from string to expected value
+ Class<?> clazz = (method.getParameterTypes()[i]).getComponentType();
+ TypeInfo typeInfo = simpleTypeMapper.getXMLType(clazz);
+
+
+ Object objectArray = Array.newInstance(clazz, values.length);
+ for (int count = 0; count < values.length; ++count) {
+ Object v = simpleTypeMapper.toJavaObject(typeInfo.getQName(), values[count], null);
+ Array.set(objectArray, count, v);
+ }
+
+ messageParameters.add(objectArray);
}
}
}
}
-
+
Object[] body = new Object[messageParameters.size()];
messageParameters.toArray(body);
-
+
msg.setBody(body);
msg.setOperation(operation);
Message responseMessage = getNext().invoke(msg);
-
+
//set Cache-Control to no-cache to avoid intermediary
//proxy/reverse-proxy caches and always hit the server
//that would identify if the value was current or not
bindingContext.getHttpResponse().setHeader("Cache-Control", "no-cache");
bindingContext.getHttpResponse().setHeader("Expires", new Date(0).toGMTString());
-
-
+
+
String eTag = HTTPUtil.calculateHashETag(responseMessage.getBody().toString().getBytes("UTF-8"));
-
+
// Test request for predicates.
String predicate = bindingContext.getHttpRequest().getHeader( "If-Match" );
if (( predicate != null ) && ( !predicate.equals(eTag) )) {
@@ -142,9 +168,9 @@ public class RPCOperationSelectorInterceptor implements Interceptor {
// Match, should short circuit
bindingContext.getHttpResponse().sendError(HttpServletResponse.SC_NOT_MODIFIED);
}
-
+
bindingContext.getHttpResponse().addHeader("ETag", eTag);
-
+
return responseMessage;
} catch (Exception e) {
throw new RuntimeException(e);
@@ -161,8 +187,8 @@ public class RPCOperationSelectorInterceptor implements Interceptor {
if (method.contains(".")) {
method = method.substring(method.lastIndexOf(".") + 1);
}
-
- List<Operation> operations = endpoint.getComponentServiceInterfaceContract().getInterface().getOperations();
+
+ List<Operation> operations = endpoint.getComponentServiceInterfaceContract().getInterface().getOperations();
Operation result = null;
for (Operation o : operations) {
@@ -173,5 +199,5 @@ public class RPCOperationSelectorInterceptor implements Interceptor {
}
return result;
- }
+ }
}