You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2016/02/18 20:00:34 UTC

[1/3] camel git commit: CAMEL-9618: File endpoint - Move some options from generic to file as they are file specifc

Repository: camel
Updated Branches:
  refs/heads/master 95b60ce5e -> ca743cf73


CAMEL-9618: File endpoint - Move some options from generic to file as they are file specifc


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

Branch: refs/heads/master
Commit: ca743cf736b85915ac9432aaaef8997fed06a2b6
Parents: 9784d03
Author: Claus Ibsen <da...@apache.org>
Authored: Thu Feb 18 19:48:07 2016 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Thu Feb 18 19:57:39 2016 +0100

----------------------------------------------------------------------
 .../camel/component/file/FileConsumer.java      |   2 +-
 .../camel/component/file/FileEndpoint.java      | 166 +++++++++++++++++++
 .../component/file/GenericFileEndpoint.java     | 161 ------------------
 3 files changed, 167 insertions(+), 162 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/ca743cf7/camel-core/src/main/java/org/apache/camel/component/file/FileConsumer.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/file/FileConsumer.java b/camel-core/src/main/java/org/apache/camel/component/file/FileConsumer.java
index 16c5cd2..7ffc1a7 100644
--- a/camel-core/src/main/java/org/apache/camel/component/file/FileConsumer.java
+++ b/camel-core/src/main/java/org/apache/camel/component/file/FileConsumer.java
@@ -39,7 +39,7 @@ public class FileConsumer extends GenericFileConsumer<File> {
     private String endpointPath;
     private Set<String> extendedAttributes;
 
-    public FileConsumer(GenericFileEndpoint<File> endpoint, Processor processor, GenericFileOperations<File> operations) {
+    public FileConsumer(FileEndpoint endpoint, Processor processor, GenericFileOperations<File> operations) {
         super(endpoint, processor, operations);
         this.endpointPath = endpoint.getConfiguration().getDirectory();
 

http://git-wip-us.apache.org/repos/asf/camel/blob/ca743cf7/camel-core/src/main/java/org/apache/camel/component/file/FileEndpoint.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/file/FileEndpoint.java b/camel-core/src/main/java/org/apache/camel/component/file/FileEndpoint.java
index 2d51753..a55dc6f 100644
--- a/camel-core/src/main/java/org/apache/camel/component/file/FileEndpoint.java
+++ b/camel-core/src/main/java/org/apache/camel/component/file/FileEndpoint.java
@@ -19,6 +19,9 @@ package org.apache.camel.component.file;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.nio.file.Files;
+import java.nio.file.attribute.PosixFilePermission;
+import java.util.HashSet;
+import java.util.Set;
 
 import org.apache.camel.Component;
 import org.apache.camel.Exchange;
@@ -38,6 +41,10 @@ import org.apache.camel.util.ObjectHelper;
 @UriEndpoint(scheme = "file", title = "File", syntax = "file:directoryName", consumerClass = FileConsumer.class, label = "core,file")
 public class FileEndpoint extends GenericFileEndpoint<File> {
 
+    private static final Integer CHMOD_WRITE_MASK = 02;
+    private static final Integer CHMOD_READ_MASK = 04;
+    private static final Integer CHMOD_EXECUTE_MASK = 01;
+
     private final FileOperations operations = new FileOperations(this);
 
     @UriPath(name = "directoryName") @Metadata(required = "true")
@@ -50,6 +57,12 @@ public class FileEndpoint extends GenericFileEndpoint<File> {
     private boolean forceWrites = true;
     @UriParam(label = "consumer,advanced")
     private boolean probeContentType;
+    @UriParam(label = "consumer,advanced")
+    private String extendedAttributes;
+    @UriParam(label = "producer,advanced")
+    private String chmod;
+    @UriParam(label = "producer,advanced")
+    private String chmodDirectory;
 
     public FileEndpoint() {
         // use marker file as default exclusive read locks
@@ -225,4 +238,157 @@ public class FileEndpoint extends GenericFileEndpoint<File> {
     public void setProbeContentType(boolean probeContentType) {
         this.probeContentType = probeContentType;
     }
+
+
+    public String getExtendedAttributes() {
+        return extendedAttributes;
+    }
+
+    /**
+     * To define which file attributes of interest. Like posix:permissions,posix:owner,basic:lastAccessTime,
+     * it supports basic wildcard like posix:*, basic:lastAccessTime
+     */
+    public void setExtendedAttributes(String extendedAttributes) {
+        this.extendedAttributes = extendedAttributes;
+    }
+
+    /**
+     * Chmod value must be between 000 and 777; If there is a leading digit like in 0755 we will ignore it.
+     */
+    public boolean chmodPermissionsAreValid(String chmod) {
+        if (chmod == null || chmod.length() < 3 || chmod.length() > 4) {
+            return false;
+        }
+        String permissionsString = chmod.trim().substring(chmod.length() - 3);  // if 4 digits chop off leading one
+        for (int i = 0; i < permissionsString.length(); i++) {
+            Character c = permissionsString.charAt(i);
+            if (!Character.isDigit(c) || Integer.parseInt(c.toString()) > 7) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public Set<PosixFilePermission> getPermissions() {
+        Set<PosixFilePermission> permissions = new HashSet<PosixFilePermission>();
+        if (ObjectHelper.isEmpty(chmod)) {
+            return permissions;
+        }
+
+        String chmodString = chmod.substring(chmod.length() - 3);  // if 4 digits chop off leading one
+
+        Integer ownerValue = Integer.parseInt(chmodString.substring(0, 1));
+        Integer groupValue = Integer.parseInt(chmodString.substring(1, 2));
+        Integer othersValue = Integer.parseInt(chmodString.substring(2, 3));
+
+        if ((ownerValue & CHMOD_WRITE_MASK) > 0) {
+            permissions.add(PosixFilePermission.OWNER_WRITE);
+        }
+        if ((ownerValue & CHMOD_READ_MASK) > 0) {
+            permissions.add(PosixFilePermission.OWNER_READ);
+        }
+        if ((ownerValue & CHMOD_EXECUTE_MASK) > 0) {
+            permissions.add(PosixFilePermission.OWNER_EXECUTE);
+        }
+
+        if ((groupValue & CHMOD_WRITE_MASK) > 0) {
+            permissions.add(PosixFilePermission.GROUP_WRITE);
+        }
+        if ((groupValue & CHMOD_READ_MASK) > 0) {
+            permissions.add(PosixFilePermission.GROUP_READ);
+        }
+        if ((groupValue & CHMOD_EXECUTE_MASK) > 0) {
+            permissions.add(PosixFilePermission.GROUP_EXECUTE);
+        }
+
+        if ((othersValue & CHMOD_WRITE_MASK) > 0) {
+            permissions.add(PosixFilePermission.OTHERS_WRITE);
+        }
+        if ((othersValue & CHMOD_READ_MASK) > 0) {
+            permissions.add(PosixFilePermission.OTHERS_READ);
+        }
+        if ((othersValue & CHMOD_EXECUTE_MASK) > 0) {
+            permissions.add(PosixFilePermission.OTHERS_EXECUTE);
+        }
+
+        return permissions;
+    }
+
+    public String getChmod() {
+        return chmod;
+    }
+
+    /**
+     * Specify the file permissions which is sent by the producer, the chmod value must be between 000 and 777;
+     * If there is a leading digit like in 0755 we will ignore it.
+     */
+    public void setChmod(String chmod) throws Exception {
+        if (ObjectHelper.isNotEmpty(chmod) && chmodPermissionsAreValid(chmod)) {
+            this.chmod = chmod.trim();
+        } else {
+            throw new IllegalArgumentException("chmod option [" + chmod + "] is not valid");
+        }
+    }
+
+    public Set<PosixFilePermission> getDirectoryPermissions() {
+        Set<PosixFilePermission> permissions = new HashSet<PosixFilePermission>();
+        if (ObjectHelper.isEmpty(chmodDirectory)) {
+            return permissions;
+        }
+
+        String chmodString = chmodDirectory.substring(chmodDirectory.length() - 3);  // if 4 digits chop off leading one
+
+        Integer ownerValue = Integer.parseInt(chmodString.substring(0, 1));
+        Integer groupValue = Integer.parseInt(chmodString.substring(1, 2));
+        Integer othersValue = Integer.parseInt(chmodString.substring(2, 3));
+
+        if ((ownerValue & CHMOD_WRITE_MASK) > 0) {
+            permissions.add(PosixFilePermission.OWNER_WRITE);
+        }
+        if ((ownerValue & CHMOD_READ_MASK) > 0) {
+            permissions.add(PosixFilePermission.OWNER_READ);
+        }
+        if ((ownerValue & CHMOD_EXECUTE_MASK) > 0) {
+            permissions.add(PosixFilePermission.OWNER_EXECUTE);
+        }
+
+        if ((groupValue & CHMOD_WRITE_MASK) > 0) {
+            permissions.add(PosixFilePermission.GROUP_WRITE);
+        }
+        if ((groupValue & CHMOD_READ_MASK) > 0) {
+            permissions.add(PosixFilePermission.GROUP_READ);
+        }
+        if ((groupValue & CHMOD_EXECUTE_MASK) > 0) {
+            permissions.add(PosixFilePermission.GROUP_EXECUTE);
+        }
+
+        if ((othersValue & CHMOD_WRITE_MASK) > 0) {
+            permissions.add(PosixFilePermission.OTHERS_WRITE);
+        }
+        if ((othersValue & CHMOD_READ_MASK) > 0) {
+            permissions.add(PosixFilePermission.OTHERS_READ);
+        }
+        if ((othersValue & CHMOD_EXECUTE_MASK) > 0) {
+            permissions.add(PosixFilePermission.OTHERS_EXECUTE);
+        }
+
+        return permissions;
+    }
+
+    public String getChmodDirectory() {
+        return chmodDirectory;
+    }
+
+    /**
+     * Specify the directory permissions used when the producer creates missing directories, the chmod value must be between 000 and 777;
+     * If there is a leading digit like in 0755 we will ignore it.
+     */
+    public void setChmodDirectory(String chmodDirectory) throws Exception {
+        if (ObjectHelper.isNotEmpty(chmodDirectory) && chmodPermissionsAreValid(chmodDirectory)) {
+            this.chmodDirectory = chmodDirectory.trim();
+        } else {
+            throw new IllegalArgumentException("chmodDirectory option [" + chmodDirectory + "] is not valid");
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/ca743cf7/camel-core/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java b/camel-core/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java
index da6f235..518d127 100644
--- a/camel-core/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java
+++ b/camel-core/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java
@@ -59,10 +59,6 @@ public abstract class GenericFileEndpoint<T> extends ScheduledPollEndpoint imple
     protected static final String DEFAULT_STRATEGYFACTORY_CLASS = "org.apache.camel.component.file.strategy.GenericFileProcessStrategyFactory";
     protected static final int DEFAULT_IDEMPOTENT_CACHE_SIZE = 1000;
     
-    private static final Integer CHMOD_WRITE_MASK = 02;
-    private static final Integer CHMOD_READ_MASK = 04;
-    private static final Integer CHMOD_EXECUTE_MASK = 01;
-
     protected final Logger log = LoggerFactory.getLogger(getClass());
 
     // common options
@@ -94,10 +90,6 @@ public abstract class GenericFileEndpoint<T> extends ScheduledPollEndpoint imple
     protected String doneFileName;
     @UriParam(label = "producer,advanced")
     protected boolean allowNullBody;
-    @UriParam(label = "producer,advanced")
-    protected String chmod;
-    @UriParam(label = "producer,advanced")
-    protected String chmodDirectory;
 
     // consumer options
 
@@ -184,8 +176,6 @@ public abstract class GenericFileEndpoint<T> extends ScheduledPollEndpoint imple
     protected GenericFileExclusiveReadLockStrategy<T> exclusiveReadLockStrategy;
     @UriParam(label = "consumer,advanced")
     protected ExceptionHandler onCompletionExceptionHandler;
-    @UriParam(label = "consumer,advanced")
-    protected String extendedAttributes;
 
     public GenericFileEndpoint() {
     }
@@ -315,145 +305,6 @@ public abstract class GenericFileEndpoint<T> extends ScheduledPollEndpoint imple
         }
     }
 
-    /**
-     * Chmod value must be between 000 and 777; If there is a leading digit like in 0755 we will ignore it.
-     */
-    public boolean chmodPermissionsAreValid(String chmod) {
-        if (chmod == null || chmod.length() < 3 || chmod.length() > 4) {
-            return false;
-        }
-        String permissionsString = chmod.trim().substring(chmod.length() - 3);  // if 4 digits chop off leading one
-        for (int i = 0; i < permissionsString.length(); i++) {
-            Character c = permissionsString.charAt(i);
-            if (!Character.isDigit(c) || Integer.parseInt(c.toString()) > 7) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    public Set<PosixFilePermission> getPermissions() {
-        Set<PosixFilePermission> permissions = new HashSet<PosixFilePermission>();
-        if (ObjectHelper.isEmpty(chmod)) {
-            return permissions;
-        }
-
-        String chmodString = chmod.substring(chmod.length() - 3);  // if 4 digits chop off leading one
-
-        Integer ownerValue = Integer.parseInt(chmodString.substring(0, 1));
-        Integer groupValue = Integer.parseInt(chmodString.substring(1, 2));
-        Integer othersValue = Integer.parseInt(chmodString.substring(2, 3));
-
-        if ((ownerValue & CHMOD_WRITE_MASK) > 0) {
-            permissions.add(PosixFilePermission.OWNER_WRITE);
-        }
-        if ((ownerValue & CHMOD_READ_MASK) > 0) {
-            permissions.add(PosixFilePermission.OWNER_READ);
-        }
-        if ((ownerValue & CHMOD_EXECUTE_MASK) > 0) {
-            permissions.add(PosixFilePermission.OWNER_EXECUTE);
-        }
-
-        if ((groupValue & CHMOD_WRITE_MASK) > 0) {
-            permissions.add(PosixFilePermission.GROUP_WRITE);
-        }
-        if ((groupValue & CHMOD_READ_MASK) > 0) {
-            permissions.add(PosixFilePermission.GROUP_READ);
-        }
-        if ((groupValue & CHMOD_EXECUTE_MASK) > 0) {
-            permissions.add(PosixFilePermission.GROUP_EXECUTE);
-        }
-
-        if ((othersValue & CHMOD_WRITE_MASK) > 0) {
-            permissions.add(PosixFilePermission.OTHERS_WRITE);
-        }
-        if ((othersValue & CHMOD_READ_MASK) > 0) {
-            permissions.add(PosixFilePermission.OTHERS_READ);
-        }
-        if ((othersValue & CHMOD_EXECUTE_MASK) > 0) {
-            permissions.add(PosixFilePermission.OTHERS_EXECUTE);
-        }
-
-        return permissions;
-    }
-
-    public String getChmod() {
-        return chmod;
-    }
-
-    /**
-     * Specify the file permissions which is sent by the producer, the chmod value must be between 000 and 777;
-     * If there is a leading digit like in 0755 we will ignore it.
-     */
-    public void setChmod(String chmod) throws Exception {
-        if (ObjectHelper.isNotEmpty(chmod) && chmodPermissionsAreValid(chmod)) {
-            this.chmod = chmod.trim();
-        } else {
-            throw new IllegalArgumentException("chmod option [" + chmod + "] is not valid");
-        }
-    }
-
-    public Set<PosixFilePermission> getDirectoryPermissions() {
-        Set<PosixFilePermission> permissions = new HashSet<PosixFilePermission>();
-        if (ObjectHelper.isEmpty(chmodDirectory)) {
-            return permissions;
-        }
-
-        String chmodString = chmodDirectory.substring(chmodDirectory.length() - 3);  // if 4 digits chop off leading one
-
-        Integer ownerValue = Integer.parseInt(chmodString.substring(0, 1));
-        Integer groupValue = Integer.parseInt(chmodString.substring(1, 2));
-        Integer othersValue = Integer.parseInt(chmodString.substring(2, 3));
-
-        if ((ownerValue & CHMOD_WRITE_MASK) > 0) {
-            permissions.add(PosixFilePermission.OWNER_WRITE);
-        }
-        if ((ownerValue & CHMOD_READ_MASK) > 0) {
-            permissions.add(PosixFilePermission.OWNER_READ);
-        }
-        if ((ownerValue & CHMOD_EXECUTE_MASK) > 0) {
-            permissions.add(PosixFilePermission.OWNER_EXECUTE);
-        }
-
-        if ((groupValue & CHMOD_WRITE_MASK) > 0) {
-            permissions.add(PosixFilePermission.GROUP_WRITE);
-        }
-        if ((groupValue & CHMOD_READ_MASK) > 0) {
-            permissions.add(PosixFilePermission.GROUP_READ);
-        }
-        if ((groupValue & CHMOD_EXECUTE_MASK) > 0) {
-            permissions.add(PosixFilePermission.GROUP_EXECUTE);
-        }
-
-        if ((othersValue & CHMOD_WRITE_MASK) > 0) {
-            permissions.add(PosixFilePermission.OTHERS_WRITE);
-        }
-        if ((othersValue & CHMOD_READ_MASK) > 0) {
-            permissions.add(PosixFilePermission.OTHERS_READ);
-        }
-        if ((othersValue & CHMOD_EXECUTE_MASK) > 0) {
-            permissions.add(PosixFilePermission.OTHERS_EXECUTE);
-        }
-
-        return permissions;
-    }
-
-    public String getChmodDirectory() {
-        return chmodDirectory;
-    }
-
-    /**
-     * Specify the directory permissions used when the producer creates missing directories, the chmod value must be between 000 and 777;
-     * If there is a leading digit like in 0755 we will ignore it.
-     */
-    public void setChmodDirectory(String chmodDirectory) throws Exception {
-        if (ObjectHelper.isNotEmpty(chmodDirectory) && chmodPermissionsAreValid(chmodDirectory)) {
-            this.chmodDirectory = chmodDirectory.trim();
-        } else {
-            throw new IllegalArgumentException("chmodDirectory option [" + chmodDirectory + "] is not valid");
-        }
-    }
-
     public boolean isNoop() {
         return noop;
     }
@@ -1253,18 +1104,6 @@ public abstract class GenericFileEndpoint<T> extends ScheduledPollEndpoint imple
         this.onCompletionExceptionHandler = onCompletionExceptionHandler;
     }
 
-    public String getExtendedAttributes() {
-        return extendedAttributes;
-    }
-
-    /**
-     * To define which file attributes of interest. Like posix:permissions,posix:owner,basic:lastAccessTime,
-     * it supports basic wildcard like posix:*, basic:lastAccessTime
-     */
-    public void setExtendedAttributes(String extendedAttributes) {
-        this.extendedAttributes = extendedAttributes;
-    }
-
     /**
      * Configures the given message with the file which sets the body to the
      * file object.


[2/3] camel git commit: CAMEL-9610: Add chmodDirectory to allow setting file permissions on directories created by file producer.

Posted by da...@apache.org.
CAMEL-9610: Add chmodDirectory to allow setting file permissions on directories created by file producer.


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

Branch: refs/heads/master
Commit: 9784d030100e74a909c2f5fa6d2801b3dfc2a57a
Parents: 5be46e4
Author: Claus Ibsen <da...@apache.org>
Authored: Thu Feb 18 18:42:43 2016 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Thu Feb 18 19:57:39 2016 +0100

----------------------------------------------------------------------
 .../camel/component/file/FileOperations.java    |  54 +++++++--
 .../component/file/GenericFileEndpoint.java     |  63 ++++++++++
 .../FileProducerDirectoryChmodOptionTest.java   | 117 +++++++++++++++++++
 3 files changed, 226 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/9784d030/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 412d81a..c44c141 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
@@ -89,13 +89,47 @@ public class FileOperations implements GenericFileOperations<File> {
         return file.exists();
     }
 
+    protected boolean buildDirectory(File dir, Set<PosixFilePermission> permissions) {
+        if (dir.exists()) {
+            return true;
+        }
+
+        if (permissions == null || permissions.isEmpty()) {
+            return dir.mkdirs();
+        }
+
+        // create directory one part of a time and set permissions
+        try {
+            String[] parts = dir.getPath().split("\\" + File.separatorChar);
+            File base = new File(".");
+            for (String part : parts) {
+                File subDir = new File(base, part);
+                if (!subDir.exists()) {
+                    if (subDir.mkdir()) {
+                        if (LOG.isTraceEnabled()) {
+                            LOG.trace("Setting chmod: {} on directory: {} ", PosixFilePermissions.toString(permissions), subDir);
+                        }
+                        Files.setPosixFilePermissions(subDir.toPath(), permissions);
+                    } else {
+                        return false;
+                    }
+                }
+                base = new File(base, subDir.getName());
+            }
+        } catch (IOException e) {
+            throw new GenericFileOperationFailedException("Error setting chmod on directory: " + dir, e);
+        }
+
+        return true;
+    }
+
     public boolean buildDirectory(String directory, boolean absolute) throws GenericFileOperationFailedException {
         ObjectHelper.notNull(endpoint, "endpoint");
 
         // always create endpoint defined directory
         if (endpoint.isAutoCreate() && !endpoint.getFile().exists()) {
             LOG.trace("Building starting directory: {}", endpoint.getFile());
-            endpoint.getFile().mkdirs();
+            buildDirectory(endpoint.getFile(), endpoint.getDirectoryPermissions());
         }
 
         if (ObjectHelper.isEmpty(directory)) {
@@ -131,10 +165,8 @@ public class FileOperations implements GenericFileOperations<File> {
                 // the directory already exists
                 return true;
             } else {
-                if (LOG.isTraceEnabled()) {
-                    LOG.trace("Building directory: {}", path);
-                }
-                return path.mkdirs();
+                LOG.trace("Building directory: {}", path);
+                return buildDirectory(path, endpoint.getDirectoryPermissions());
             }
         }
     }
@@ -246,8 +278,10 @@ public class FileOperations implements GenericFileOperations<File> {
                         if (ObjectHelper.isNotEmpty(endpoint.getChmod())) {
                             Set<PosixFilePermission> permissions = endpoint.getPermissions();
                             if (!permissions.isEmpty()) {
+                                if (LOG.isTraceEnabled()) {
+                                    LOG.trace("Setting chmod: {} on file: {} ", PosixFilePermissions.toString(permissions), file);
+                                }
                                 Files.setPosixFilePermissions(file.toPath(), permissions);
-                                LOG.trace("Setting chmod: {} on file: {} ", PosixFilePermissions.toString(permissions), file);
                             }
                         }
                         // clear header as we have renamed the file
@@ -265,8 +299,10 @@ public class FileOperations implements GenericFileOperations<File> {
                     if (ObjectHelper.isNotEmpty(endpoint.getChmod())) {
                         Set<PosixFilePermission> permissions = endpoint.getPermissions();
                         if (!permissions.isEmpty()) {
+                            if (LOG.isTraceEnabled()) {
+                                LOG.trace("Setting chmod: {} on file: {} ", PosixFilePermissions.toString(permissions), file);
+                            }
                             Files.setPosixFilePermissions(file.toPath(), permissions);
-                            LOG.trace("Setting chmod: {} on file: {} ", PosixFilePermissions.toString(permissions), file);
                         }
                     }
                     return true;
@@ -296,8 +332,10 @@ public class FileOperations implements GenericFileOperations<File> {
             if (ObjectHelper.isNotEmpty(endpoint.getChmod())) {
                 Set<PosixFilePermission> permissions = endpoint.getPermissions();
                 if (!permissions.isEmpty()) {
+                    if (LOG.isTraceEnabled()) {
+                        LOG.trace("Setting chmod: {} on file: {} ", PosixFilePermissions.toString(permissions), file);
+                    }
                     Files.setPosixFilePermissions(file.toPath(), permissions);
-                    LOG.trace("Setting chmod: {} on file: {} ", PosixFilePermissions.toString(permissions), file);
                 }
             }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/9784d030/camel-core/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java b/camel-core/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java
index 0e20247..da6f235 100644
--- a/camel-core/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java
+++ b/camel-core/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java
@@ -96,6 +96,8 @@ public abstract class GenericFileEndpoint<T> extends ScheduledPollEndpoint imple
     protected boolean allowNullBody;
     @UriParam(label = "producer,advanced")
     protected String chmod;
+    @UriParam(label = "producer,advanced")
+    protected String chmodDirectory;
 
     // consumer options
 
@@ -391,6 +393,67 @@ public abstract class GenericFileEndpoint<T> extends ScheduledPollEndpoint imple
         }
     }
 
+    public Set<PosixFilePermission> getDirectoryPermissions() {
+        Set<PosixFilePermission> permissions = new HashSet<PosixFilePermission>();
+        if (ObjectHelper.isEmpty(chmodDirectory)) {
+            return permissions;
+        }
+
+        String chmodString = chmodDirectory.substring(chmodDirectory.length() - 3);  // if 4 digits chop off leading one
+
+        Integer ownerValue = Integer.parseInt(chmodString.substring(0, 1));
+        Integer groupValue = Integer.parseInt(chmodString.substring(1, 2));
+        Integer othersValue = Integer.parseInt(chmodString.substring(2, 3));
+
+        if ((ownerValue & CHMOD_WRITE_MASK) > 0) {
+            permissions.add(PosixFilePermission.OWNER_WRITE);
+        }
+        if ((ownerValue & CHMOD_READ_MASK) > 0) {
+            permissions.add(PosixFilePermission.OWNER_READ);
+        }
+        if ((ownerValue & CHMOD_EXECUTE_MASK) > 0) {
+            permissions.add(PosixFilePermission.OWNER_EXECUTE);
+        }
+
+        if ((groupValue & CHMOD_WRITE_MASK) > 0) {
+            permissions.add(PosixFilePermission.GROUP_WRITE);
+        }
+        if ((groupValue & CHMOD_READ_MASK) > 0) {
+            permissions.add(PosixFilePermission.GROUP_READ);
+        }
+        if ((groupValue & CHMOD_EXECUTE_MASK) > 0) {
+            permissions.add(PosixFilePermission.GROUP_EXECUTE);
+        }
+
+        if ((othersValue & CHMOD_WRITE_MASK) > 0) {
+            permissions.add(PosixFilePermission.OTHERS_WRITE);
+        }
+        if ((othersValue & CHMOD_READ_MASK) > 0) {
+            permissions.add(PosixFilePermission.OTHERS_READ);
+        }
+        if ((othersValue & CHMOD_EXECUTE_MASK) > 0) {
+            permissions.add(PosixFilePermission.OTHERS_EXECUTE);
+        }
+
+        return permissions;
+    }
+
+    public String getChmodDirectory() {
+        return chmodDirectory;
+    }
+
+    /**
+     * Specify the directory permissions used when the producer creates missing directories, the chmod value must be between 000 and 777;
+     * If there is a leading digit like in 0755 we will ignore it.
+     */
+    public void setChmodDirectory(String chmodDirectory) throws Exception {
+        if (ObjectHelper.isNotEmpty(chmodDirectory) && chmodPermissionsAreValid(chmodDirectory)) {
+            this.chmodDirectory = chmodDirectory.trim();
+        } else {
+            throw new IllegalArgumentException("chmodDirectory option [" + chmodDirectory + "] is not valid");
+        }
+    }
+
     public boolean isNoop() {
         return noop;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/9784d030/camel-core/src/test/java/org/apache/camel/component/file/FileProducerDirectoryChmodOptionTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/component/file/FileProducerDirectoryChmodOptionTest.java b/camel-core/src/test/java/org/apache/camel/component/file/FileProducerDirectoryChmodOptionTest.java
new file mode 100644
index 0000000..932b767
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/component/file/FileProducerDirectoryChmodOptionTest.java
@@ -0,0 +1,117 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.file;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.LinkOption;
+import java.nio.file.attribute.PosixFilePermission;
+import java.nio.file.attribute.PosixFilePermissions;
+import java.util.Date;
+import java.util.Set;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+
+public class FileProducerDirectoryChmodOptionTest extends ContextTestSupport {
+    public static final String TEST_DIRECTORY = "target/chmoddir/foo/";
+
+    @Override
+    protected void setUp() throws Exception {
+        deleteDirectory(TEST_DIRECTORY);
+        super.setUp();
+    }
+
+    private boolean canTest() {
+        // can not run on windows
+        return !isPlatform("windows");
+    }
+
+    public void testWriteValidNoDir() throws Exception {
+        if (!canTest()) {
+            return;
+        }
+
+        runChmodCheck("NoDir", null, "rwxr-xr-x");
+    }
+
+    public void testWriteValidChmod0755() throws Exception {
+        if (!canTest()) {
+            return;
+        }
+
+        runChmodCheck("0755", "rwxrwxrwx", "rwxr-xr-x");
+    }
+
+    public void testWriteValidChmod666() throws Exception {
+        if (!canTest()) {
+            return;
+        }
+
+        runChmodCheck("666", "rwxrwxrwx", "rw-rw-rw-");
+    }
+
+    private void runChmodCheck(String routeSuffix, String expectedDirectoryPermissions, String expectedPermissions) throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:chmod" + routeSuffix);
+        mock.expectedMessageCount(1);
+        String testFileName = "chmod" + routeSuffix + ".txt";
+        String fullTestFileName = TEST_DIRECTORY + testFileName;
+        String testFileContent = "Writing file with chmod " + routeSuffix + " option at " + new Date();
+        mock.expectedFileExists(fullTestFileName, testFileContent);
+
+        template.sendBodyAndHeader("direct:write" + routeSuffix, testFileContent, Exchange.FILE_NAME, testFileName);
+
+        if (expectedDirectoryPermissions != null) {
+            File d = new File(TEST_DIRECTORY);
+            Set<PosixFilePermission> permissions = Files.getPosixFilePermissions(d.toPath(), LinkOption.NOFOLLOW_LINKS);
+            assertEquals(expectedDirectoryPermissions, PosixFilePermissions.toString(permissions));
+            assertEquals(expectedDirectoryPermissions.replace("-", "").length(), permissions.size());
+        }
+
+        if (expectedPermissions != null) {
+            File f = new File(fullTestFileName);
+            Set<PosixFilePermission> permissions = Files.getPosixFilePermissions(f.toPath(), LinkOption.NOFOLLOW_LINKS);
+            assertEquals(expectedPermissions, PosixFilePermissions.toString(permissions));
+            assertEquals(expectedPermissions.replace("-", "").length(), permissions.size());
+        }
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                // Valid chmod values
+                from("direct:write666")
+                        .to("file://" + TEST_DIRECTORY + "?chmodDirectory=777&chmod=666")
+                        .to("mock:chmod666");
+
+                from("direct:write0755")
+                        .to("file://" + TEST_DIRECTORY + "?chmodDirectory=777&chmod=0755")
+                        .to("mock:chmod0755");
+
+                from("direct:writeNoDir")
+                        .to("file://" + TEST_DIRECTORY + "?chmod=0755")
+                        .to("mock:chmodNoDir");
+
+            }
+        };
+    }
+}


[3/3] camel git commit: Maven name consistent with other components

Posted by da...@apache.org.
Maven name consistent with other components


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

Branch: refs/heads/master
Commit: 5be46e4e90df1b38723a3ab08f684265bdd6307e
Parents: 95b60ce
Author: Antonin Stefanutti <an...@stefanutti.fr>
Authored: Thu Feb 18 17:55:19 2016 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Thu Feb 18 19:57:39 2016 +0100

----------------------------------------------------------------------
 components/camel-cdi/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/5be46e4e/components/camel-cdi/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-cdi/pom.xml b/components/camel-cdi/pom.xml
index 61296f1..f2c5f47 100644
--- a/components/camel-cdi/pom.xml
+++ b/components/camel-cdi/pom.xml
@@ -26,7 +26,7 @@
 
   <artifactId>camel-cdi</artifactId>
   <packaging>bundle</packaging>
-  <name>Camel :: CDI Component</name>
+  <name>Camel :: CDI</name>
   <description>Camel Contexts and Dependency Injection Support</description>
 
   <properties>