[1/2] camel git commit: Start using Files.newXXputStream instead of "new FileXXputStream" to reduce finalizer contention

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

[1/2] camel git commit: Start using Files.newXXputStream instead of "new FileXXputStream" to reduce finalizer contention

dkulp@apache.org
Repository: camel
Updated Branches:
  refs/heads/master 98d346612 -> d8c0a53b6


Start using Files.newXXputStream instead of "new FileXXputStream" to reduce finalizer contention


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/d8c0a53b
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/d8c0a53b
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/d8c0a53b

Branch: refs/heads/master
Commit: d8c0a53b6787778661fb4cde3c59a50b5691efac
Parents: 81de0f5
Author: Daniel Kulp <[hidden email]>
Authored: Wed Jul 26 17:29:23 2017 -0400
Committer: Daniel Kulp <[hidden email]>
Committed: Wed Jul 26 17:33:13 2017 -0400

----------------------------------------------------------------------
 .../camel/component/file/FileOperations.java    | 54 +++++++-------------
 .../converter/stream/FileInputStreamCache.java  | 28 ++--------
 .../java/org/apache/camel/util/FileUtil.java    | 24 ++-------
 3 files changed, 26 insertions(+), 80 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/d8c0a53b/camel-core/src/main/java/org/apache/camel/component/file/FileOperations.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/file/FileOperations.java b/camel-core/src/main/java/org/apache/camel/component/file/FileOperations.java
index ac6304e..2ee56fe 100644
--- a/camel-core/src/main/java/org/apache/camel/component/file/FileOperations.java
+++ b/camel-core/src/main/java/org/apache/camel/component/file/FileOperations.java
@@ -17,17 +17,17 @@
 package org.apache.camel.component.file;
 
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import java.io.RandomAccessFile;
 import java.io.Reader;
 import java.io.Writer;
 import java.nio.ByteBuffer;
-import java.nio.channels.FileChannel;
+import java.nio.channels.SeekableByteChannel;
+import java.nio.charset.Charset;
 import java.nio.file.Files;
+import java.nio.file.StandardCopyOption;
+import java.nio.file.StandardOpenOption;
 import java.nio.file.attribute.PosixFilePermission;
 import java.nio.file.attribute.PosixFilePermissions;
 import java.util.Date;
@@ -37,10 +37,10 @@ import java.util.Set;
 import org.apache.camel.Exchange;
 import org.apache.camel.InvalidPayloadException;
 import org.apache.camel.WrappedFile;
