camel-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Claus Ibsen <claus.ib...@gmail.com>
Subject Re: svn commit: r951337 - in /camel/trunk/camel-core/src: main/java/org/apache/camel/converter/stream/ test/java/org/apache/camel/converter/stream/ test/java/org/apache/camel/processor/
Date Fri, 04 Jun 2010 09:36:34 GMT
Cool Willem

You may want to use FileUtil.deleteFile which can work around oddities
with Windows etc. And have better logging and can retry etc.



On Fri, Jun 4, 2010 at 11:19 AM,  <ningjiang@apache.org> wrote:
> Author: ningjiang
> Date: Fri Jun  4 09:19:55 2010
> New Revision: 951337
>
> URL: http://svn.apache.org/viewvc?rev=951337&view=rev
> Log:
> CAMEL-2496,CAMEL-2776 delete the temp file only after route is completed
>
> Modified:
>    camel/trunk/camel-core/src/main/java/org/apache/camel/converter/stream/CachedOutputStream.java
>    camel/trunk/camel-core/src/main/java/org/apache/camel/converter/stream/FileInputStreamCache.java
>    camel/trunk/camel-core/src/test/java/org/apache/camel/converter/stream/CachedOutputStreamTest.java
>    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitterStreamCacheTest.java
>
> Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/converter/stream/CachedOutputStream.java
> URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/converter/stream/CachedOutputStream.java?rev=951337&r1=951336&r2=951337&view=diff
> ==============================================================================
> --- camel/trunk/camel-core/src/main/java/org/apache/camel/converter/stream/CachedOutputStream.java
(original)
> +++ camel/trunk/camel-core/src/main/java/org/apache/camel/converter/stream/CachedOutputStream.java
Fri Jun  4 09:19:55 2010
> @@ -30,6 +30,7 @@ import java.util.List;
>
>  import org.apache.camel.Exchange;
>  import org.apache.camel.StreamCache;
> +import org.apache.camel.impl.SynchronizationAdapter;
>  import org.apache.camel.util.FileUtil;
>  import org.apache.camel.util.IOHelper;
>  import org.apache.commons.logging.Log;
> @@ -41,7 +42,8 @@ import org.apache.commons.logging.LogFac
>  * can configure it by setting the TEMP_DIR property. If you don't set the TEMP_DIR
property,
>  * it will choose the directory which is set by the system property of "java.io.tmpdir".
>  * You can get a cached input stream of this stream. The temp file which is created
with this
> - * output stream will be deleted when you close this output stream or the cached inputStream.
> + * output stream will be deleted when you close this output stream or the all cached
> + * fileInputStream is closed after the exchange is completed.
>  */
>  public class CachedOutputStream extends OutputStream {
>     public static final String THRESHOLD = "CamelCachedOutputStreamThreshold";
> @@ -52,6 +54,7 @@ public class CachedOutputStream extends
>     private boolean inMemory = true;
>     private int totalLength;
>     private File tempFile;
> +    private boolean exchangeOnCompleted;
>
>     private List<FileInputStreamCache> fileInputStreamCaches = new ArrayList<FileInputStreamCache>(4);
>
> @@ -68,6 +71,27 @@ public class CachedOutputStream extends
>             this.outputDir = exchange.getContext().getTypeConverter().convertTo(File.class,
dir);
>         }
>
> +        // add on completion so we can cleanup after the exchange is done such as
deleting temporary files
> +        exchange.addOnCompletion(new SynchronizationAdapter() {
> +            @Override
> +            public void onDone(Exchange exchange) {
> +                try {
> +                    //set the flag so we can delete the temp file
> +                    exchangeOnCompleted = true;
> +                    if (fileInputStreamCaches.size() == 0) {
> +                        // there is no open fileInputStream let's close
it
> +                        close();
> +                    }
> +                } catch (Exception e) {
> +                    LOG.warn("Error deleting temporary cache file: " + tempFile,
e);
> +                }
> +            }
> +
> +            @Override
> +            public String toString() {
> +                return "OnCompletion[CachedOutputStream]";
> +            }
> +        });
>     }
>
>     public void flush() throws IOException {
> @@ -76,20 +100,7 @@ public class CachedOutputStream extends
>
>     public void close() throws IOException {
>         currentStream.close();
> -        try {
> -            // cleanup temporary file
> -            if (tempFile != null) {
> -                boolean deleted = tempFile.delete();
> -                if (!deleted) {
> -                    LOG.warn("Cannot delete temporary cache file: " + tempFile);
> -                } else if (LOG.isTraceEnabled()) {
> -                    LOG.trace("Deleted temporary cache file: " + tempFile);
> -                }
> -                tempFile = null;
> -            }
> -        } catch (Exception e) {
> -            LOG.warn("Error deleting temporary cache file: " + tempFile, e);
> -        }
> +        cleanUpTempFile();
>     }
>
>     public boolean equals(Object obj) {
> @@ -168,6 +179,27 @@ public class CachedOutputStream extends
>             }
>         }
>     }
> +
> +    public void releaseFileInputStream(FileInputStreamCache fileInputStreamCache)
throws IOException {
> +        fileInputStreamCaches.remove(fileInputStreamCache);
> +        if (exchangeOnCompleted && fileInputStreamCaches.size() == 0) {
> +            // now we can close stream and delete the temp file
> +            close();
> +        }
> +    }
> +
> +    private void cleanUpTempFile() {
> +        // cleanup temporary file
> +        if (tempFile != null) {
> +            boolean deleted = tempFile.delete();
> +            if (!deleted) {
> +                LOG.warn("Cannot delete temporary cache file: " + tempFile);
> +            } else if (LOG.isTraceEnabled()) {
> +                LOG.trace("Deleted temporary cache file: " + tempFile);
> +            }
> +            tempFile = null;
> +        }
> +    }
>
>     private void pageToFileStream() throws IOException {
>         flush();
>
> Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/converter/stream/FileInputStreamCache.java
> URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/converter/stream/FileInputStreamCache.java?rev=951337&r1=951336&r2=951337&view=diff
> ==============================================================================
> --- camel/trunk/camel-core/src/main/java/org/apache/camel/converter/stream/FileInputStreamCache.java
(original)
> +++ camel/trunk/camel-core/src/main/java/org/apache/camel/converter/stream/FileInputStreamCache.java
Fri Jun  4 09:19:55 2010
> @@ -44,9 +44,9 @@ public class FileInputStreamCache extend
>             if (isSteamOpened()) {
>                 getInputStream().close();
>             }
> -            // when close the FileInputStreamCache we should also close the cachedOutputStream
> +            // Just remove the itself from cachedOutputStream
>             if (cachedOutputStream != null) {
> -                cachedOutputStream.close();
> +                cachedOutputStream.releaseFileInputStream(this);
>             }
>         } catch (Exception e) {
>             throw new RuntimeCamelException(e);
>
> Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/converter/stream/CachedOutputStreamTest.java
> URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/stream/CachedOutputStreamTest.java?rev=951337&r1=951336&r2=951337&view=diff
> ==============================================================================
> --- camel/trunk/camel-core/src/test/java/org/apache/camel/converter/stream/CachedOutputStreamTest.java
(original)
> +++ camel/trunk/camel-core/src/test/java/org/apache/camel/converter/stream/CachedOutputStreamTest.java
Fri Jun  4 09:19:55 2010
> @@ -76,7 +76,9 @@ public class CachedOutputStreamTest exte
>         String temp = toString((InputStream)cache);
>
>         ((InputStream)cache).close();
> +        assertEquals("we should have a temp file", files.length, 1);
>         assertEquals("Cached a wrong file", temp, TEST_STRING);
> +        exchange.getUnitOfWork().done(exchange);
>
>         try {
>             cache.reset();
> @@ -91,7 +93,7 @@ public class CachedOutputStreamTest exte
>         assertEquals("we should have no temp file", files.length, 0);
>     }
>
> -    public void testCacheStreamToFileAndNotCloseStream() throws IOException {
> +    public void testCacheStreamToFileCloseStreamBeforeDone() throws IOException {
>         CachedOutputStream cos = new CachedOutputStream(exchange);
>         cos.write(TEST_STRING.getBytes("UTF-8"));
>
> @@ -106,8 +108,9 @@ public class CachedOutputStreamTest exte
>         assertEquals("Cached a wrong file", temp, TEST_STRING);
>         cache.reset();
>         temp = toString((InputStream)cache);
> -        assertEquals("Cached a wrong file", temp, TEST_STRING);
> -
> +        assertEquals("Cached a wrong file", temp, TEST_STRING);
> +        exchange.getUnitOfWork().done(exchange);
> +        assertEquals("we should have a temp file", files.length, 1);
>         ((InputStream)cache).close();
>
>         files = file.list();
>
> Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitterStreamCacheTest.java
> URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitterStreamCacheTest.java?rev=951337&r1=951336&r2=951337&view=diff
> ==============================================================================
> --- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitterStreamCacheTest.java
(original)
> +++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitterStreamCacheTest.java
Fri Jun  4 09:19:55 2010
> @@ -43,13 +43,8 @@ public class SplitterStreamCacheTest ext
>
>     private static final String TEST_FILE = "org/apache/camel/converter/stream/test.xml";
>     protected int numMessages = 1000;
> -
> -    public void testDummy() {
> -        // noop
> -    }
> -
> -    // TODO: Disabled due it fails
> -    public void xxxTestSendStreamSource() throws Exception {
> +
> +    public void testSendStreamSource() throws Exception {
>         MockEndpoint resultEndpoint = getMockEndpoint("mock:result");
>         resultEndpoint.expectedMessageCount(numMessages);
>
>
>
>



-- 
Claus Ibsen
Apache Camel Committer

Author of Camel in Action: http://www.manning.com/ibsen/
Open Source Integration: http://fusesource.com
Blog: http://davsclaus.blogspot.com/
Twitter: http://twitter.com/davsclaus

Mime
View raw message