From b3243c64346cda94f30f9c7ab6a25b32a666e09c Mon Sep 17 00:00:00 2001 From: lresende Date: Fri, 9 Jul 2010 02:22:14 +0000 Subject: 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 --- .../rest/provider/RESTBindingProviderFactory.java | 14 ++- .../rest/provider/RESTServiceBindingProvider.java | 100 ++++++++++++--------- .../json/provider/JSONWireFormatInterceptor.java | 84 ++++++++++++----- .../provider/JSONWireFormatServiceProvider.java | 73 ++++++++------- .../xml/provider/XMLWireFormatInterceptor.java | 81 ++++++++++++++--- .../xml/provider/XMLWireFormatServiceProvider.java | 65 ++++++++------ 6 files changed, 275 insertions(+), 142 deletions(-) (limited to 'sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest') diff --git a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingProviderFactory.java b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingProviderFactory.java index 7c9ec85a9e..0f5047deef 100644 --- a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingProviderFactory.java +++ b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingProviderFactory.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.provider; @@ -33,7 +33,7 @@ import org.apache.tuscany.sca.runtime.RuntimeEndpointReference; /** - * Factory for REST binding providers. + * Factory for REST binding providers. * * @version $Rev$ $Date$ */ @@ -41,7 +41,7 @@ public class RESTBindingProviderFactory implements BindingProviderFactory getModelType() { return RESTBinding.class; } 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 46002e3226..a12c28715a 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 @@ -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.provider; @@ -66,6 +66,13 @@ import org.oasisopen.sca.ServiceRuntimeException; * @version $Rev$ $Date$ */ public class RESTServiceBindingProvider implements EndpointProvider { + private static Map wireFormatToMediaTypeMapping = new HashMap(); + + static { + wireFormatToMediaTypeMapping.put(JSONWireFormat.REST_WIREFORMAT_JSON_QNAME, MediaType.APPLICATION_JSON); + wireFormatToMediaTypeMapping.put(XMLWireFormat.REST_WIREFORMAT_XML_QNAME, MediaType.APPLICATION_XML); + } + private ExtensionPointRegistry extensionPoints; private RuntimeEndpoint endpoint; @@ -77,6 +84,7 @@ public class RESTServiceBindingProvider implements EndpointProvider { private OperationSelectorProvider osProvider; private WireFormatProvider wfProvider; + private WireFormatProvider wfResponseProvider; private ServletHost servletHost; private String servletMapping; @@ -106,31 +114,42 @@ 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); } } - if (binding.getRequestWireFormat() != null && binding.getResponseWireFormat() != null) { + 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 ) { + // Configure the interceptors for wire format + WireFormatProviderFactory wfProviderFactory = + (WireFormatProviderFactory)providerFactories.getProviderFactory(binding.getResponseWireFormat().getClass()); + if (wfProviderFactory != null) { + this.wfResponseProvider = wfProviderFactory.createServiceWireFormatProvider(endpoint); + } + } + //clone the service contract to avoid databinding issues try { this.serviceContract = (InterfaceContract)service.getInterfaceContract().clone(); // configure data binding - if (this.wfProvider != null) { + if (wfProvider != null ) { wfProvider.configureWireFormatInterfaceContract(serviceContract); } + + if(wfResponseProvider != null) { + wfResponseProvider.configureWireFormatInterfaceContract(serviceContract); + } } catch (CloneNotSupportedException e) { this.serviceContract = service.getInterfaceContract(); } @@ -204,12 +223,27 @@ public class RESTServiceBindingProvider implements EndpointProvider { servletHost.addServletMapping(servletMapping, servlet); } - private static Map wireFormatToMediaTypeMapping = new HashMap(); - static { - wireFormatToMediaTypeMapping.put(JSONWireFormat.REST_WIREFORMAT_JSON_QNAME, MediaType.APPLICATION_JSON); - wireFormatToMediaTypeMapping.put(XMLWireFormat.REST_WIREFORMAT_XML_QNAME, MediaType.APPLICATION_XML); + public void stop() { + if (application != null) { + application.destroy(); + } + // Unregister the Servlet from the Servlet host + servletHost.removeServletMapping(servletMapping); + } + + public InterfaceContract getBindingInterfaceContract() { + return serviceContract; } + public boolean supportsOneWayInvocation() { + return false; + } + + + /** + * Register a Tuscany REST Servlet to handle JAX-RS Resources on a binding endpoint + * @return + */ private SimpleApplication registerWithJAXRS() { try { SimpleApplication application = null; @@ -249,16 +283,11 @@ public class RESTServiceBindingProvider implements EndpointProvider { public SimpleApplication(Class resourceClass) { super(); - // boolean isJAXRS = isJAXRSResource(resourceClass); - // if (isJAXRS) { if (resourceClass.isInterface()) { this.resourceClass = generateResourceClass(resourceClass); } else { this.resourceClass = resourceClass; } - // } else { - // throw new ServiceRuntimeException(resourceClass+" is not a JAX-RS resource class."); - // } } @Override @@ -283,7 +312,7 @@ public class RESTServiceBindingProvider implements EndpointProvider { String uri = endpoint.getBinding().getURI(); 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())) { path = path.substring(servletHost.getContextPath().length()); @@ -319,36 +348,11 @@ public class RESTServiceBindingProvider implements EndpointProvider { return true; } } - - /* - for (Annotation[] annotations : method.getParameterAnnotations()) { - for (Annotation a : annotations) { - if (a.annotationType().getName().startsWith("javax.ws.rs.")) { - return true; - } - } - - } - */ } return false; } - public void stop() { - if (application != null) { - application.destroy(); - } - // Unregister the Servlet from the Servlet host - servletHost.removeServletMapping(servletMapping); - } - public InterfaceContract getBindingInterfaceContract() { - return serviceContract; - } - - public boolean supportsOneWayInvocation() { - return false; - } /** * Add specific rest interceptor to invocation chain @@ -364,6 +368,14 @@ public class RESTServiceBindingProvider implements EndpointProvider { } } + if (wfResponseProvider != null) { + Interceptor interceptor = wfResponseProvider.createInterceptor(); + if (interceptor != null) { + bindingChain.addInterceptor(Phase.SERVICE_BINDING_WIREFORMAT, interceptor); + } + + } + if (osProvider != null) { Interceptor interceptor = osProvider.createInterceptor(); if (interceptor != null) { 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 operations = interfaze.getOperations(); for (Operation operation : operations) { - operation.setDataBinding(JSONDataBinding.NAME); - DataType> inputType = operation.getInputType(); - if (inputType != null) { - List 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> inputType = operation.getInputType(); + if (inputType != null) { + List 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); + } } } } diff --git a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/xml/provider/XMLWireFormatInterceptor.java b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/xml/provider/XMLWireFormatInterceptor.java index 3ece7c07a3..d5055b6701 100644 --- a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/xml/provider/XMLWireFormatInterceptor.java +++ b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/wireformat/xml/provider/XMLWireFormatInterceptor.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.xml.provider; @@ -24,9 +24,13 @@ import java.io.InputStream; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamReader; +import org.apache.tuscany.sca.binding.rest.RESTBinding; +import org.apache.tuscany.sca.binding.rest.wireformat.json.JSONWireFormat; +import org.apache.tuscany.sca.binding.rest.wireformat.xml.XMLWireFormat; import org.apache.tuscany.sca.common.http.HTTPContext; import org.apache.tuscany.sca.core.ExtensionPointRegistry; import org.apache.tuscany.sca.core.FactoryExtensionPoint; +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,19 +38,22 @@ import org.apache.tuscany.sca.runtime.RuntimeEndpoint; /** * JSON wire format Interceptor. - * + * * @version $Rev$ $Date$ */ public class XMLWireFormatInterceptor implements Interceptor { private XMLInputFactory inputFactory; - + private Invoker next; + private RESTBinding binding; public XMLWireFormatInterceptor(ExtensionPointRegistry extensionPoints, RuntimeEndpoint endpoint) { FactoryExtensionPoint factories = extensionPoints.getExtensionPoint(FactoryExtensionPoint.class); inputFactory = factories.getFactory(XMLInputFactory.class); + + this.binding = (RESTBinding) endpoint.getBinding(); } - + public Invoker getNext() { return next; } @@ -57,14 +64,46 @@ public class XMLWireFormatInterceptor implements Interceptor { public Message invoke(Message msg) { HTTPContext bindingContext = (HTTPContext) msg.getBindingContext(); - + if (bindingContext == null) { + return getNext().invoke(msg); + } + + + if (binding.getRequestWireFormat() instanceof XMLWireFormat) { + 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 XMLWireFormat) { + 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(msg.getBody() != null) { Object[] args = msg.getBody(); @@ -75,8 +114,30 @@ public class XMLWireFormatInterceptor implements Interceptor { } catch(Exception e) { throw new RuntimeException("Unable to process xml 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 + * @return + */ + private static boolean isPayloadSupported(String operation) { + boolean isGet = "get".equalsIgnoreCase(operation); + boolean isDelete = "delete".equalsIgnoreCase(operation); + + return isGet == false && isDelete == false; + } } 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 9e532d2df2..2725de15b8 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 @@ -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.xml.provider; @@ -41,46 +41,46 @@ import org.apache.tuscany.sca.runtime.RuntimeEndpoint; /** * XML wire format service provider. - * + * * @version $Rev$ $Date$ */ public class XMLWireFormatServiceProvider implements WireFormatProvider { private static final String DATABABINDING = XMLStreamReader.class.getName(); - + private ExtensionPointRegistry extensionPoints; private RuntimeEndpoint endpoint; - + private InterfaceContract serviceContract; private Binding binding; - + private boolean jaxrs; - + public XMLWireFormatServiceProvider(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) { - //make XML databinding default - serviceContract.getInterface().resetDataBinding(DATABABINDING); + if (!jaxrs) { + boolean configureInput = binding.getRequestWireFormat() != null; + boolean configureOutput = binding.getRequestWireFormat() != null || binding.getResponseWireFormat() != null; //set XML databinding - setDataBinding(serviceContract.getInterface()); + setDataBinding(serviceContract.getInterface(), configureInput, configureOutput); } return serviceContract; @@ -90,7 +90,9 @@ public class XMLWireFormatServiceProvider implements WireFormatProvider { if (jaxrs) { return null; } - if (binding.getRequestWireFormat() != null && binding.getRequestWireFormat() instanceof XMLWireFormat) { + + if( (binding.getRequestWireFormat() != null && binding.getRequestWireFormat() instanceof XMLWireFormat) || + (binding.getResponseWireFormat() != null && binding.getResponseWireFormat() instanceof XMLWireFormat) ){ return new XMLWireFormatInterceptor(extensionPoints, endpoint); } return null; @@ -100,28 +102,33 @@ public class XMLWireFormatServiceProvider implements WireFormatProvider { return Phase.SERVICE_BINDING_WIREFORMAT; } - + /** * Utility method to reset data binding for the interface contract * @param interfaze */ @SuppressWarnings({"deprecation", "unchecked"}) - private void setDataBinding(Interface interfaze) { + private void setDataBinding(Interface interfaze, boolean configureInput, boolean configureOutput) { List operations = interfaze.getOperations(); for (Operation operation : operations) { - operation.setDataBinding(DATABABINDING); - DataType> inputType = operation.getInputType(); - if (inputType != null) { - List logical = inputType.getLogical(); - for (DataType inArg : logical) { - if (!SimpleJavaDataBinding.NAME.equals(inArg.getDataBinding())) { - inArg.setDataBinding(DATABABINDING); - } + // handle input types + if (configureInput) { + operation.setDataBinding(DATABABINDING); + DataType> inputType = operation.getInputType(); + if (inputType != null) { + List logical = inputType.getLogical(); + for (DataType inArg : logical) { + if (!SimpleJavaDataBinding.NAME.equals(inArg.getDataBinding())) { + inArg.setDataBinding(DATABABINDING); + } + } } } - DataType outputType = operation.getOutputType(); - if (outputType != null) { - if (!SimpleJavaDataBinding.NAME.equals(outputType.getDataBinding())) { + + // handle output types + if (configureOutput) { + DataType outputType = operation.getOutputType(); + if (outputType != null) { outputType.setDataBinding(XMLStringDataBinding.NAME); } } -- cgit v1.2.3