-import org.apache.camel.converter.IOConverter;
 import org.apache.camel.util.FileUtil;
 import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.StringHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -157,7 +157,7 @@ public class FileOperations implements GenericFileOperations<File> {
             path = endpointPath;
         } else {
             // relative after the endpoint path
-            String afterRoot = ObjectHelper.after(directory, endpointPath.getPath() + File.separator);
+            String afterRoot = StringHelper.after(directory, endpointPath.getPath() + File.separator);
             if (ObjectHelper.isNotEmpty(afterRoot)) {
                 // dir is under the root path
                 path = new File(endpoint.getFile(), afterRoot);
@@ -430,26 +430,12 @@ public class FileOperations implements GenericFileOperations<File> {
     }
 
     private void writeFileByFile(File source, File target) throws IOException {
-        FileChannel in = new FileInputStream(source).getChannel();
-        FileChannel out = null;
-        try {
-            out = prepareOutputFileChannel(target);
-            LOG.debug("Using FileChannel to write file: {}", target);
-            long size = in.size();
-            long position = 0;
-            while (position < size) {
-                position += in.transferTo(position, endpoint.getBufferSize(), out);
-            }
-        } finally {
-            IOHelper.close(in, source.getName(), LOG);
-            IOHelper.close(out, target.getName(), LOG, endpoint.isForceWrites());
-        }
+        Files.copy(source.toPath(), target.toPath(), StandardCopyOption.REPLACE_EXISTING);
     }
 
     private void writeFileByStream(InputStream in, File target) throws IOException {
-        FileChannel out = null;
-        try {
-            out = prepareOutputFileChannel(target);
+        try (SeekableByteChannel out = prepareOutputFileChannel(target)) {
+            
             LOG.debug("Using InputStream to write file: {}", target);
             int size = endpoint.getBufferSize();
             byte[] buffer = new byte[size];
@@ -464,21 +450,20 @@ public class FileOperations implements GenericFileOperations<File> {
             }
         } finally {
             IOHelper.close(in, target.getName(), LOG);
-            IOHelper.close(out, target.getName(), LOG, endpoint.isForceWrites());
         }
     }
 
     private void writeFileByReaderWithCharset(Reader in, File target, String charset) throws IOException {
         boolean append = endpoint.getFileExist() == GenericFileExist.Append;
-        FileOutputStream os = new FileOutputStream(target, append);
-        Writer out = IOConverter.toWriter(os, charset);
-        try {
+        try (Writer out = Files.newBufferedWriter(target.toPath(), Charset.forName(charset),
+                                                  StandardOpenOption.WRITE,
+                                                  append ? StandardOpenOption.APPEND : StandardOpenOption.TRUNCATE_EXISTING,
+                                                  StandardOpenOption.CREATE)) {
             LOG.debug("Using Reader to write file: {} with charset: {}", target, charset);
             int size = endpoint.getBufferSize();
             IOHelper.copy(in, out, size);
         } finally {
             IOHelper.close(in, target.getName(), LOG);
-            IOHelper.close(out, os, target.getName(), LOG, endpoint.isForceWrites());
         }
     }
 
@@ -492,11 +477,8 @@ public class FileOperations implements GenericFileOperations<File> {
             FileUtil.createNewFile(target);
         } else if (endpoint.getFileExist() == GenericFileExist.Override) {
             LOG.debug("Truncating existing file: {}", target);
-            FileChannel out = new FileOutputStream(target).getChannel();
-            try {
-                out.truncate(0);
-            } finally {
-                IOHelper.close(out, target.getName(), LOG, endpoint.isForceWrites());
+            try (SeekableByteChannel out = Files.newByteChannel(target.toPath(), StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE)) {
+                //nothing to write
             }
         }
     }
@@ -505,11 +487,11 @@ public class FileOperations implements GenericFileOperations<File> {
      * Creates and prepares the output file channel. Will position itself in correct position if the file is writable
      * eg. it should append or override any existing content.
      */
-    private FileChannel prepareOutputFileChannel(File target) throws IOException {
+    private SeekableByteChannel prepareOutputFileChannel(File target) throws IOException {
         if (endpoint.getFileExist() == GenericFileExist.Append) {
-            FileChannel out = new RandomAccessFile(target, "rw").getChannel();
+            SeekableByteChannel out = Files.newByteChannel(target.toPath(), StandardOpenOption.CREATE, StandardOpenOption.APPEND);
             return out.position(out.size());
         }
-        return new FileOutputStream(target).getChannel();
+        return Files.newByteChannel(target.toPath(), StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.CREATE);
     }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/d8c0a53b/camel-core/src/main/java/org/apache/camel/converter/stream/FileInputStreamCache.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/converter/stream/FileInputStreamCache.java b/camel-core/src/main/java/org/apache/camel/converter/stream/FileInputStreamCache.java
index a0d6501..acea1c9 100644
--- a/camel-core/src/main/java/org/apache/camel/converter/stream/FileInputStreamCache.java
+++ b/camel-core/src/main/java/org/apache/camel/converter/stream/FileInputStreamCache.java
@@ -19,15 +19,12 @@ package org.apache.camel.converter.stream;
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.nio.channels.Channels;
-import java.nio.channels.FileChannel;
-import java.nio.channels.WritableByteChannel;
+import java.nio.file.Files;
+import java.nio.file.StandardOpenOption;
 import java.security.GeneralSecurityException;
 import java.util.ArrayList;
 import java.util.List;
@@ -94,22 +91,7 @@ public final class FileInputStreamCache extends InputStream implements StreamCac
 
     public void writeTo(OutputStream os) throws IOException {
         if (stream == null && ciphers == null) {
-            FileInputStream s = new FileInputStream(file);
-            long len = file.length();
-            WritableByteChannel out;
-            if (os instanceof WritableByteChannel) {
-                out = (WritableByteChannel)os;
-            } else {
-                out = Channels.newChannel(os);
-            }
-            FileChannel fc = s.getChannel();
-            long pos = 0;
-            while (pos < len) {
-                long i = fc.transferTo(pos, len - pos, out);
-                pos += i;
-            }
-            s.close();
-            fc.close();
+            Files.copy(file.toPath(), os);
         } else {
             IOHelper.copy(getInputStream(), os);
         }
@@ -147,7 +129,7 @@ public final class FileInputStreamCache extends InputStream implements StreamCac
     }
 
     private InputStream createInputStream(File file) throws IOException {
-        InputStream in = new BufferedInputStream(new FileInputStream(file));
+        InputStream in = new BufferedInputStream(Files.newInputStream(file.toPath(), StandardOpenOption.READ));
         if (ciphers != null) {
             in = new CipherInputStream(in, ciphers.getDecryptor()) {
                 boolean closed;
@@ -258,7 +240,7 @@ public final class FileInputStreamCache extends InputStream implements StreamCac
             tempFile = FileUtil.createTempFile("cos", ".tmp", strategy.getSpoolDirectory());
 
             LOG.trace("Creating temporary stream cache file: {}", tempFile);
-            OutputStream out = new BufferedOutputStream(new FileOutputStream(tempFile));
+            OutputStream out = new BufferedOutputStream(Files.newOutputStream(tempFile.toPath(), StandardOpenOption.CREATE, StandardOpenOption.WRITE));
             if (ObjectHelper.isNotEmpty(strategy.getSpoolChiper())) {
                 try {
                     if (ciphers == null) {

http://git-wip-us.apache.org/repos/asf/camel/blob/d8c0a53b/camel-core/src/main/java/org/apache/camel/util/FileUtil.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/util/FileUtil.java b/camel-core/src/main/java/org/apache/camel/util/FileUtil.java
index f60bab4..d1782e0 100644
--- a/camel-core/src/main/java/org/apache/camel/util/FileUtil.java
+++ b/camel-core/src/main/java/org/apache/camel/util/FileUtil.java
@@ -17,10 +17,9 @@
 package org.apache.camel.util;
 
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
 import java.io.IOException;
-import java.nio.channels.FileChannel;
+import java.nio.file.Files;
+import java.nio.file.StandardCopyOption;
 import java.util.ArrayDeque;
 import java.util.Deque;
 import java.util.Iterator;
@@ -532,24 +531,7 @@ public final class FileUtil {
      * @throws IOException If an I/O error occurs during copy operation
      */
     public static void copyFile(File from, File to) throws IOException {
-        FileChannel in = null;
-        FileChannel out = null;
-        try {
-            in = new FileInputStream(from).getChannel();
-            out = new FileOutputStream(to).getChannel();
-            if (LOG.isTraceEnabled()) {
-                LOG.trace("Using FileChannel to copy from: " + in + " to: " + out);
-            }
-
-            long size = in.size();
-            long position = 0;
-            while (position < size) {
-                position += in.transferTo(position, BUFFER_SIZE, out);
-            }
-        } finally {
-            IOHelper.close(in, from.getName(), LOG);
-            IOHelper.close(out, to.getName(), LOG);
-        }
+        Files.copy(from.toPath(), to.toPath(), StandardCopyOption.REPLACE_EXISTING);
     }
 
     /**

Reply | Threaded
Open this post in threaded view
|

[2/2] camel git commit: Put jackson-core in test scope as well as jackson-databinding has classes that depend on it and not having it makes the eclipse compiler complain and not compile anything.

dkulp@apache.org
Put jackson-core in test scope as well as jackson-databinding has classes that depend on it and not having it makes the eclipse compiler complain and not compile anything.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/81de0f58
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/81de0f58
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/81de0f58

Branch: refs/heads/master
Commit: 81de0f5808b0c8877d762481150a494fe26b8d32
Parents: 98d3466
Author: Daniel Kulp <[hidden email]>
Authored: Wed Jul 26 16:00:28 2017 -0400
Committer: Daniel Kulp <[hidden email]>
Committed: Wed Jul 26 17:33:13 2017 -0400

----------------------------------------------------------------------
 camel-core/pom.xml | 5 +++++
 1 file changed, 5 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/81de0f58/camel-core/pom.xml
----------------------------------------------------------------------
diff --git a/camel-core/pom.xml b/camel-core/pom.xml
index 598e216..6726527 100644
--- a/camel-core/pom.xml
+++ b/camel-core/pom.xml
@@ -195,6 +195,11 @@
       <artifactId>jackson-databind</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+        <groupId>com.fasterxml.jackson.core</groupId>
+        <artifactId>jackson-core</artifactId>
+        <scope>test</scope>
+    </dependency>
 
     <!-- validator -->
     <dependency>