Guillaume,

thank you for the answer. I will fix this asap.

Regards,
Lars


Am Donnerstag, 6. März 2008 10:40:09 schrieb Guillaume Nodet:
> Sorry for the delay.  I think using the FileDataSource totally makes sense.
> I don't think of any good reason why we would use a StreamDataSource.
> I suppose I missed the FileDataSource class when I wrote that class.
> Anyway, feel free to change, especially if it fixes problems ....
>
> On Thu, Mar 6, 2008 at 8:17 AM, Lars Heinemann
>
> <[EMAIL PROTECTED]> wrote:
> > Guillaume,
> >
> >  as you are the author of this class maybe you can clarify things here.
> >  I am using the binary file marshaler for a test case with the new
> >  servicemix-mail component. My test case simply polls all files from a
> > given folder and sends it to a mail-sender endpoint.
> >
> >  When using my own file marshaler (using FileDataSource) this test case
> > works well. But when I am switching to the BinaryFileMarshaler the
> > problems start.
> >
> >  Here the error stack trace:
> > 
> > -------------------------------------------------------------------------
> >------------------ javax.mail.MessagingException: IOException while
> > sending message; nested exception is:
> >         java.io.IOException: Stream closed
> >         at
> > com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:625) at
> > javax.mail.Transport.send0(Transport.java:169)
> >         at javax.mail.Transport.send(Transport.java:98)
> >         at
> > 
> > org.apache.servicemix.mail.MailSenderEndpoint.processInOnly(MailSenderEnd
> >point.java:113) at
> > 
> > org.apache.servicemix.common.endpoints.ProviderEndpoint.process(ProviderE
> >ndpoint.java:100) at
> > 
> > org.apache.servicemix.common.AsyncBaseLifeCycle.doProcess(AsyncBaseLifeCy
> >cle.java:538) at
> > 
> > org.apache.servicemix.common.AsyncBaseLifeCycle.processExchange(AsyncBase
> >LifeCycle.java:490) at
> > 
> > org.apache.servicemix.common.BaseLifeCycle.onMessageExchange(BaseLifeCycl
> >e.java:46) at
> > 
> > org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.processInBound(De
> >liveryChannelImpl.java:610) at
> > 
> > org.apache.servicemix.jbi.nmr.flow.AbstractFlow.doRouting(AbstractFlow.ja
> >va:170) at
> > 
> > org.apache.servicemix.jbi.nmr.flow.seda.SedaFlow.doRouting(SedaFlow.java:
> >167) at
> > 
> > org.apache.servicemix.jbi.nmr.flow.seda.SedaQueue$1.run(SedaQueue.java:13
> >4) at
> > 
> > java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor
> >.java:650) at
> > 
> > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.jav
> >a:675) at java.lang.Thread.run(Thread.java:595)
> >  Caused by: java.io.IOException: Stream closed
> >         at
> >  java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:145)
> >         at java.io.BufferedInputStream.read(BufferedInputStream.java:304)
> >         at java.io.FilterInputStream.read(FilterInputStream.java:90)
> >         at javax.activation.DataHandler.writeTo(DataHandler.java:307)
> >         at
> > javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1350) at
> > javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:845) at
> > javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:361) at
> >  com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:85)
> >         at
> >  javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:883)
> >         at javax.activation.DataHandler.writeTo(DataHandler.java:316)
> >         at
> > javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1350) at
> > javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1683) at
> > com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:585) ...
> > 14 more
> > 
> > -------------------------------------------------------------------------
> >------------------
> >
> >  I was wondering why this happens. So I decided to make another
> > FileMarshaler just cloning the BinaryFileMarshaler class and just replace
> > the StreamDataSource with the FileDataSource. The result was that it
> > worked afterwards.
> >  I had a look at the JAF and googled a bit and found that the
> > getInputStream() method should always return a new instance of a input
> > stream to the underlying data. This is not the case with the
> > StreamDataSource.
> >
> >  So the question is what to do now? Is the StreamDataSource not JAF
> > compliant and has to be changed or should the BinaryFileMarshaler use the
> > FileDataSource instead? (I would suggest the later)
> >
> >  What do you think?
> >
> >  Regards,
> >  Lars
> >
> >  Am Mittwoch, 5. März 2008 17:28:52 schrieb lhein:
> > > Hi,
> > >
> >  > I stumbled about the BinaryFileMarshaler while looking for a problem I
> >  > had. This one has 2 parameters to set:
> >  >
> >  > - contentType
> >  > - attachment
> >  >
> >  > Now the question. Why should somebody specify a content type? Isn't it
> >  > better to use the FileDataSource to put the file as attachment into
> >  > the message?
> >  > Second is why is there a configuration possibility for naming the
> >  > attachment? Is this really needed? I mean 99% would use the file name
> >  > as this or not?
> >  >
> >  > maybe we could also change it to something like this as a middle
> >  > solution:
> >  >
> >  > /**
> >  >  * A FileMarshaler that converts the given input stream into a binary
> >  >  * attachment.
> >  >  *
> >  >  * @org.apache.xbean.XBean
> >  >  *
> >  >  * @author Guillaume Nodet
> >  >  * @since 3.0
> >  >  */
> >  > public class BinaryFileMarshaler extends DefaultFileMarshaler {
> >  >
> >  >     private String attachment = FILE_CONTENT;
> >  >     private String contentType;
> >  >
> >  >     public String getAttachment() {
> >  >         return attachment;
> >  >     }
> >  >
> >  >     public void setAttachment(String attachment) {
> >  >         this.attachment = attachment;
> >  >     }
> >  >
> >  >     public String getContentType() {
> >  >         return contentType;
> >  >     }
> >  >
> >  >     public void setContentType(String contentType) {
> >  >         this.contentType = contentType;
> >  >     }
> >  >
> >  >     public void readMessage(MessageExchange exchange,
> >  > NormalizedMessage message,
> >  >                             InputStream in, String path) throws
> >  > IOException, JBIException {
> >  >         File file = new File(path);
> >  >         FileDataSource fds = new FileDataSource(file);
> >  >         DataSource ds = new StreamDataSource(in, contentType != null ?
> >  > contentType : fds.getContentType(), file.getName());
> >  >         DataHandler handler = new DataHandler(ds);
> >  >         message.addAttachment(attachment, handler);
> >  >         message.setProperty(FILE_NAME_PROPERTY, file.getName());
> >  >         message.setProperty(FILE_PATH_PROPERTY, path);
> >  >     }
> >  >
> >  >     public void writeMessage(MessageExchange exchange,
> >  > NormalizedMessage message,
> >  >                              OutputStream out, String path) throws
> >  > IOException, JBIException {
> >  >         DataHandler handler = message.getAttachment(attachment);
> >  >         if (handler == null) {
> >  >             throw new MessagingException("Could not find attachment: "
> >  >                     + attachment);
> >  >         }
> >  >         InputStream is = handler.getInputStream();
> >  >         FileUtil.copyInputStream(is, out);
> >  >     }
> >  >
> >  > }
> >  >
> >  > Shouldn't it be possible to use only FileDataSource or where is the
> >  > sense in doing it with StreamDataSource?
> >  >
> >  > Regards,
> >  > Lars


Reply via email to