You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by bs...@apache.org on 2007/03/03 00:31:56 UTC
svn commit: r514012 - in
/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-http/src:
main/java/org/apache/servicemix/http/endpoints/SerializedMarshaler.java
test/java/org/apache/servicemix/http/endpoints/SerializedMarshalerTest.java
Author: bsnyder
Date: Fri Mar 2 15:31:53 2007
New Revision: 514012
URL: http://svn.apache.org/viewvc?view=rev&rev=514012
Log:
Added improved comments.
Modified:
incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-http/src/main/java/org/apache/servicemix/http/endpoints/SerializedMarshaler.java
incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-http/src/test/java/org/apache/servicemix/http/endpoints/SerializedMarshalerTest.java
Modified: incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-http/src/main/java/org/apache/servicemix/http/endpoints/SerializedMarshaler.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-http/src/main/java/org/apache/servicemix/http/endpoints/SerializedMarshaler.java?view=diff&rev=514012&r1=514011&r2=514012
==============================================================================
--- incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-http/src/main/java/org/apache/servicemix/http/endpoints/SerializedMarshaler.java (original)
+++ incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-http/src/main/java/org/apache/servicemix/http/endpoints/SerializedMarshaler.java Fri Mar 2 15:31:53 2007
@@ -16,6 +16,8 @@
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.servicemix.jbi.jaxp.SourceTransformer;
import org.apache.servicemix.jbi.jaxp.StringSource;
@@ -23,12 +25,29 @@
import com.thoughtworks.xstream.io.xml.DomDriver;
/**
+ * A marshaler that handles Java serialized content from the InputStream of the
+ * HttpServletRequest object and to the OutputStream of the HttpServletResponse
+ * object. This class is intended to handle requests initiated by the Spring
+ * <a href="http://www.springframework.org/docs/api/org/springframework/remoting/httpinvoker/package-summary.html">httpinvoker package</a>
+ * so the marshaled/unmarshaled XML invocation will be Spring
+ * <a href="http://www.springframework.org/docs/api/org/springframework/remoting/support/RemoteInvocation.html">RemoteInvocation</a>/
+ * <a href="http://www.springframework.org/docs/api/org/springframework/remoting/support/RemoteInvocationResult.html">RemoteInvocationResult</a>
+ * objects respectively.
*
- * @author bsnyder
+ * <p>
+ * This class makes no assumptions about how XML should be marshaled/unmarshaled.
+ * I.e., there is currently no way to customize the marshaled XML invocation. So
+ * this marshaler will need to pass the XML to a component that can transform it
+ * into some custom XML. The servicemix-saxon component can handle this very
+ * easily via XLST.
+ *
+ * @author bsnyder, aco
* @org.apache.xbean.XBean element="serializedMarshaler"
*/
public class SerializedMarshaler extends DefaultHttpConsumerMarshaler {
+ private static Log log = LogFactory.getLog(SerializedMarshaler.class);
+
public MessageExchange createExchange(HttpServletRequest request, ComponentContext context) throws Exception {
MessageExchange me =
context.getDeliveryChannel().createExchangeFactory().createExchange(getDefaultMep());
@@ -45,7 +64,24 @@
}
/**
- * Marshal the byte content of the input stream to an xml source
+ * Marshal the byte content of the input stream to an XML source. This method
+ * is marshaling the contents of the Spring <a href="http://www.springframework.org/docs/api/org/springframework/remoting/support/RemoteInvocation.html">RemoteInvocation</a>
+ * object. Below is an example of what this method emits:
+ *
+ * <pre>
+ * <?xml version="1.0" encoding="UTF-8"?><org.springframework.remoting.support.RemoteInvocation>
+ * <methodName>login</methodName>
+ * <parameterTypes>
+ * <java-class>java.lang.String</java-class>
+ * <java-class>java.lang.String</java-class>
+ * </parameterTypes>
+ * <arguments>
+ * <string>foo</string>
+ * <string>bar</string>
+ * </arguments>
+ * </org.springframework.remoting.support.RemoteInvocation>
+ * </pre>
+ *
* @param is - input stream to read the object from
* @return xml source
* @throws IOException
@@ -56,21 +92,46 @@
Writer w = new StringWriter();
XStream xstream = new XStream(new DomDriver());
xstream.toXML(obj, w);
- return new StringSource(w.toString());
+ String request = w.toString();
+
+ if (log.isDebugEnabled()) {
+ log.debug("Remote invocation request: " + request);
+ }
+
+ return new StringSource(request);
}
/**
- * Unmarshal the xml content to the specified output stream
+ * Unmarshal the XML content to the specified output stream. This method is
+ * unmarshaling XML into the Spring <a href="http://www.springframework.org/docs/api/org/springframework/remoting/support/RemoteInvocationResult.html">RemoteInvocationResult</a>
+ * object. Below is an example of the XML expected by this method:
+ *
+ * <pre>
+ * <?xml version="1.0" encoding="UTF-8"?>
+ * <org.springframework.remoting.support.RemoteInvocationResult>
+ * <value class="com.example.foo.bar.Baz">
+ * <firstName>myfirstname</firstName>
+ * <lastName>mylastname</lastName>
+ * <phone>12312312</phone>
+ * </value>
+ * </org.springframework.remoting.support.RemoteInvocationResult>
+ * </pre>
+ *
* @param os - output stream to unmarshal to
- * @param content - xml source
+ * @param content - XML source
* @throws TransformerException
* @throws IOException
*/
private void unmarshal(OutputStream os, Source content) throws TransformerException, IOException {
SourceTransformer transform = new SourceTransformer();
XStream xstream = new XStream(new DomDriver());
-
- Object obj = xstream.fromXML(transform.toString(content));
+ String result = transform.toString(content);
+
+ if (log.isDebugEnabled()) {
+ log.debug("Remote invocation result: " + result);
+ }
+
+ Object obj = xstream.fromXML(result);
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(obj);
}
Modified: incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-http/src/test/java/org/apache/servicemix/http/endpoints/SerializedMarshalerTest.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-http/src/test/java/org/apache/servicemix/http/endpoints/SerializedMarshalerTest.java?view=diff&rev=514012&r1=514011&r2=514012
==============================================================================
--- incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-http/src/test/java/org/apache/servicemix/http/endpoints/SerializedMarshalerTest.java (original)
+++ incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-http/src/test/java/org/apache/servicemix/http/endpoints/SerializedMarshalerTest.java Fri Mar 2 15:31:53 2007
@@ -47,20 +47,24 @@
public void testUsingSpringHttpRemoting() throws Exception {
final Person person = new PersonImpl("Hunter", "Thompson", 67);
+ // Create a consumer endpoint
HttpConsumerEndpoint ep = new HttpConsumerEndpoint();
ep.setService(new QName("urn:HttpConsumer", "HttpConsumer"));
ep.setEndpoint("HttpConsumer");
ep.setLocationURI("http://localhost:8192/service/");
ep.setTargetService(new QName("urn:HttpInvoker", "Endpoint"));
+ // Configure the SerializedMarshaler and specifiy it on the endpoint
SerializedMarshaler marshaler = new SerializedMarshaler();
marshaler.setDefaultMep(MessageExchangeSupport.IN_OUT);
ep.setMarshaler(marshaler);
+ // Add the endpoint to the component and activate it
HttpComponent component = new HttpComponent();
component.setEndpoints(new HttpEndpointType[] { ep });
container.activateComponent(component, "HttpConsumer");
+ // Dummy up a component as a receiver and route it to urn:HttpInvoker/Endpoint
TransformComponentSupport rmiComponent = new TransformComponentSupport() {
protected boolean transform(MessageExchange exchange, NormalizedMessage in, NormalizedMessage out) throws MessagingException {
try {
@@ -84,16 +88,19 @@
};
ActivationSpec asReceiver = new ActivationSpec("rmiComponent", rmiComponent);
asReceiver.setService(new QName("urn:HttpInvoker", "Endpoint"));
-
container.activateComponent(asReceiver);
+
+ // Start the JBI container
container.start();
+ // Set up the Spring bean to call into the URL specified for the consumer endpoint
HttpInvokerProxyFactoryBean pfb = new HttpInvokerProxyFactoryBean();
pfb.setServiceInterface(Person.class);
pfb.setServiceUrl("http://localhost:8192/service/");
pfb.setHttpInvokerRequestExecutor(new SimpleHttpInvokerRequestExecutor());
pfb.afterPropertiesSet();
+ // Grab the object via the proxy factory bean
Person test = (Person)pfb.getObject();
// Test getters