On Thursday 04 December 2008 7:21:36 pm Daniel Lipofsky wrote:
> Are those changes in 2.1.3 or are they unreleased?
> I upgraded to 2.1.3, and using the code below I can
> see that it is not calling either writeTo() or
> getInputStream() on the DataHandler.  It is calling
> getInputStream() on the DataSource. I see output from
> the first 2 log calls but not any of the others.

Interesting.   Anychance you could put  a Thread.dumpStack() in there and let 
me know where that's being called?

The AttachmentOut stuff calls writeTo, but it's possible one of the other 
interceptors is remapping things someplace.


> Also, do you think this code below is acceptable.
> Notice I am NOT calling super on getInputStream().
> This is because I wanted to create my own InputStream
> rather than wrap the one that was returned by super.
> Do you see any problems? (it works)

Yea, that's fine and probably preferable since if we do take the DataSource 
out of the DataHandler, it would still work.

Dan



>
>     FileDataSource ds = new FileDataSource(tempFile) {
>         @Override
>         public InputStream getInputStream() throws IOException {
>             log.warn("I ***** " + tempFile);
>             return new FileInputStream(tempFile) {
>                 public void close() throws IOException {
>                     log.warn("C ***** " + tempFile);
>                     super.close();
>                     tempFile.delete();
>                 }
>             };
>         }tuff at:
> http://mssoapinterop.org/ilab/
>   
I can see UX, UXD, AD...., MS Interop Plugfest scenarios. I too have 
worked on preparing them with Jiandong Guo (
>     };
>     return new DataHandler(ds);
>
> Thanks,
> Dan
>
> > -----Original Message-----
> > From: Daniel Kulp [mailto:[EMAIL PROTECTED]
> > Sent: Wednesday, December 03, 2008 12:18 PM
> > To: [email protected]
> > Cc: Daniel Lipofsky
> > Subject: Re: Closing temp files after streaming is complete
> >
> >
> > I was looking at the latest 2.1.x code which I know has had a bunch of
> > changes
> > around the attachment support to make sure streams are closed and
>
> such.
>
> > It's
> > quite possible that 2.1.0 is different.
> >
> > That said, the OTHER thing you can try is to override the
> > getInputStream()
> > call on the FileDataSource to return a FilterOutputStream that
> > overrides
> > the "close" method to call super.close() and then delete the file.
>
> For
>
> > the
> > most part, I THINK we either have to call DataHandler.writeTo(..) or
> > call
> > DataHandler.getInputStream() and copy the bytes out of there and into
> > the
> > target stream.
> >
> > Dan
> >
> > On Wednesday 03 December 2008 2:08:14 pm Daniel Lipofsky wrote:
> > > Unfortunately that doesn't seem to work.  I see no evidence
> > > that my code is actually being called, i.e. there is no log
> > > output and the file is not deleted, but everything works
> > > without errors like it did before I added this code.
> > > Does CXF really call this method?  It seems possible
> > > that it could be getting the streams directly from the
> > > DataHandler.  I'm using CXF 2.1.0, JBoss 4.2.3, JDK 1.5.
> > >
> > > This is what I am implemented:
> > >
> > > public DataHandler getObjectsAsAttachment(...) throws WSException {
> > >     try {
> > >         final File tempFile = ...;
> > >         ...
> > >         return new DataHandler(new FileDataSource(tempFile)) {
> > >             @Override
> > >             public void writeTo(OutputStream out) throws IOException
> >
> > {
> >
> > >                 super.writeTo(out);
> > >                 log.info("########### " + tempFile + "
>
> ###########");
>
> > >                 tempFile.delete();
> > >             }
> > >         };
> > >     } catch (Exception e) {
> > >         log.error("Exception thrown in getObjectsAsAttachment", e);
> > >         throw new WSException(e);
> > >     }
> > > }
> > >
> > > > -----Original Message-----
> > > > From: Daniel Kulp
> > > > Sent: Tuesday, December 02, 2008 2:38 PM
> > > >
> > > > In general, in this type of case, I recommend doing something
>
> like:
> > > > (pseudo
> > > > code)
> > > >
> > > >  return new DataHandler(new FileDataSource(tempFile)) {
> > > >     public void writeTo(OutputStream out)  {
> > > >         super.writeTo(out);
> > > >         tempFile.delete();
> > > >     }
> > > > };
> > > >
> > > > or similar.   Basically, when the datahandler is done being
>
> written
>
> > > > out,
> > > > delete the file.
> > > >
> > > > Dan
> > > >
> > > > On Tuesday 02 December 2008 1:14:40 pm Daniel Lipofsky wrote:
> > > > > I have a web-service that is returning a stream like this:
> > > > >
> > > > >   <xsd:element name="objects" type="xsd:base64Binary"
> > > > >      xmime:expectedContentTypes="application/octet-stream"/>
> > > > >
> > > > > My implementation method works by creating a
> > > > > temporary file and the returning like
> > > > >
> > > > >   return new DataHandler(new FileDataSource(tempFile));
> > > > >
> > > > > My understanding is that this is asynchronous.
> > > > > So how can I trigger a deletion of this file
> > > > > when the streaming is done?
> > > > >
> > > > > I am already calling tempFile.deleteOnExit() but it
> > > > > could be months or years before the JVM actually exits,
> > > > > and I want to delete it sooner.
> > > > >
> > > > > Thanks,
> > > > > Dan
> >
> > --
> > Daniel Kulp
> > [EMAIL PROTECTED]
> > http://dankulp.com/blog



-- 
Daniel Kulp
[EMAIL PROTECTED]
http://dankulp.com/blog

Reply via email to