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(MailSenderEndpoint.java:113)
> at
>
> org.apache.servicemix.common.endpoints.ProviderEndpoint.process(ProviderEndpoint.java:100)
> at
>
> org.apache.servicemix.common.AsyncBaseLifeCycle.doProcess(AsyncBaseLifeCycle.java:538)
> at
>
> org.apache.servicemix.common.AsyncBaseLifeCycle.processExchange(AsyncBaseLifeCycle.java:490)
> at
>
> org.apache.servicemix.common.BaseLifeCycle.onMessageExchange(BaseLifeCycle.java:46)
> at
>
> org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.processInBound(DeliveryChannelImpl.java:610)
> at
>
> org.apache.servicemix.jbi.nmr.flow.AbstractFlow.doRouting(AbstractFlow.java: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:134)
> at
>
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
> at
>
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java: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
>
>
>
--
Cheers,
Guillaume Nodet
------------------------
Blog: http://gnodet.blogspot.com/