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/01/25 13:59:15 UTC
[1/2] camel git commit: CAMEL-7865 - Create HashSet only if
ExtendedAttributes have been defined
Repository: camel
Updated Branches:
refs/heads/master 712b33524 -> fa4cdd2ac
CAMEL-7865 - Create HashSet only if ExtendedAttributes have been defined
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/fa4cdd2a
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/fa4cdd2a
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/fa4cdd2a
Branch: refs/heads/master
Commit: fa4cdd2ac7f0ab0507b680fd14822a343933057c
Parents: 64577e5
Author: lburgazzoli <lb...@gmail.com>
Authored: Mon Jan 25 12:07:08 2016 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Mon Jan 25 13:55:17 2016 +0100
----------------------------------------------------------------------
.../main/java/org/apache/camel/component/file/FileConsumer.java | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/fa4cdd2a/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 f26d5a1..16c5cd2 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
@@ -42,9 +42,10 @@ public class FileConsumer extends GenericFileConsumer<File> {
public FileConsumer(GenericFileEndpoint<File> endpoint, Processor processor, GenericFileOperations<File> operations) {
super(endpoint, processor, operations);
this.endpointPath = endpoint.getConfiguration().getDirectory();
- this.extendedAttributes = new HashSet<>();
if (endpoint.getExtendedAttributes() != null) {
+ this.extendedAttributes = new HashSet<>();
+
for (String attribute : endpoint.getExtendedAttributes().split(",")) {
extendedAttributes.add(attribute);
}
@@ -111,7 +112,7 @@ public class FileConsumer extends GenericFileConsumer<File> {
if (depth >= endpoint.minDepth && isValidFile(gf, false, files)) {
log.trace("Adding valid file: {}", file);
// matched file so add
- if (!extendedAttributes.isEmpty()) {
+ if (extendedAttributes != null) {
Path path = file.toPath();
Map<String, Object> allAttributes = new HashMap<>();
for (String attribute : extendedAttributes) {
[2/2] camel git commit: CAMEL-7865 - Support to carry file attributes
on file endpoint
Posted by da...@apache.org.
CAMEL-7865 - Support to carry file attributes on file endpoint
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/64577e59
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/64577e59
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/64577e59
Branch: refs/heads/master
Commit: 64577e5931bcac7d286d4c4a1389aed7ff9a16e7
Parents: 712b335
Author: lburgazzoli <lb...@gmail.com>
Authored: Mon Jan 18 15:43:51 2016 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Mon Jan 25 13:55:17 2016 +0100
----------------------------------------------------------------------
.../camel/component/file/FileConsumer.java | 51 +++++++++-
.../camel/component/file/GenericFile.java | 13 +++
.../component/file/GenericFileEndpoint.java | 15 ++-
.../FileConsumerExtendedAttributesTest.java | 101 +++++++++++++++++++
4 files changed, 178 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/64577e59/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 11aaf05..f26d5a1 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
@@ -17,8 +17,15 @@
package org.apache.camel.component.file;
import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
+import java.util.Map;
+import java.util.Set;
import org.apache.camel.Processor;
import org.apache.camel.util.FileUtil;
@@ -30,10 +37,18 @@ import org.apache.camel.util.ObjectHelper;
public class FileConsumer extends GenericFileConsumer<File> {
private String endpointPath;
+ private Set<String> extendedAttributes;
public FileConsumer(GenericFileEndpoint<File> endpoint, Processor processor, GenericFileOperations<File> operations) {
super(endpoint, processor, operations);
this.endpointPath = endpoint.getConfiguration().getDirectory();
+ this.extendedAttributes = new HashSet<>();
+
+ if (endpoint.getExtendedAttributes() != null) {
+ for (String attribute : endpoint.getExtendedAttributes().split(",")) {
+ extendedAttributes.add(attribute);
+ }
+ }
}
@Override
@@ -67,7 +82,7 @@ public class FileConsumer extends GenericFileConsumer<File> {
}
List<File> files = Arrays.asList(dirFiles);
- for (File file : files) {
+ for (File file : dirFiles) {
// check if we can continue polling in files
if (!canPollMoreFiles(fileList)) {
return false;
@@ -96,6 +111,40 @@ public class FileConsumer extends GenericFileConsumer<File> {
if (depth >= endpoint.minDepth && isValidFile(gf, false, files)) {
log.trace("Adding valid file: {}", file);
// matched file so add
+ if (!extendedAttributes.isEmpty()) {
+ Path path = file.toPath();
+ Map<String, Object> allAttributes = new HashMap<>();
+ for (String attribute : extendedAttributes) {
+ try {
+ String prefix = null;
+ if (attribute.endsWith(":*")) {
+ prefix = attribute.substring(0, attribute.length() - 1);
+ } else if (attribute.equals("*")) {
+ prefix = "basic:";
+ }
+
+ if (ObjectHelper.isNotEmpty(prefix)) {
+ Map<String, Object> attributes = Files.readAttributes(path, attribute);
+ if (attributes != null) {
+ for (Map.Entry<String, Object> entry : attributes.entrySet()) {
+ allAttributes.put(prefix + entry.getKey(), entry.getValue());
+ }
+ }
+ } else if (!attribute.contains(":")) {
+ allAttributes.put("basic:" + attribute, Files.getAttribute(path, attribute));
+ } else {
+ allAttributes.put(attribute, Files.getAttribute(path, attribute));
+ }
+ } catch (IOException e) {
+ if (log.isDebugEnabled()) {
+ log.debug("Unable to read attribute {} on file {}", attribute, file, e);
+ }
+ }
+ }
+
+ gf.setExtendedAttributes(allAttributes);
+ }
+
fileList.add(gf);
}
http://git-wip-us.apache.org/repos/asf/camel/blob/64577e59/camel-core/src/main/java/org/apache/camel/component/file/GenericFile.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/file/GenericFile.java b/camel-core/src/main/java/org/apache/camel/component/file/GenericFile.java
index 9c8bc46..2e3fee3 100644
--- a/camel-core/src/main/java/org/apache/camel/component/file/GenericFile.java
+++ b/camel-core/src/main/java/org/apache/camel/component/file/GenericFile.java
@@ -50,6 +50,7 @@ public class GenericFile<T> implements WrappedFile<T> {
private boolean absolute;
private boolean directory;
private String charset;
+ private Map<String, Object> extendedAttributes;
public GenericFile() {
this(false);
@@ -146,6 +147,10 @@ public class GenericFile<T> implements WrappedFile<T> {
message.setHeader("CamelFileAbsolute", isAbsolute());
message.setHeader("CamelFileAbsolutePath", getAbsoluteFilePath());
+ if (extendedAttributes != null) {
+ message.setHeader("CamelFileExtendedAttributes", extendedAttributes);
+ }
+
if (probeContentType && file instanceof File) {
File f = (File) file;
Path path = f.toPath();
@@ -290,6 +295,14 @@ public class GenericFile<T> implements WrappedFile<T> {
this.charset = charset;
}
+ public Map<String, Object> getExtendedAttributes() {
+ return extendedAttributes;
+ }
+
+ public void setExtendedAttributes(Map<String, Object> extendedAttributes) {
+ this.extendedAttributes = extendedAttributes;
+ }
+
@Override
public T getFile() {
return file;
http://git-wip-us.apache.org/repos/asf/camel/blob/64577e59/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 52d2af1..0e20247 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
@@ -42,7 +42,6 @@ import org.apache.camel.spi.ExceptionHandler;
import org.apache.camel.spi.FactoryFinder;
import org.apache.camel.spi.IdempotentRepository;
import org.apache.camel.spi.Language;
-import org.apache.camel.spi.Metadata;
import org.apache.camel.spi.UriParam;
import org.apache.camel.util.FileUtil;
import org.apache.camel.util.IOHelper;
@@ -183,6 +182,8 @@ 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() {
}
@@ -1189,6 +1190,18 @@ 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.
http://git-wip-us.apache.org/repos/asf/camel/blob/64577e59/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerExtendedAttributesTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerExtendedAttributesTest.java b/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerExtendedAttributesTest.java
new file mode 100644
index 0000000..d505d9a
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerExtendedAttributesTest.java
@@ -0,0 +1,101 @@
+/**
+ * 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.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Map;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.Test;
+
+/**
+ * Unit test for consuming a batch of files (multiple files in one consume)
+ */
+public class FileConsumerExtendedAttributesTest extends ContextTestSupport {
+ private static final String ROOT = "target/extended-attributes";
+ private static final String FILE = "attributes.txt";
+
+ @Override
+ protected void setUp() throws Exception {
+ deleteDirectory(ROOT);
+
+ super.setUp();
+
+ Files.createFile(Paths.get(ROOT, "basic", FILE));
+ Files.createFile(Paths.get(ROOT, "basic-as-default", FILE));
+ Files.createFile(Paths.get(ROOT, "basic-as-default-with-filter", FILE));
+ Files.createFile(Paths.get(ROOT, "posix", FILE));
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ public void configure() throws Exception {
+ fromF("file://%s/basic?extendedAttributes=basic:*", ROOT)
+ .convertBodyTo(String.class)
+ .to("mock:basic");
+ fromF("file://%s/basic-as-default?extendedAttributes=*", ROOT)
+ .convertBodyTo(String.class)
+ .to("mock:basic-as-default");
+ fromF("file://%s/basic-as-default-with-filter?extendedAttributes=size,lastModifiedTime,lastAccessTime", ROOT)
+ .convertBodyTo(String.class)
+ .to("mock:basic-as-default-with-filter");
+ fromF("file://%s/posix?extendedAttributes=posix:*", ROOT)
+ .convertBodyTo(String.class)
+ .to("mock:posix");
+ }
+ };
+ }
+
+ @Test
+ public void testBasicAttributes() throws Exception {
+ testAttributes("mock:basic", "basic:");
+ }
+
+ @Test
+ public void testBasicAttributesAsDefault() throws Exception {
+ testAttributes("mock:basic-as-default", "basic:");
+ }
+
+ @Test
+ public void testBasicAttributesAsDefaultWithFilter() throws Exception {
+ testAttributes("mock:basic-as-default", "basic:");
+ }
+
+ @Test
+ public void testPosixAttributes() throws Exception {
+ testAttributes("mock:posix", "posix:");
+ }
+
+ private void testAttributes(String mockEndpoint, String prefix) throws Exception {
+ MockEndpoint mock = getMockEndpoint(mockEndpoint);
+ mock.expectedMessageCount(1);
+ mock.message(0).header("CamelFileExtendedAttributes").isNotNull();
+ mock.message(0).header("CamelFileExtendedAttributes").convertTo(Map.class);
+ assertMockEndpointsSatisfied();
+
+ Map<String, Object> attributes = mock.getExchanges().get(0).getIn().getHeader("CamelFileExtendedAttributes", Map.class);
+ assertNotNull(attributes);
+ assertFalse(attributes.isEmpty());
+ for (Map.Entry<String, Object> entry : attributes.entrySet()) {
+ assertTrue(entry.getKey().startsWith(prefix));
+ }
+ }
+}
\ No newline at end of file