summaryrefslogtreecommitdiffstats
path: root/sca-java-2.x/trunk/modules/binding-rest
diff options
context:
space:
mode:
authorlresende <lresende@13f79535-47bb-0310-9956-ffa450edef68>2010-07-09 02:22:14 +0000
committerlresende <lresende@13f79535-47bb-0310-9956-ffa450edef68>2010-07-09 02:22:14 +0000
commitb3243c64346cda94f30f9c7ab6a25b32a666e09c (patch)
tree0a1b805561b6ffe298d9094dcfea112af3dd63be /sca-java-2.x/trunk/modules/binding-rest
parent2bc19f8bc6cbf654713278bc50cd9c3cb7201215 (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')
-rw-r--r--sca-java-2.x/trunk/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/impl/RESTBindingImpl.java33
-rw-r--r--sca-java-2.x/trunk/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/xml/RESTBindingProcessor.java86
-rw-r--r--sca-java-2.x/trunk/modules/binding-rest/src/test/java/org/apache/tuscany/sca/binding/rest/wireformat/json/impl/JSONWireFormatProcessorTestCase.java64
3 files changed, 120 insertions, 63 deletions
diff --git a/sca-java-2.x/trunk/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/impl/RESTBindingImpl.java b/sca-java-2.x/trunk/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/impl/RESTBindingImpl.java
index f6acc6934e..93b59de5a4 100644
--- a/sca-java-2.x/trunk/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/impl/RESTBindingImpl.java
+++ b/sca-java-2.x/trunk/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/impl/RESTBindingImpl.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.impl;
@@ -32,18 +32,19 @@ import org.apache.tuscany.sca.common.http.HTTPHeader;
/**
* Implementation of the HTTP binding model.
- *
+ *
* @version $Rev$ $Date$
*/
class RESTBindingImpl implements RESTBinding {
private String name;
private String uri;
-
- private List<HTTPHeader> httpHeaders = new ArrayList<HTTPHeader>();
- private WireFormat wireFormat;
- private OperationSelector operationSelector;
+ private List<HTTPHeader> httpHeaders = new ArrayList<HTTPHeader>();
+
+ private WireFormat requestWireFormat;
+ private WireFormat responseWireFormat;
+ private OperationSelector operationSelector;
public QName getType() {
return TYPE;
@@ -68,7 +69,7 @@ class RESTBindingImpl implements RESTBinding {
public List<HTTPHeader> getHttpHeaders() {
return this.httpHeaders;
}
-
+
public boolean isUnresolved() {
return false;
}
@@ -80,20 +81,20 @@ class RESTBindingImpl implements RESTBinding {
// Wireformat and Operation selection
public WireFormat getRequestWireFormat() {
- return wireFormat;
+ return requestWireFormat;
}
public void setRequestWireFormat(WireFormat wireFormat) {
- this.wireFormat = wireFormat;
+ this.requestWireFormat = wireFormat;
}
public WireFormat getResponseWireFormat() {
- return wireFormat;
+ return responseWireFormat;
}
public void setResponseWireFormat(WireFormat wireFormat) {
- this.wireFormat = wireFormat;
- }
+ this.responseWireFormat = wireFormat;
+ }
public OperationSelector getOperationSelector() {
return operationSelector;
@@ -101,10 +102,10 @@ class RESTBindingImpl implements RESTBinding {
public void setOperationSelector(OperationSelector operationSelector) {
this.operationSelector = operationSelector;
- }
+ }
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
- }
+ }
}
diff --git a/sca-java-2.x/trunk/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/xml/RESTBindingProcessor.java b/sca-java-2.x/trunk/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/xml/RESTBindingProcessor.java
index bd6b1dd7a2..81463b2889 100644
--- a/sca-java-2.x/trunk/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/xml/RESTBindingProcessor.java
+++ b/sca-java-2.x/trunk/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/xml/RESTBindingProcessor.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.xml;
@@ -46,12 +46,13 @@ import org.apache.tuscany.sca.core.FactoryExtensionPoint;
/**
* REST Binding Artifact Processor
- *
+ *
* @version $Rev$ $Date$
*/
public class RESTBindingProcessor extends BaseStAXArtifactProcessor implements StAXArtifactProcessor<RESTBinding> {
private static final QName HEADERS_QNAME = new QName(Base.SCA11_TUSCANY_NS, "http-headers");
private static final QName HEADER_QNAME = new QName(Base.SCA11_TUSCANY_NS, "header");
+ private static final QName RESPONSE_QNAME = new QName(Base.SCA11_TUSCANY_NS, "response");
private static final String NAME = "name";
private static final String VALUE = "value";
@@ -60,7 +61,7 @@ public class RESTBindingProcessor extends BaseStAXArtifactProcessor implements S
private RESTBindingFactory httpBindingFactory;
private StAXArtifactProcessor<Object> extensionProcessor;
- public RESTBindingProcessor(ExtensionPointRegistry extensionPoints,
+ public RESTBindingProcessor(ExtensionPointRegistry extensionPoints,
StAXArtifactProcessor<Object> extensionProcessor,
StAXAttributeProcessor<Object> extensionAttributeProcessor) {
FactoryExtensionPoint modelFactories = extensionPoints.getExtensionPoint(FactoryExtensionPoint.class);
@@ -81,12 +82,15 @@ public class RESTBindingProcessor extends BaseStAXArtifactProcessor implements S
/**
* <tuscany:binding.rest uri="http://localhost:8085/Customer">
- * <tuscany:wireFormat.xml />
- * <tuscany:operationSelector.jaxrs />
- * <tuscany:http-headers>
- * <tuscany:header name="Cache-Control" value="no-cache"/>
- * <tuscany:header name="Expires" value="-1"/>
- * </tuscany:http-headers>
+ * <tuscany:wireFormat.xml />
+ * <tuscany:operationSelector.jaxrs />
+ * <tuscany:http-headers>
+ * <tuscany:header name="Cache-Control" value="no-cache"/>
+ * <tuscany:header name="Expires" value="-1"/>
+ * </tuscany:http-headers>
+ * <tuscany:response>
+ * <tuscany:wireFormat.json />
+ * </tuscany:response>
* </tuscany:binding.rest>
*
*/
@@ -96,9 +100,9 @@ public class RESTBindingProcessor extends BaseStAXArtifactProcessor implements S
switch (event) {
case START_ELEMENT:
elementName = reader.getName();
-
+
if(RESTBinding.TYPE.equals(elementName)) {
-
+
// binding attributes
String name = getString(reader, NAME);
if(name != null) {
@@ -110,36 +114,61 @@ public class RESTBindingProcessor extends BaseStAXArtifactProcessor implements S
restBinding.setURI(uri);
}
break;
-
+
} else if (HEADERS_QNAME.equals(elementName)) {
-
+
// ignore wrapper element
break;
-
+
} else if (HEADER_QNAME.equals(elementName)) {
-
+
// header name/value pair
String name = getString(reader, NAME);
String value = getURIString(reader, VALUE);
-
+
if(name != null) {
restBinding.getHttpHeaders().add(new HTTPHeader(name, value));
}
break;
-
+
+ } else if (RESPONSE_QNAME.equals(elementName)) {
+
+ // skip response
+ reader.next();
+ // and position to the next start_element event
+ while (reader.hasNext()) {
+ int sub_event = reader.getEventType();
+ switch (sub_event) {
+ case START_ELEMENT:
+ elementName = reader.getName();
+ break;
+ default: reader.next();
+ }
+ break;
+ }
+
+ // dispatch to read wire format for the response
+ Object extension = extensionProcessor.read(reader, context);
+ if (extension != null) {
+ if (extension instanceof WireFormat) {
+ restBinding.setResponseWireFormat((WireFormat)extension);
+ }
+ }
+ break;
} else {
// Read an extension element
Object extension = extensionProcessor.read(reader, context);
if (extension != null) {
if (extension instanceof WireFormat) {
restBinding.setRequestWireFormat((WireFormat)extension);
+ restBinding.setResponseWireFormat((WireFormat)extension);
} else if(extension instanceof OperationSelector) {
restBinding.setOperationSelector((OperationSelector)extension);
}
}
break;
}
-
+
case END_ELEMENT:
elementName = reader.getName();
@@ -149,7 +178,7 @@ public class RESTBindingProcessor extends BaseStAXArtifactProcessor implements S
break;
}
-
+
// Read the next element
if (reader.hasNext()) {
@@ -161,7 +190,6 @@ public class RESTBindingProcessor extends BaseStAXArtifactProcessor implements S
}
public void write(RESTBinding restBinding, XMLStreamWriter writer, ProcessorContext context) throws ContributionWriteException, XMLStreamException {
- //writer.writeStartElement(Constants.SCA10_NS, BINDING_HTTP);
writeStart(writer, RESTBinding.TYPE.getNamespaceURI(), RESTBinding.TYPE.getLocalPart());
@@ -174,24 +202,30 @@ public class RESTBindingProcessor extends BaseStAXArtifactProcessor implements S
if (restBinding.getURI() != null) {
writer.writeAttribute(URI, restBinding.getURI());
}
-
+
// Write operation selectors
if ( restBinding.getOperationSelector() != null ) {
extensionProcessor.write(restBinding.getOperationSelector(), writer, context);
}
-
+
// Write wire formats
if ( restBinding.getRequestWireFormat() != null ) {
extensionProcessor.write(restBinding.getRequestWireFormat(), writer, context);
}
+ if ( restBinding.getResponseWireFormat() != null && restBinding.getRequestWireFormat() != restBinding.getResponseWireFormat()) {
+ writeStart(writer, RESPONSE_QNAME.getNamespaceURI(), RESPONSE_QNAME.getLocalPart());
+ extensionProcessor.write(restBinding.getResponseWireFormat(), writer, context);
+ writeEnd(writer);
+ }
+
+
writeEnd(writer);
- //writer.writeEndElement();
}
public void resolve(RESTBinding model, ModelResolver resolver, ProcessorContext context) throws ContributionResolveException {
- // Should not need to do anything here for now...
+ // Should not need to do anything here for now...
}
diff --git a/sca-java-2.x/trunk/modules/binding-rest/src/test/java/org/apache/tuscany/sca/binding/rest/wireformat/json/impl/JSONWireFormatProcessorTestCase.java b/sca-java-2.x/trunk/modules/binding-rest/src/test/java/org/apache/tuscany/sca/binding/rest/wireformat/json/impl/JSONWireFormatProcessorTestCase.java
index b659ecd1a9..1528bb2f4f 100644
--- a/sca-java-2.x/trunk/modules/binding-rest/src/test/java/org/apache/tuscany/sca/binding/rest/wireformat/json/impl/JSONWireFormatProcessorTestCase.java
+++ b/sca-java-2.x/trunk/modules/binding-rest/src/test/java/org/apache/tuscany/sca/binding/rest/wireformat/json/impl/JSONWireFormatProcessorTestCase.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.impl;
@@ -39,61 +39,83 @@ import org.junit.BeforeClass;
import org.junit.Test;
/**
- * JSON wire format processor tests to verify properly processing of
+ * JSON wire format processor tests to verify properly processing of
* wireFormat content in binding configuration in the composite file
- *
+ *
* @version $Rev$ $Date$
*/
public class JSONWireFormatProcessorTestCase {
- public static final String BINDING_WITH_WIRE_FORMAT =
+ public static final String BINDING_WITH_WIRE_FORMAT =
"<binding.rest xmlns=\"http://tuscany.apache.org/xmlns/sca/1.1\" uri=\"http://localhost:8080/uri\">"
+ "<wireFormat.json />"
+ "</binding.rest>";
-
+
+ public static final String BINDING_WITH_RESPONSE_WIRE_FORMAT =
+ "<binding.rest xmlns=\"http://tuscany.apache.org/xmlns/sca/1.1\" uri=\"http://localhost:8080/uri\">"
+ + "<response>"
+ + "<wireFormat.json />"
+ + "</response>"
+ + "</binding.rest>";
+
+
private static XMLInputFactory inputFactory;
private static XMLOutputFactory outputFactory;
private static ExtensibleStAXArtifactProcessor staxProcessor;
private static ProcessorContext context;
-
+
@BeforeClass
public static void setUp() throws Exception {
DefaultExtensionPointRegistry extensionPoints = new DefaultExtensionPointRegistry();
inputFactory = XMLInputFactory.newInstance();
outputFactory = XMLOutputFactory.newInstance();
-
+
context = new ProcessorContext(extensionPoints);
StAXArtifactProcessorExtensionPoint staxProcessors = new DefaultStAXArtifactProcessorExtensionPoint(extensionPoints);
staxProcessor = new ExtensibleStAXArtifactProcessor(staxProcessors, inputFactory, outputFactory);
}
-
+
/**
* Tests the APIs:
* public WireFormat getRequstWireFormat();
- * public WireFormat getResponseWireFormat();
- *
+ *
* @throws Exception
*/
@Test
public void testWireFormat() throws Exception {
XMLStreamReader reader = inputFactory.createXMLStreamReader(new StringReader(BINDING_WITH_WIRE_FORMAT));
-
- RESTBinding binding = (RESTBinding)staxProcessor.read(reader, context);
+
+ RESTBinding binding = (RESTBinding)staxProcessor.read(reader, context);
Assert.assertNotNull(binding);
-
+
WireFormat requestWireFormat = binding.getRequestWireFormat();
Assert.assertEquals(JSONWireFormat.class, requestWireFormat.getClass().getInterfaces()[0]);
-
+ }
+
+ /**
+ * Tests the APIs:
+ * public WireFormat getResponseWireFormat();
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testResponseWireFormat() throws Exception {
+ XMLStreamReader reader = inputFactory.createXMLStreamReader(new StringReader(BINDING_WITH_RESPONSE_WIRE_FORMAT));
+
+ RESTBinding binding = (RESTBinding)staxProcessor.read(reader, context);
+ Assert.assertNotNull(binding);
+
WireFormat responseWireFormat = binding.getResponseWireFormat();
Assert.assertEquals(JSONWireFormat.class, responseWireFormat.getClass().getInterfaces()[0]);
}
-
+
+
@Test
public void testWriteWireFormat() throws Exception {
XMLStreamReader reader = inputFactory.createXMLStreamReader(new StringReader(BINDING_WITH_WIRE_FORMAT));
-
+
RESTBinding binding = (RESTBinding)staxProcessor.read(reader, context);
Assert.assertNotNull(binding);
reader.close();
@@ -105,7 +127,7 @@ public class JSONWireFormatProcessorTestCase {
// System.out.println(BINDING_WITH_WIRE_FORMAT);
// System.out.println(bos.toString());
- Assert.assertEquals(BINDING_WITH_WIRE_FORMAT, bos.toString());
-
- }
+ Assert.assertEquals(BINDING_WITH_WIRE_FORMAT, bos.toString());
+
+ }
}