Author: bsnyder
Date: Fri Feb 23 15:03:40 2007
New Revision: 511163
URL: http://svn.apache.org/viewvc?view=rev&rev=511163
Log:
More additions to the SerializedMarshaler for SM-856 - trying to test it using
the Spring HttpInvokerProxyFactoryBean.
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/PersonImpl.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=511163&r1=511162&r2=511163
==============================================================================
---
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 Feb 23 15:03:40 2007
@@ -1,8 +1,12 @@
package org.apache.servicemix.http.endpoints;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.ObjectInputStream;
+import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.net.URI;
@@ -11,6 +15,7 @@
import javax.jbi.messaging.MessageExchange;
import javax.jbi.messaging.NormalizedMessage;
import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import org.apache.servicemix.jbi.jaxp.StringSource;
import org.apache.servicemix.jbi.messaging.MessageExchangeSupport;
@@ -31,14 +36,43 @@
context.getDeliveryChannel().createExchangeFactory().createExchange(inOnlyMepUri);
NormalizedMessage in = me.createMessage();
- InputStream is = request.getInputStream();
- String xmlRequest = marshal(is);
+ InputStream copy = copyInputStream(request.getInputStream());
+
+ String xmlRequest = marshal(copy);
in.setContent(new StringSource(xmlRequest));
me.setMessage(in, "in");
return me;
}
+
+ public void sendOut(MessageExchange exchange, NormalizedMessage outMsg,
HttpServletRequest request, HttpServletResponse response) throws Exception {
+ // TODO Auto-generated method stub
+ super.sendOut(exchange, outMsg, request, response);
+ }
+
+ /**
+ * Copy the input stream in an attempt to get around 'stream is closed
error'.
+ *
+ * @param in
+ * @return
+ * @throws IOException
+ */
+ private InputStream copyInputStream(InputStream in) throws IOException
{
+ InputStreamReader input = new InputStreamReader(in);
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ OutputStreamWriter output = new OutputStreamWriter(baos);
+
+ char[] buffer1 = new char[1024*2];
+ int i = 0;
+ while (-1 != (i = input.read(buffer1))) {
+ output.write(buffer1, 0, i);
+ }
+ output.flush();
+
+ InputStream newIn = new ByteArrayInputStream(baos.toByteArray());
+ return newIn;
+ }
- protected String marshal(InputStream is) throws IOException,
ClassNotFoundException {
+ private String marshal(InputStream is) throws IOException,
ClassNotFoundException {
Object obj = new ObjectInputStream(is).readObject();
Writer w = new StringWriter();
XStream xstream = new XStream(new DomDriver());
Modified:
incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-http/src/test/java/org/apache/servicemix/http/endpoints/PersonImpl.java
URL:
http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-http/src/test/java/org/apache/servicemix/http/endpoints/PersonImpl.java?view=diff&rev=511163&r1=511162&r2=511163
==============================================================================
---
incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-http/src/test/java/org/apache/servicemix/http/endpoints/PersonImpl.java
(original)
+++
incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-http/src/test/java/org/apache/servicemix/http/endpoints/PersonImpl.java
Fri Feb 23 15:03:40 2007
@@ -1,12 +1,13 @@
package org.apache.servicemix.http.endpoints;
+import java.io.Serializable;
import java.io.StringWriter;
import java.io.Writer;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
-public class PersonImpl implements Person {
+public class PersonImpl implements Person, Serializable {
protected String givenName;
protected String surName;
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=511163&r1=511162&r2=511163
==============================================================================
---
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 Feb 23 15:03:40 2007
@@ -1,26 +1,31 @@
package org.apache.servicemix.http.endpoints;
import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLConnection;
import javax.jbi.component.ComponentContext;
-import javax.jbi.messaging.ExchangeStatus;
-import javax.jbi.messaging.InOut;
-import javax.jbi.servicedesc.ServiceEndpoint;
import javax.xml.namespace.QName;
-import javax.xml.transform.stream.StreamSource;
import junit.framework.TestCase;
-import org.apache.servicemix.client.DefaultServiceMixClient;
import org.apache.servicemix.components.util.EchoComponent;
import org.apache.servicemix.http.HttpComponent;
import org.apache.servicemix.http.HttpEndpointType;
import org.apache.servicemix.jbi.container.ActivationSpec;
import org.apache.servicemix.jbi.container.JBIContainer;
-import org.apache.servicemix.jbi.jaxp.SourceTransformer;
-import org.apache.servicemix.jbi.resolver.URIResolver;
+//import org.springframework.mock.web.MockHttpServletRequest;
+//import org.springframework.mock.web.MockHttpServletResponse;
+import
org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor;
+import org.springframework.remoting.httpinvoker.HttpInvokerClientConfiguration;
import org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean;
-import org.w3c.dom.DocumentFragment;
+import
org.springframework.remoting.httpinvoker.SimpleHttpInvokerRequestExecutor;
+import org.springframework.remoting.support.RemoteInvocationResult;
public class SerializedMarshalerTest extends TestCase {
@@ -41,61 +46,69 @@
}
}
- public void testCreateExchange() throws Exception{
- HttpConsumerEndpoint ep = new HttpConsumerEndpoint();
- ep.setService(new QName("urn:httpconsumer", "HttpConsumer"));
- ep.setEndpoint("HttpConsumer");
- ep.setLocationURI("http://localhost:8192/service");
- ep.setTargetService(new
QName("http://http.servicemix.org/Test", "ConsumerInOut"));
-
- SerializedMarshaler marshaler = new SerializedMarshaler();
- ep.setMarshaler(marshaler);
-
- HttpComponent component = new HttpComponent();
- component.setEndpoints(new HttpEndpointType[] { ep });
- container.activateComponent(component, "HttpConsumer");
-
- EchoComponent echo = new EchoComponent();
- ActivationSpec asReceiver = new ActivationSpec("echo", echo);
- asReceiver.setService(new QName("http://http.servicemix.org/Test",
"ConsumerInOut"));
- container.activateComponent(asReceiver);
-
- container.start();
-
- DefaultServiceMixClient client = new
DefaultServiceMixClient(container);
- InOut inout = client.createInOutExchange();
- inout.setService(new QName("urn:httpconsumer", "HttpConsumer"));
- DocumentFragment epr =
URIResolver.createWSAEPR("http://localhost:8192/service");
- ServiceEndpoint se = client.getContext().resolveEndpointReference(epr);
- inout.setEndpoint(se);
- inout.getInMessage().setContent(
- new StreamSource(new
ByteArrayInputStream(createRequestMessage())));
-
- long t0 = System.currentTimeMillis();
- client.sendSync(inout);
- long t1 = System.currentTimeMillis();
- System.out.println("%%%%%%%%%%%%%%% Exchange: " + inout);
- System.out.println("Fault: " + inout.getFault());
- assertTrue(inout.getStatus() == ExchangeStatus.ACTIVE);
-
- System.err.println("Executed in " + (t1 - t0) + "ms");
-
- assertNotNull(inout.getOutMessage());
- assertNotNull(inout.getOutMessage().getContent());
-
- SourceTransformer sourceTransformer = new SourceTransformer();
- String reply =
sourceTransformer.toString(inout.getOutMessage().getContent());
-
- String inputMesage = sourceTransformer.toString(new StreamSource(
- new ByteArrayInputStream(createRequestMessage())));
-
-
System.err.println("##################################################");
- System.err.println("Msg Sent [" + inputMesage + "]");
- System.err.println("Msg Recieved [" + reply + "]");
-
System.err.println("##################################################");
- }
+ /**
+ * Test the SerializedMarshaler using only SMX. I don't think this is going
+ * to work.
+ */
+// public void testCreateExchange() throws Exception{
+// HttpConsumerEndpoint ep = new HttpConsumerEndpoint();
+// ep.setService(new QName("urn:httpconsumer", "HttpConsumer"));
+// ep.setEndpoint("HttpConsumer");
+// ep.setLocationURI("http://localhost:8192/service");
+// ep.setTargetService(new
QName("http://http.servicemix.org/Test", "ConsumerInOut"));
+//
+// SerializedMarshaler marshaler = new SerializedMarshaler();
+// ep.setMarshaler(marshaler);
+//
+// HttpComponent component = new HttpComponent();
+// component.setEndpoints(new HttpEndpointType[] { ep });
+// container.activateComponent(component, "HttpConsumer");
+//
+// EchoComponent echo = new EchoComponent();
+// ActivationSpec asReceiver = new ActivationSpec("echo", echo);
+// asReceiver.setService(new QName("http://http.servicemix.org/Test",
"ConsumerInOut"));
+// container.activateComponent(asReceiver);
+//
+// container.start();
+//
+// DefaultServiceMixClient client = new
DefaultServiceMixClient(container);
+// InOut inout = client.createInOutExchange();
+// inout.setService(new QName("urn:httpconsumer", "HttpConsumer"));
+// DocumentFragment epr =
URIResolver.createWSAEPR("http://localhost:8192/service");
+// ServiceEndpoint se =
client.getContext().resolveEndpointReference(epr);
+// inout.setEndpoint(se);
+// inout.getInMessage().setContent(
+// new StreamSource(new
ByteArrayInputStream(createRequestMessage())));
+//
+// long t0 = System.currentTimeMillis();
+// client.sendSync(inout);
+// long t1 = System.currentTimeMillis();
+// System.out.println("%%%%%%%%%%%%%%% Exchange: " + inout);
+// System.out.println("Fault: " + inout.getFault());
+// assertTrue(inout.getStatus() == ExchangeStatus.ACTIVE);
+//
+// System.err.println("Executed in " + (t1 - t0) + "ms");
+//
+// assertNotNull(inout.getOutMessage());
+// assertNotNull(inout.getOutMessage().getContent());
+//
+// SourceTransformer sourceTransformer = new SourceTransformer();
+// String reply =
sourceTransformer.toString(inout.getOutMessage().getContent());
+//
+// String inputMesage = sourceTransformer.toString(new StreamSource(
+// new ByteArrayInputStream(createBytesRequestMessage())));
+//
+//
System.err.println("##################################################");
+// System.err.println("Msg Sent [" + inputMesage + "]");
+// System.err.println("Msg Recieved [" + reply + "]");
+//
System.err.println("##################################################");
+// }
- public void XtestUsingSpringHttpRemoting() throws Exception {
+ /**
+ * Test the SerializedMarshaler using the Spring
HttpInvokerProxyFactoryBean
+ * to initiate the request.
+ */
+ public void testUsingSpringHttpRemoting() throws Exception {
HttpConsumerEndpoint ep = new HttpConsumerEndpoint();
ep.setService(new QName("urn:httpconsumer", "HttpConsumer"));
ep.setEndpoint("HttpConsumer");
@@ -119,11 +132,72 @@
HttpInvokerProxyFactoryBean pfb = new
HttpInvokerProxyFactoryBean();
pfb.setServiceInterface(Person.class);
pfb.setServiceUrl("http://localhost:8192/service");
+
+ // Not sure what to do about this mess
+ pfb.setHttpInvokerRequestExecutor(new
AbstractHttpInvokerRequestExecutor() {
+ protected RemoteInvocationResult doExecuteRequest(
+ HttpInvokerClientConfiguration config,
ByteArrayOutputStream baos) throws Exception {
+ assertEquals("http://localhost:8192/service",
config.getServiceUrl());
+// MockHttpServletRequest request = new
MockHttpServletRequest();
+// MockHttpServletResponse response = new
MockHttpServletResponse();
+// request.setContent(baos.toByteArray());
+// exporter.handleRequest(request, response);
+// return readRemoteInvocationResult(
+// new
ByteArrayInputStream(response.getContentAsByteArray()),
config.getCodebaseUrl());
+ HttpURLConnection con = openConnection(config);
+ prepareConnection(con, baos.size());
+ writeRequestBody(config, con, baos);
+
+ return new RemoteInvocationResult(new Object());
+ }
+ });
+
+ pfb.afterPropertiesSet();
}
-
- private byte[] createRequestMessage() {
+
+ private HttpURLConnection openConnection(HttpInvokerClientConfiguration
config) throws IOException {
+ URLConnection con = new
URL(config.getServiceUrl()).openConnection();
+ if (!(con instanceof HttpURLConnection)) {
+ throw new IOException("Service URL [" +
config.getServiceUrl() + "] is not an HTTP URL");
+ }
+ return (HttpURLConnection) con;
+ }
+
+ private void prepareConnection(HttpURLConnection con, int
contentLength) throws IOException {
+ con.setDoOutput(true);
+ con.setRequestMethod("POST");
+ con.setRequestProperty("Content-Type",
"application/x-java-serialized-object");
+ con.setRequestProperty("Content-Length",
Integer.toString(contentLength));
+ }
+
+ private void writeRequestBody(HttpInvokerClientConfiguration config,
+ HttpURLConnection con, ByteArrayOutputStream baos) throws
IOException {
+ baos.writeTo(con.getOutputStream());
+ }
+
+ private byte[] createBytesRequestMessage() {
Person p = new PersonImpl("Hunter", "Thompson", 67);
return p.toString().getBytes();
+ }
+
+ private OutputStream createSerializedRequestMessage() {
+ Person p = new PersonImpl("Hunter", "Thompson", 67);
+ return serializeData(p.toString());
+ }
+
+ private OutputStream serializeData(String str) {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream stream = null;
+
+ try {
+ stream = new ObjectOutputStream(baos);
+ stream.writeUTF(str);
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ return stream;
}
}