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/
> >
>
>