You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@servicemix.apache.org by Eduardo Burgos <eb...@gmail.com> on 2007/03/02 19:41:34 UTC
Re: about http file endpoints
Ok, I'll try to do it myself and post on this thread.
On 2/28/07, Guillaume Nodet <gn...@gmail.com> wrote:
>
> There's no way to do that out of the box.
> I would try hacking one of the lightweight http component
> to support that.
> Or you could try with the new marshaler stuff that we are working
> on in servicemix-http (in the org.apache.servicemix.http.endpointspackage).
>
> On 2/26/07, Eduardo Burgos <eb...@gmail.com> wrote:
> > is there a way were I can expose file endpoints via http? i.e., I want
> to
> > have something like http://localhost/info.pdf point to a pdf document in
> my
> > filesystem. How can I do this with servicemix-http? or is there another
> way
> > to do it?
> >
>
>
> --
> Cheers,
> Guillaume Nodet
> ------------------------
> Architect, LogicBlaze (http://www.logicblaze.com/)
> Blog: http://gnodet.blogspot.com/
>
Re: about http file endpoints
Posted by Eduardo Burgos <eb...@gmail.com>.
The marshaler approach is perfect, If only the component wouldn't try to
forward the message every time and let me handle the "sendOut" method where
there is no specified targetService/targetInterface that would solve it. I
guess I could have tried putting a dummy loopback service in targetService
and I would have gotten to the sendOut method without error, but what if I
don't want it to forward? hmm... :)
Eduardo Burgos
On 3/20/07, Guillaume Nodet <gn...@gmail.com> wrote:
>
> On 3/20/07, Eduardo Burgos <eb...@gmail.com> wrote:
> >
> > Ok, this is how I did it, however I don't feel very comfortable with it.
> >
> > First I created a HttpConsumerMarshaler and I read the path from the
> > HttpConsumerEndpoint's "targetUri" property.
> >
> > I couldnt get the "endpoint" field from the EndpointComponentContext, so
> I
> > had to reflect :(, why isnt that method public by the way?
> > EndpointComponentContext.getEndpoint() { return endpoint; } would be
> nice.
>
>
> Done
>
> I used this on servicemix.xml:
> >
> > <http:consumer service="foo:ImageLoad"
> > > endpoint="endpoint"
> > > marshaler="#imageLoadMarshaler"
> > > authMethod="basic"
> > > locationURI="http://0.0.0.0:8004/getImage"
> >
> > targetUri="classpath:com/foo/package/image.jpg"
> > > defaultMep="
> > http://www.w3.org/2004/08/wsdl/in-out"
> > > />
> > >
> >
> > At this point, #imageLoadMarshaler is an instance of my
> > HttpConsumerMarshaler, and targetUri has my file resource that I want to
> > publish.
> >
> > The other issue I had is, since I'm not interested in forwarding the
> > message, I have no targetService property set and the targetUri has
> > nothing
> > to do with forwarding either, so I always get a no route exception,
> which
> > led me to implement the logic in the sendError() method :(. Is it
> possible
> > that the component doesn't forward if there is no
> > targetService,targetEndpoint, etc?
> >
> > Also, I was looking at the HttpConsumerEndpoint and I saw a "resources"
> > map
> > that had to do with the "handleStaticResource" method. At the end (line
> > 331)
> > in "else if (res != null) " the method throws an exception for being
> > unable
> > to serialize. If that method could also test for a "
> > org.springframework.core.io.Resource" instance or something similar and
> > pass
> > it on through the response that would have solved the problem without a
> > custom marshaler.
> >
> >
> > This is my marshaler code, it worked very well, but I hope that there is
> > another way :)
>
>
> Yeah, I agree we need to find a better way to do that.
> I think we could either
> * allow the marshaler to handle static resources
> * implement a new consumer endpoint which would not really use any
> marshaler, but
> just serve static resources
>
> package org.inovaware.mokala.jbi.http;
> > >
> > > import java.io.BufferedInputStream;
> > > import java.io.PrintWriter;
> > > import java.io.StringWriter;
> > > import java.lang.reflect.Field;
> > > import java.net.URI;
> > >
> > > import javax.jbi.component.ComponentContext;
> > > import javax.jbi.messaging.Fault;
> > > import javax.jbi.messaging.MessageExchange;
> > > import javax.jbi.messaging.NormalizedMessage;
> > > import javax.servlet.http.HttpServletRequest;
> > > import javax.servlet.http.HttpServletResponse;
> > > import javax.xml.stream.XMLStreamReader;
> > > import javax.xml.stream.XMLStreamWriter;
> > > import javax.xml.transform.stream.StreamSource;
> > >
> > > import org.apache.servicemix.common.EndpointComponentContext;
> > > import org.apache.servicemix.http.endpoints.HttpConsumerEndpoint;
> > > import org.apache.servicemix.http.endpoints.HttpConsumerMarshaler;
> > > import org.apache.servicemix.jbi.jaxp.StAXSourceTransformer;
> > > import org.apache.servicemix.jbi.jaxp.XMLStreamHelper;
> > > import org.apache.servicemix.jbi.messaging.MessageExchangeSupport;
> > > import org.springframework.core.io.ClassPathResource;
> > > import org.springframework.core.io.FileSystemResource;
> > > import org.springframework.core.io.Resource;
> > >
> > > public class FileURIConsumerMarshaler implements HttpConsumerMarshaler
> {
> > >
> > > private StAXSourceTransformer transformer = new
> > > StAXSourceTransformer();
> > >
> > > private URI defaultMep;
> > >
> > > public FileURIConsumerMarshaler() {
> > > this(MessageExchangeSupport.IN_OUT);
> > > }
> > >
> > > public FileURIConsumerMarshaler(URI defaultMep) {
> > > this.defaultMep = defaultMep;
> > > }
> > >
> > > public MessageExchange createExchange(HttpServletRequest request,
> > > ComponentContext context) throws Exception {
> > > MessageExchange me;
> > > me = context.getDeliveryChannel().createExchangeFactory()
> > > .createExchange(getDefaultMep());
> > > NormalizedMessage in = me.createMessage();
> > > in.setContent(new StreamSource(request.getInputStream()));
> > > me.setMessage(in, "in");
> > >
> > > in.setProperty("context", context);
> > > return me;
> > > }
> > >
> > > public void sendOut(MessageExchange exchange, NormalizedMessage
> > > outMsg,
> > > HttpServletRequest request, HttpServletResponse response)
> > > throws Exception {
> > >
> > > }
> > >
> > > public void sendFault(MessageExchange exchange, Fault fault,
> > > HttpServletRequest request, HttpServletResponse response)
> > > throws Exception {
> > > response.setStatus(
> HttpServletResponse.SC_INTERNAL_SERVER_ERROR
> > );
> > > XMLStreamReader reader = transformer.toXMLStreamReader(fault
> > > .getContent());
> > > XMLStreamWriter writer = transformer.getOutputFactory()
> > > .createXMLStreamWriter(response.getWriter());
> > > XMLStreamHelper.copy(reader, writer);
> > > }
> > >
> > > public void sendError(MessageExchange exchange, Exception error,
> > > HttpServletRequest request, HttpServletResponse response)
> > > throws Exception {
> > >
> > > // this means success :(
> > > if (error.getMessage().startsWith("Could not find route for
> > > exchange")) {
> > >
> > > String source = "";
> > > EndpointComponentContext ctx = (EndpointComponentContext)
> > > exchange.getMessage("in").getProperty("context");
> > > Field f = ctx.getClass().getDeclaredField("endpoint");
> > > boolean wasAccessible = f.isAccessible();
> > > if (!wasAccessible)
> > > {
> > > f.setAccessible(true);
> > > }
> > > HttpConsumerEndpoint httpe = (HttpConsumerEndpoint) f.get
> > > (ctx);
> > > f.setAccessible(wasAccessible);
> > > source = httpe.getTargetUri();
> > >
> > >
> > >
> > > response.setHeader("Content-Disposition", "inline");
> > > response.addHeader("Content-Transfer-Encoding", "Binary");
> > >
> > > Resource r = null;
> > >
> > > if (source.toString().startsWith("classpath:")) {
> > > String res = source.toString().substring(10);
> > >
> > > r = new ClassPathResource(res);
> > > } else {
> > > r = new FileSystemResource(source.toString());
> > > }
> > >
> > >
> > >
> > >
> > > if ("jpg".equals(source.toString().substring(
> > source.toString
> > > ().lastIndexOf('.')+1)))
> > > {
> > > response.setContentType("image/jpeg");
> > > }
> > > else if ("xml".equals(source.toString().substring(
> > > source.toString().lastIndexOf('.')+1)))
> > > {
> > > response.setContentType("text/xml");
> > > }
> > > else
> > > {
> > > response.setContentType("application/binary");
> > > }
> > >
> > > if (r != null) {
> > >
> > > BufferedInputStream istr = new BufferedInputStream(r
> > > .getInputStream(), 1000);
> > >
> > > byte[] buff = new byte[1000];
> > >
> > > int s = 0;
> > > while ((s = istr.read(buff)) > 0) {
> > > response.getOutputStream().write(buff, 0, s);
> > > }
> > > istr.close();
> > >
> > > response.getOutputStream().close();
> > >
> > > response.setStatus(HttpServletResponse.SC_OK);
> > >
> > > } else {
> > > response.setStatus(404);
> > > }
> > > } else {
> > >
> > > response.setStatus(
> > > HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
> > > XMLStreamWriter writer = transformer.getOutputFactory()
> > > .createXMLStreamWriter(response.getWriter());
> > > writer.writeStartDocument();
> > > writer.writeStartElement("error");
> > > StringWriter sw = new StringWriter();
> > > PrintWriter pw = new PrintWriter(sw);
> > > error.printStackTrace(pw);
> > > pw.close();
> > > writer.writeCData(sw.toString());
> > > writer.writeEndElement();
> > > writer.writeEndDocument();
> > > }
> > > }
> > >
> > > public void sendAccepted(MessageExchange exchange,
> > > HttpServletRequest request, HttpServletResponse response)
> > > throws Exception {
> > > response.setStatus(HttpServletResponse.SC_ACCEPTED);
> > > }
> > >
> > > public URI getDefaultMep() {
> > > return defaultMep;
> > > }
> > >
> > > public void setDefaultMep(URI defaultMep) {
> > > this.defaultMep = defaultMep;
> > > }
> > > }
> >
> >
> >
> >
> >
> >
> >
> > Eduardo Burgos
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > On 3/2/07, Eduardo Burgos <eb...@gmail.com> wrote:
> > >
> > > Ok, I'll try to do it myself and post on this thread.
> > >
> > >
> > >
> > > On 2/28/07, Guillaume Nodet <gnodet@gmail.com > wrote:
> > > >
> > > > There's no way to do that out of the box.
> > > > I would try hacking one of the lightweight http component
> > > > to support that.
> > > > Or you could try with the new marshaler stuff that we are working
> > > > on in servicemix-http (in the
> > org.apache.servicemix.http.endpointspackage).
> > > >
> > > > On 2/26/07, Eduardo Burgos < eburgos@gmail.com> wrote:
> > > > > is there a way were I can expose file endpoints via http? i.e., I
> > want
> > > > to
> > > > > have something like http://localhost/info.pdf point to a pdf
> > document
> > > > in my
> > > > > filesystem. How can I do this with servicemix-http? or is there
> > > > another way
> > > > > to do it?
> > > > >
> > > >
> > > >
> > > > --
> > > > Cheers,
> > > > Guillaume Nodet
> > > > ------------------------
> > > > Architect, LogicBlaze ( http://www.logicblaze.com/)
> > > > Blog: http://gnodet.blogspot.com/
> > > >
> > >
> > >
> >
>
>
>
> --
> Cheers,
> Guillaume Nodet
> ------------------------
> Architect, LogicBlaze (http://www.logicblaze.com/)
> Blog: http://gnodet.blogspot.com/
>
Re: about http file endpoints
Posted by Guillaume Nodet <gn...@gmail.com>.
On 3/20/07, Eduardo Burgos <eb...@gmail.com> wrote:
>
> Ok, this is how I did it, however I don't feel very comfortable with it.
>
> First I created a HttpConsumerMarshaler and I read the path from the
> HttpConsumerEndpoint's "targetUri" property.
>
> I couldnt get the "endpoint" field from the EndpointComponentContext, so I
> had to reflect :(, why isnt that method public by the way?
> EndpointComponentContext.getEndpoint() { return endpoint; } would be nice.
Done
I used this on servicemix.xml:
>
> <http:consumer service="foo:ImageLoad"
> > endpoint="endpoint"
> > marshaler="#imageLoadMarshaler"
> > authMethod="basic"
> > locationURI="http://0.0.0.0:8004/getImage"
> > targetUri="classpath:com/foo/package/image.jpg"
> > defaultMep="
> http://www.w3.org/2004/08/wsdl/in-out"
> > />
> >
>
> At this point, #imageLoadMarshaler is an instance of my
> HttpConsumerMarshaler, and targetUri has my file resource that I want to
> publish.
>
> The other issue I had is, since I'm not interested in forwarding the
> message, I have no targetService property set and the targetUri has
> nothing
> to do with forwarding either, so I always get a no route exception, which
> led me to implement the logic in the sendError() method :(. Is it possible
> that the component doesn't forward if there is no
> targetService,targetEndpoint, etc?
>
> Also, I was looking at the HttpConsumerEndpoint and I saw a "resources"
> map
> that had to do with the "handleStaticResource" method. At the end (line
> 331)
> in "else if (res != null) " the method throws an exception for being
> unable
> to serialize. If that method could also test for a "
> org.springframework.core.io.Resource" instance or something similar and
> pass
> it on through the response that would have solved the problem without a
> custom marshaler.
>
>
> This is my marshaler code, it worked very well, but I hope that there is
> another way :)
Yeah, I agree we need to find a better way to do that.
I think we could either
* allow the marshaler to handle static resources
* implement a new consumer endpoint which would not really use any
marshaler, but
just serve static resources
package org.inovaware.mokala.jbi.http;
> >
> > import java.io.BufferedInputStream;
> > import java.io.PrintWriter;
> > import java.io.StringWriter;
> > import java.lang.reflect.Field;
> > import java.net.URI;
> >
> > import javax.jbi.component.ComponentContext;
> > import javax.jbi.messaging.Fault;
> > import javax.jbi.messaging.MessageExchange;
> > import javax.jbi.messaging.NormalizedMessage;
> > import javax.servlet.http.HttpServletRequest;
> > import javax.servlet.http.HttpServletResponse;
> > import javax.xml.stream.XMLStreamReader;
> > import javax.xml.stream.XMLStreamWriter;
> > import javax.xml.transform.stream.StreamSource;
> >
> > import org.apache.servicemix.common.EndpointComponentContext;
> > import org.apache.servicemix.http.endpoints.HttpConsumerEndpoint;
> > import org.apache.servicemix.http.endpoints.HttpConsumerMarshaler;
> > import org.apache.servicemix.jbi.jaxp.StAXSourceTransformer;
> > import org.apache.servicemix.jbi.jaxp.XMLStreamHelper;
> > import org.apache.servicemix.jbi.messaging.MessageExchangeSupport;
> > import org.springframework.core.io.ClassPathResource;
> > import org.springframework.core.io.FileSystemResource;
> > import org.springframework.core.io.Resource;
> >
> > public class FileURIConsumerMarshaler implements HttpConsumerMarshaler {
> >
> > private StAXSourceTransformer transformer = new
> > StAXSourceTransformer();
> >
> > private URI defaultMep;
> >
> > public FileURIConsumerMarshaler() {
> > this(MessageExchangeSupport.IN_OUT);
> > }
> >
> > public FileURIConsumerMarshaler(URI defaultMep) {
> > this.defaultMep = defaultMep;
> > }
> >
> > public MessageExchange createExchange(HttpServletRequest request,
> > ComponentContext context) throws Exception {
> > MessageExchange me;
> > me = context.getDeliveryChannel().createExchangeFactory()
> > .createExchange(getDefaultMep());
> > NormalizedMessage in = me.createMessage();
> > in.setContent(new StreamSource(request.getInputStream()));
> > me.setMessage(in, "in");
> >
> > in.setProperty("context", context);
> > return me;
> > }
> >
> > public void sendOut(MessageExchange exchange, NormalizedMessage
> > outMsg,
> > HttpServletRequest request, HttpServletResponse response)
> > throws Exception {
> >
> > }
> >
> > public void sendFault(MessageExchange exchange, Fault fault,
> > HttpServletRequest request, HttpServletResponse response)
> > throws Exception {
> > response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR
> );
> > XMLStreamReader reader = transformer.toXMLStreamReader(fault
> > .getContent());
> > XMLStreamWriter writer = transformer.getOutputFactory()
> > .createXMLStreamWriter(response.getWriter());
> > XMLStreamHelper.copy(reader, writer);
> > }
> >
> > public void sendError(MessageExchange exchange, Exception error,
> > HttpServletRequest request, HttpServletResponse response)
> > throws Exception {
> >
> > // this means success :(
> > if (error.getMessage().startsWith("Could not find route for
> > exchange")) {
> >
> > String source = "";
> > EndpointComponentContext ctx = (EndpointComponentContext)
> > exchange.getMessage("in").getProperty("context");
> > Field f = ctx.getClass().getDeclaredField("endpoint");
> > boolean wasAccessible = f.isAccessible();
> > if (!wasAccessible)
> > {
> > f.setAccessible(true);
> > }
> > HttpConsumerEndpoint httpe = (HttpConsumerEndpoint) f.get
> > (ctx);
> > f.setAccessible(wasAccessible);
> > source = httpe.getTargetUri();
> >
> >
> >
> > response.setHeader("Content-Disposition", "inline");
> > response.addHeader("Content-Transfer-Encoding", "Binary");
> >
> > Resource r = null;
> >
> > if (source.toString().startsWith("classpath:")) {
> > String res = source.toString().substring(10);
> >
> > r = new ClassPathResource(res);
> > } else {
> > r = new FileSystemResource(source.toString());
> > }
> >
> >
> >
> >
> > if ("jpg".equals(source.toString().substring(
> source.toString
> > ().lastIndexOf('.')+1)))
> > {
> > response.setContentType("image/jpeg");
> > }
> > else if ("xml".equals(source.toString().substring(
> > source.toString().lastIndexOf('.')+1)))
> > {
> > response.setContentType("text/xml");
> > }
> > else
> > {
> > response.setContentType("application/binary");
> > }
> >
> > if (r != null) {
> >
> > BufferedInputStream istr = new BufferedInputStream(r
> > .getInputStream(), 1000);
> >
> > byte[] buff = new byte[1000];
> >
> > int s = 0;
> > while ((s = istr.read(buff)) > 0) {
> > response.getOutputStream().write(buff, 0, s);
> > }
> > istr.close();
> >
> > response.getOutputStream().close();
> >
> > response.setStatus(HttpServletResponse.SC_OK);
> >
> > } else {
> > response.setStatus(404);
> > }
> > } else {
> >
> > response.setStatus(
> > HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
> > XMLStreamWriter writer = transformer.getOutputFactory()
> > .createXMLStreamWriter(response.getWriter());
> > writer.writeStartDocument();
> > writer.writeStartElement("error");
> > StringWriter sw = new StringWriter();
> > PrintWriter pw = new PrintWriter(sw);
> > error.printStackTrace(pw);
> > pw.close();
> > writer.writeCData(sw.toString());
> > writer.writeEndElement();
> > writer.writeEndDocument();
> > }
> > }
> >
> > public void sendAccepted(MessageExchange exchange,
> > HttpServletRequest request, HttpServletResponse response)
> > throws Exception {
> > response.setStatus(HttpServletResponse.SC_ACCEPTED);
> > }
> >
> > public URI getDefaultMep() {
> > return defaultMep;
> > }
> >
> > public void setDefaultMep(URI defaultMep) {
> > this.defaultMep = defaultMep;
> > }
> > }
>
>
>
>
>
>
>
> Eduardo Burgos
>
>
>
>
>
>
>
>
>
>
> On 3/2/07, Eduardo Burgos <eb...@gmail.com> wrote:
> >
> > Ok, I'll try to do it myself and post on this thread.
> >
> >
> >
> > On 2/28/07, Guillaume Nodet <gnodet@gmail.com > wrote:
> > >
> > > There's no way to do that out of the box.
> > > I would try hacking one of the lightweight http component
> > > to support that.
> > > Or you could try with the new marshaler stuff that we are working
> > > on in servicemix-http (in the
> org.apache.servicemix.http.endpointspackage).
> > >
> > > On 2/26/07, Eduardo Burgos < eburgos@gmail.com> wrote:
> > > > is there a way were I can expose file endpoints via http? i.e., I
> want
> > > to
> > > > have something like http://localhost/info.pdf point to a pdf
> document
> > > in my
> > > > filesystem. How can I do this with servicemix-http? or is there
> > > another way
> > > > to do it?
> > > >
> > >
> > >
> > > --
> > > Cheers,
> > > Guillaume Nodet
> > > ------------------------
> > > Architect, LogicBlaze ( http://www.logicblaze.com/)
> > > Blog: http://gnodet.blogspot.com/
> > >
> >
> >
>
--
Cheers,
Guillaume Nodet
------------------------
Architect, LogicBlaze (http://www.logicblaze.com/)
Blog: http://gnodet.blogspot.com/
Re: about http file endpoints
Posted by Eduardo Burgos <eb...@gmail.com>.
Ok, this is how I did it, however I don't feel very comfortable with it.
First I created a HttpConsumerMarshaler and I read the path from the
HttpConsumerEndpoint's "targetUri" property.
I couldnt get the "endpoint" field from the EndpointComponentContext, so I
had to reflect :(, why isnt that method public by the way?
EndpointComponentContext.getEndpoint() { return endpoint; } would be nice.
I used this on servicemix.xml:
<http:consumer service="foo:ImageLoad"
> endpoint="endpoint"
> marshaler="#imageLoadMarshaler"
> authMethod="basic"
> locationURI="http://0.0.0.0:8004/getImage"
> targetUri="classpath:com/foo/package/image.jpg"
> defaultMep="http://www.w3.org/2004/08/wsdl/in-out"
> />
>
At this point, #imageLoadMarshaler is an instance of my
HttpConsumerMarshaler, and targetUri has my file resource that I want to
publish.
The other issue I had is, since I'm not interested in forwarding the
message, I have no targetService property set and the targetUri has nothing
to do with forwarding either, so I always get a no route exception, which
led me to implement the logic in the sendError() method :(. Is it possible
that the component doesn't forward if there is no
targetService,targetEndpoint, etc?
Also, I was looking at the HttpConsumerEndpoint and I saw a "resources" map
that had to do with the "handleStaticResource" method. At the end (line 331)
in "else if (res != null) " the method throws an exception for being unable
to serialize. If that method could also test for a "
org.springframework.core.io.Resource" instance or something similar and pass
it on through the response that would have solved the problem without a
custom marshaler.
This is my marshaler code, it worked very well, but I hope that there is
another way :)
package org.inovaware.mokala.jbi.http;
>
> import java.io.BufferedInputStream;
> import java.io.PrintWriter;
> import java.io.StringWriter;
> import java.lang.reflect.Field;
> import java.net.URI;
>
> import javax.jbi.component.ComponentContext;
> import javax.jbi.messaging.Fault;
> import javax.jbi.messaging.MessageExchange;
> import javax.jbi.messaging.NormalizedMessage;
> import javax.servlet.http.HttpServletRequest;
> import javax.servlet.http.HttpServletResponse;
> import javax.xml.stream.XMLStreamReader;
> import javax.xml.stream.XMLStreamWriter;
> import javax.xml.transform.stream.StreamSource;
>
> import org.apache.servicemix.common.EndpointComponentContext;
> import org.apache.servicemix.http.endpoints.HttpConsumerEndpoint;
> import org.apache.servicemix.http.endpoints.HttpConsumerMarshaler;
> import org.apache.servicemix.jbi.jaxp.StAXSourceTransformer;
> import org.apache.servicemix.jbi.jaxp.XMLStreamHelper;
> import org.apache.servicemix.jbi.messaging.MessageExchangeSupport;
> import org.springframework.core.io.ClassPathResource;
> import org.springframework.core.io.FileSystemResource;
> import org.springframework.core.io.Resource;
>
> public class FileURIConsumerMarshaler implements HttpConsumerMarshaler {
>
> private StAXSourceTransformer transformer = new
> StAXSourceTransformer();
>
> private URI defaultMep;
>
> public FileURIConsumerMarshaler() {
> this(MessageExchangeSupport.IN_OUT);
> }
>
> public FileURIConsumerMarshaler(URI defaultMep) {
> this.defaultMep = defaultMep;
> }
>
> public MessageExchange createExchange(HttpServletRequest request,
> ComponentContext context) throws Exception {
> MessageExchange me;
> me = context.getDeliveryChannel().createExchangeFactory()
> .createExchange(getDefaultMep());
> NormalizedMessage in = me.createMessage();
> in.setContent(new StreamSource(request.getInputStream()));
> me.setMessage(in, "in");
>
> in.setProperty("context", context);
> return me;
> }
>
> public void sendOut(MessageExchange exchange, NormalizedMessage
> outMsg,
> HttpServletRequest request, HttpServletResponse response)
> throws Exception {
>
> }
>
> public void sendFault(MessageExchange exchange, Fault fault,
> HttpServletRequest request, HttpServletResponse response)
> throws Exception {
> response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
> XMLStreamReader reader = transformer.toXMLStreamReader(fault
> .getContent());
> XMLStreamWriter writer = transformer.getOutputFactory()
> .createXMLStreamWriter(response.getWriter());
> XMLStreamHelper.copy(reader, writer);
> }
>
> public void sendError(MessageExchange exchange, Exception error,
> HttpServletRequest request, HttpServletResponse response)
> throws Exception {
>
> // this means success :(
> if (error.getMessage().startsWith("Could not find route for
> exchange")) {
>
> String source = "";
> EndpointComponentContext ctx = (EndpointComponentContext)
> exchange.getMessage("in").getProperty("context");
> Field f = ctx.getClass().getDeclaredField("endpoint");
> boolean wasAccessible = f.isAccessible();
> if (!wasAccessible)
> {
> f.setAccessible(true);
> }
> HttpConsumerEndpoint httpe = (HttpConsumerEndpoint) f.get
> (ctx);
> f.setAccessible(wasAccessible);
> source = httpe.getTargetUri();
>
>
>
> response.setHeader("Content-Disposition", "inline");
> response.addHeader("Content-Transfer-Encoding", "Binary");
>
> Resource r = null;
>
> if (source.toString().startsWith("classpath:")) {
> String res = source.toString().substring(10);
>
> r = new ClassPathResource(res);
> } else {
> r = new FileSystemResource(source.toString());
> }
>
>
>
>
> if ("jpg".equals(source.toString().substring( source.toString
> ().lastIndexOf('.')+1)))
> {
> response.setContentType("image/jpeg");
> }
> else if ("xml".equals(source.toString().substring(
> source.toString().lastIndexOf('.')+1)))
> {
> response.setContentType("text/xml");
> }
> else
> {
> response.setContentType("application/binary");
> }
>
> if (r != null) {
>
> BufferedInputStream istr = new BufferedInputStream(r
> .getInputStream(), 1000);
>
> byte[] buff = new byte[1000];
>
> int s = 0;
> while ((s = istr.read(buff)) > 0) {
> response.getOutputStream().write(buff, 0, s);
> }
> istr.close();
>
> response.getOutputStream().close();
>
> response.setStatus(HttpServletResponse.SC_OK);
>
> } else {
> response.setStatus(404);
> }
> } else {
>
> response.setStatus(
> HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
> XMLStreamWriter writer = transformer.getOutputFactory()
> .createXMLStreamWriter(response.getWriter());
> writer.writeStartDocument();
> writer.writeStartElement("error");
> StringWriter sw = new StringWriter();
> PrintWriter pw = new PrintWriter(sw);
> error.printStackTrace(pw);
> pw.close();
> writer.writeCData(sw.toString());
> writer.writeEndElement();
> writer.writeEndDocument();
> }
> }
>
> public void sendAccepted(MessageExchange exchange,
> HttpServletRequest request, HttpServletResponse response)
> throws Exception {
> response.setStatus(HttpServletResponse.SC_ACCEPTED);
> }
>
> public URI getDefaultMep() {
> return defaultMep;
> }
>
> public void setDefaultMep(URI defaultMep) {
> this.defaultMep = defaultMep;
> }
> }
Eduardo Burgos
On 3/2/07, Eduardo Burgos <eb...@gmail.com> wrote:
>
> Ok, I'll try to do it myself and post on this thread.
>
>
>
> On 2/28/07, Guillaume Nodet <gnodet@gmail.com > wrote:
> >
> > There's no way to do that out of the box.
> > I would try hacking one of the lightweight http component
> > to support that.
> > Or you could try with the new marshaler stuff that we are working
> > on in servicemix-http (in the org.apache.servicemix.http.endpointspackage).
> >
> > On 2/26/07, Eduardo Burgos < eburgos@gmail.com> wrote:
> > > is there a way were I can expose file endpoints via http? i.e., I want
> > to
> > > have something like http://localhost/info.pdf point to a pdf document
> > in my
> > > filesystem. How can I do this with servicemix-http? or is there
> > another way
> > > to do it?
> > >
> >
> >
> > --
> > Cheers,
> > Guillaume Nodet
> > ------------------------
> > Architect, LogicBlaze ( http://www.logicblaze.com/)
> > Blog: http://gnodet.blogspot.com/
> >
>
>