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 2022/08/16 09:44:08 UTC

[camel] 02/02: CAMEL-18387: Fix bug in TarAggregationStrategy when first file is empty (#8166)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch camel-3.14.x
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 6efd8de3a405c0a1ad95fe98a7adc841ebecb726
Author: chbecker2 <11...@users.noreply.github.com>
AuthorDate: Tue Aug 16 11:41:48 2022 +0200

    CAMEL-18387: Fix bug in TarAggregationStrategy when first file is empty (#8166)
---
 .../aggregate/tarfile/TarAggregationStrategy.java  |   9 +-
 .../TarAggregationStrategyEmptyFirstFileTest.java  | 140 +++++++++++++++++++++
 2 files changed, 143 insertions(+), 6 deletions(-)

diff --git a/components/camel-tarfile/src/main/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategy.java b/components/camel-tarfile/src/main/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategy.java
index 78c05bde6d8..82b97315aef 100644
--- a/components/camel-tarfile/src/main/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategy.java
+++ b/components/camel-tarfile/src/main/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategy.java
@@ -172,9 +172,6 @@ public class TarAggregationStrategy implements AggregationStrategy {
                             ? newExchange.getIn().getHeader(Exchange.FILE_NAME, String.class)
                             : newExchange.getIn().getMessageId();
                     addFileToTar(tarFile, appendFile, this.preserveFolderStructure ? entryName : null);
-                    GenericFile<File> genericFile = FileConsumer.asGenericFile(
-                            tarFile.getParent(), tarFile, Charset.defaultCharset().toString(), false);
-                    genericFile.bindToExchange(answer);
                 }
             } catch (Exception e) {
                 throw new GenericFileOperationFailedException(e.getMessage(), e);
@@ -189,14 +186,14 @@ public class TarAggregationStrategy implements AggregationStrategy {
                             ? newExchange.getIn().getHeader(Exchange.FILE_NAME, String.class)
                             : newExchange.getIn().getMessageId();
                     addEntryToTar(tarFile, entryName, buffer, buffer.length);
-                    GenericFile<File> genericFile = FileConsumer.asGenericFile(
-                            tarFile.getParent(), tarFile, Charset.defaultCharset().toString(), false);
-                    genericFile.bindToExchange(answer);
                 }
             } catch (Exception e) {
                 throw new GenericFileOperationFailedException(e.getMessage(), e);
             }
         }
+        GenericFile<File> genericFile = FileConsumer.asGenericFile(
+                tarFile.getParent(), tarFile, Charset.defaultCharset().toString(), false);
+        genericFile.bindToExchange(answer);
         return answer;
     }
 
diff --git a/components/camel-tarfile/src/test/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategyEmptyFirstFileTest.java b/components/camel-tarfile/src/test/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategyEmptyFirstFileTest.java
new file mode 100644
index 00000000000..a681b05f42c
--- /dev/null
+++ b/components/camel-tarfile/src/test/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategyEmptyFirstFileTest.java
@@ -0,0 +1,140 @@
+/*
+ * 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.processor.aggregate.tarfile;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.TreeMap;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.apache.camel.test.junit5.TestSupport;
+import org.apache.camel.util.IOHelper;
+import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
+import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
+import org.apache.logging.log4j.core.util.IOUtils;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class TarAggregationStrategyEmptyFirstFileTest extends CamelTestSupport {
+
+    @Override
+    @BeforeEach
+    public void setUp() throws Exception {
+        TestSupport.deleteDirectory("target/out");
+        super.setUp();
+    }
+
+    @Test
+    public void testNormal() throws Exception {
+        doTest("A", "B", "C");
+    }
+
+    @Test
+    public void testEmptyFirst() throws Exception {
+        doTest("", "A");
+    }
+
+    @Test
+    public void testEmptyOnly() throws Exception {
+        doTest("");
+    }
+
+    @Test
+    public void testEmptyMiddle() throws Exception {
+        doTest("Start", "", "", "End");
+    }
+
+    public void doTest(String... messages) throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:aggregateToTarEntry");
+        mock.expectedMessageCount(1);
+
+        StringBuilder input = new StringBuilder();
+        int nonEmptyFile = 0;
+        for (String m : messages) {
+            input.append("#").append(m);
+            if (!m.isEmpty()) {
+                nonEmptyFile++;
+            }
+        }
+        if (input.toString().endsWith("#")) {
+            input.append("#");
+        }
+
+        template.sendBody("direct:start", input.toString());
+
+        assertMockEndpointsSatisfied();
+
+        File[] files = new File("target/out").listFiles();
+        if (files != null) {
+            assertEquals(1, files.length, "Should only be one file in target/out directory");
+            Map<String, String> tar = readTar(files[0]);
+            assertEquals(nonEmptyFile, tar.size(), "Tar file " + tar + " should contain " + nonEmptyFile + " files");
+            Iterator<Entry<String, String>> i = tar.entrySet().iterator();
+            for (int n = 0; n < messages.length; n++) {
+                if (!messages[n].isEmpty()) {
+                    Map.Entry<String, String> entry = i.next();
+                    assertEquals(Integer.toString(n), entry.getKey(), "Tar file should contain entry named " + n);
+                    assertEquals(messages[n], entry.getValue(), "Tar entry " + n + " content is wrong");
+                }
+            }
+        }
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                // @formatter:off
+                from("direct:start")
+                    .split(body().tokenize("#"), new TarAggregationStrategy(false, true))
+                    .setHeader(Exchange.FILE_NAME, simple("${exchangeProperty.CamelSplitIndex}"))
+                .end()
+                .to("file:target/out")
+                .to("mock:aggregateToTarEntry");
+                // @formatter:on
+            }
+        };
+    }
+
+    private static Map<String, String> readTar(File file) throws FileNotFoundException, IOException {
+        Map<String, String> content = new TreeMap<>();
+        TarArchiveInputStream tin = new TarArchiveInputStream(new FileInputStream(file));
+        try {
+            for (TarArchiveEntry te = (TarArchiveEntry) tin.getNextEntry();
+                 te != null;
+                 te = (TarArchiveEntry) tin.getNextEntry()) {
+                String c = IOUtils.toString(new InputStreamReader(tin));
+                content.put(te.getName(), c);
+            }
+        } finally {
+            IOHelper.close(tin);
+        }
+        return content;
+    }
+}