diff options
author | lresende <lresende@13f79535-47bb-0310-9956-ffa450edef68> | 2010-07-09 02:22:14 +0000 |
---|---|---|
committer | lresende <lresende@13f79535-47bb-0310-9956-ffa450edef68> | 2010-07-09 02:22:14 +0000 |
commit | b3243c64346cda94f30f9c7ab6a25b32a666e09c (patch) | |
tree | 0a1b805561b6ffe298d9094dcfea112af3dd63be /sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/json/provider | |
parent | 2bc19f8bc6cbf654713278bc50cd9c3cb7201215 (diff) |
TUSCANY-3617 - Adding support for configuring wireFormat only for response to allow RPC over GET services to define the wireFormat to use for generating the response payload.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@962390 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/json/provider')
2 files changed, 106 insertions, 51 deletions
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 fdcbc92c9c..e5ce32328c 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 @@ -6,15 +6,15 @@ * 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.wireformat.json.provider; @@ -24,8 +24,11 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringWriter; +import org.apache.tuscany.sca.binding.rest.RESTBinding; +import org.apache.tuscany.sca.binding.rest.wireformat.json.JSONWireFormat; import org.apache.tuscany.sca.common.http.HTTPContext; import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.apache.tuscany.sca.interfacedef.Operation; import org.apache.tuscany.sca.invocation.Interceptor; import org.apache.tuscany.sca.invocation.Invoker; import org.apache.tuscany.sca.invocation.Message; @@ -34,16 +37,17 @@ import org.json.JSONObject; /** * JSON wire format Interceptor. - * + * * @version $Rev$ $Date$ */ public class JSONWireFormatInterceptor implements Interceptor { private Invoker next; + private RESTBinding binding; public JSONWireFormatInterceptor(ExtensionPointRegistry extensionPoints, RuntimeEndpoint endpoint) { - + this.binding = (RESTBinding) endpoint.getBinding(); } - + public Invoker getNext() { return next; } @@ -51,34 +55,74 @@ public class JSONWireFormatInterceptor implements Interceptor { public void setNext(Invoker next) { this.next = next; } - + public Message invoke(Message msg) { HTTPContext bindingContext = (HTTPContext) msg.getBindingContext(); if (bindingContext == null) { return getNext().invoke(msg); } + + + if (binding.getRequestWireFormat() instanceof JSONWireFormat) { + if( isPayloadSupported(bindingContext.getHttpRequest().getMethod()) && msg.getBody() != null) { + msg = invokeRequest(bindingContext, msg); + } + } + + msg = getNext().invoke(msg); + + //if it's oneway return back + Operation operation = msg.getOperation(); + if (operation != null && operation.isNonBlocking()) { + return msg; + } + + if (binding.getResponseWireFormat() instanceof JSONWireFormat) { + msg = invokeResponse(bindingContext, msg); + } + + return msg; + } + + /** + * Handle any wire format specific transformations required for request data + * @param bindingContext the binding context (e.g. HTTP Request, Response objects) + * @param msg the invocation message + * @return processed request message + */ + private Message invokeRequest(HTTPContext bindingContext, Message msg) { + // Decode using the charset in the request if it exists otherwise // use UTF-8 as this is what all browser implementations use. String charset = bindingContext.getHttpRequest().getCharacterEncoding(); if (charset == null) { charset = "UTF-8"; } - + try { - if( isPayloadSupported(bindingContext.getHttpRequest().getMethod()) && msg.getBody() != null) { - Object[] args = msg.getBody(); - InputStream in = (InputStream) args[0]; - String data = read(in, charset); - JSONObject jsonPayload = new JSONObject(data); - msg.setBody(new Object[]{jsonPayload}); - } + Object[] args = msg.getBody(); + InputStream in = (InputStream) args[0]; + String data = read(in, charset); + JSONObject jsonPayload = new JSONObject(data); + msg.setBody(new Object[]{jsonPayload}); } catch(Exception e) { throw new RuntimeException("Unable to parse json paylod: " + msg.getBody().toString()); } - - return getNext().invoke(msg); + + return msg; } - + + /** + * Handle any wire format specific transformation required for the response data + * @param bindingContext the binding context (e.g. HTTP Request, Response objects) + * @param msg the response message + * @return processed response message + */ + private Message invokeResponse(HTTPContext bindingContext, Message msg) { + return msg; + } + + /** * Check if HTTP Operation should support payload * @param operation @@ -87,10 +131,10 @@ public class JSONWireFormatInterceptor implements Interceptor { private static boolean isPayloadSupported(String operation) { boolean isGet = "get".equalsIgnoreCase(operation); boolean isDelete = "delete".equalsIgnoreCase(operation); - + return isGet == false && isDelete == false; } - + /** * Read JSON payload from HTTP Request Body * @param in 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 c90f5c331c..126d2ead40 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 @@ -6,15 +6,15 @@ * 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.wireformat.json.provider; @@ -39,45 +39,45 @@ import org.apache.tuscany.sca.runtime.RuntimeEndpoint; /** * JSON wire format service provider. - * + * * @version $Rev$ $Date$ */ public class JSONWireFormatServiceProvider implements WireFormatProvider { private ExtensionPointRegistry extensionPoints; private RuntimeEndpoint endpoint; - + private InterfaceContract serviceContract; private Binding binding; private boolean jaxrs; - + public JSONWireFormatServiceProvider(ExtensionPointRegistry extensionPoints, RuntimeEndpoint endpoint) { this.extensionPoints = extensionPoints; this.endpoint = endpoint; this.binding = endpoint.getBinding(); this.jaxrs = isJAXRSResource(); } - + private boolean isJAXRSResource() { Interface interfaze = endpoint.getComponentServiceInterfaceContract().getInterface(); if (interfaze instanceof JavaInterface) { if (RESTServiceBindingProvider.isJAXRSResource(((JavaInterface)interfaze).getJavaClass())) { return true; } - } + } return false; } - + public InterfaceContract configureWireFormatInterfaceContract(InterfaceContract interfaceContract) { serviceContract = interfaceContract; - + if (!jaxrs) { - //set JSON databinding - setDataBinding(serviceContract.getInterface()); + boolean configureInput = binding.getRequestWireFormat() != null; + boolean configureOutput = binding.getRequestWireFormat() != null || binding.getResponseWireFormat() != null; - //make JSON databinding default - serviceContract.getInterface().resetDataBinding(JSONDataBinding.NAME); + //set JSON databinding + setDataBinding(serviceContract.getInterface(), configureInput, configureOutput); } - + return serviceContract; } @@ -85,7 +85,8 @@ public class JSONWireFormatServiceProvider implements WireFormatProvider { if (jaxrs) { return null; } - if (binding.getRequestWireFormat() != null && binding.getRequestWireFormat() instanceof JSONWireFormat) { + if( (binding.getRequestWireFormat() != null && binding.getRequestWireFormat() instanceof JSONWireFormat) || + (binding.getResponseWireFormat() != null && binding.getResponseWireFormat() instanceof JSONWireFormat) ){ return new JSONWireFormatInterceptor(extensionPoints, endpoint); } return null; @@ -95,29 +96,39 @@ public class JSONWireFormatServiceProvider implements WireFormatProvider { return Phase.SERVICE_BINDING_WIREFORMAT; } - + /** - * Utility method to reset data binding for the interface contract + * Utility method to reset data binding for the interface contract. + * We need to handle special case where : + * - global wire format for binding + * - wire format configured only for response * @param interfaze */ @SuppressWarnings({"deprecation", "unchecked"}) - private void setDataBinding(Interface interfaze) { + private void setDataBinding(Interface interfaze, boolean configureInput, boolean configureOutput) { List<Operation> operations = interfaze.getOperations(); for (Operation operation : operations) { - operation.setDataBinding(JSONDataBinding.NAME); - DataType<List<DataType>> inputType = operation.getInputType(); - if (inputType != null) { - List<DataType> logical = inputType.getLogical(); - for (DataType inArg : logical) { - if (!SimpleJavaDataBinding.NAME.equals(inArg.getDataBinding())) { - inArg.setDataBinding(JSONDataBinding.NAME); - } + // handle input types + if (configureInput) { + operation.setDataBinding(JSONDataBinding.NAME); + DataType<List<DataType>> inputType = operation.getInputType(); + if (inputType != null) { + List<DataType> logical = inputType.getLogical(); + for (DataType inArg : logical) { + if (!SimpleJavaDataBinding.NAME.equals(inArg.getDataBinding())) { + inArg.setDataBinding(JSONDataBinding.NAME); + } + } } } - DataType outputType = operation.getOutputType(); - if (outputType != null) { - if (!SimpleJavaDataBinding.NAME.equals(outputType.getDataBinding())) { - outputType.setDataBinding(JSONDataBinding.NAME); + + // handle output types + if (configureOutput) { + DataType outputType = operation.getOutputType(); + if (outputType != null) { + if (!SimpleJavaDataBinding.NAME.equals(outputType.getDataBinding())) { + outputType.setDataBinding(JSONDataBinding.NAME); + } } } } |