From ce19353f1297c5d3dc59be21a1ead89c0a44907a Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Sun, 15 Sep 2013 15:12:29 +0200 Subject: [PATCH] CAMEL-6748: Optimize File Producers by Skipping Header Evaluation. Thansk to James Carman for the patch. --- .../component/file/GenericFileProducer.java | 37 +++++++---- .../file/FileConsumerFileExpressionTest.java | 4 +- ...roducerConsumedFileNameEvaluationTest.java | 62 ------------------- .../file/FileProducerExpressionTest.java | 12 ++-- .../file/remote/FtpServerTestSupport.java | 4 +- 5 files changed, 36 insertions(+), 83 deletions(-) delete mode 100644 camel-core/src/test/java/org/apache/camel/component/file/FileProducerConsumedFileNameEvaluationTest.java diff --git a/camel-core/src/main/java/org/apache/camel/component/file/GenericFileProducer.java b/camel-core/src/main/java/org/apache/camel/component/file/GenericFileProducer.java index ed8bf74a7ed9f..7c574099cbf64 100644 --- a/camel-core/src/main/java/org/apache/camel/component/file/GenericFileProducer.java +++ b/camel-core/src/main/java/org/apache/camel/component/file/GenericFileProducer.java @@ -286,30 +286,41 @@ public String createFileName(Exchange exchange) { String answer; // overrule takes precedence - String overrule = exchange.getIn().getHeader(Exchange.OVERRULE_FILE_NAME, String.class); - String consumed = exchange.getIn().getHeader(Exchange.FILE_NAME_CONSUMED, String.class); - String name = overrule == null ? exchange.getIn().getHeader(Exchange.FILE_NAME, String.class) : overrule; + Object value; + + Object overrule = exchange.getIn().getHeader(Exchange.OVERRULE_FILE_NAME); + if (overrule != null) { + if (overrule instanceof Expression) { + value = overrule; + } else { + value = exchange.getContext().getTypeConverter().convertTo(String.class, exchange, overrule); + } + } else { + value = exchange.getIn().getHeader(Exchange.FILE_NAME); + } // if we have an overrule then override the existing header to use the overrule computed name from this point forward if (overrule != null) { - exchange.getIn().setHeader(Exchange.FILE_NAME, name); + exchange.getIn().setHeader(Exchange.FILE_NAME, value); + } + + if (value != null && value instanceof String && StringHelper.hasStartToken((String) value, "simple")) { + log.warn("Simple expression: {} detected in header: {} of type String. This feature has been removed (see CAMEL-6748).", value, Exchange.FILE_NAME); } // expression support Expression expression = endpoint.getFileName(); - - if (name != null && !name.equals(consumed)) { - // the header name can be an expression too, that should override - // whatever configured on the endpoint - if (StringHelper.hasStartToken(name, "simple")) { - log.trace("{} contains a Simple expression: {}", Exchange.FILE_NAME, name); - Language language = getEndpoint().getCamelContext().resolveLanguage("file"); - expression = language.createExpression(name); - } + if (value != null && value instanceof Expression) { + expression = (Expression) value; } + + // evaluate the name as a String from the value + String name; if (expression != null) { log.trace("Filename evaluated as expression: {}", expression); name = expression.evaluate(exchange, String.class); + } else { + name = exchange.getContext().getTypeConverter().convertTo(String.class, exchange, value); } // flatten name diff --git a/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileExpressionTest.java b/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileExpressionTest.java index c6a83d2d6a366..0ddc4121344a1 100644 --- a/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileExpressionTest.java +++ b/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileExpressionTest.java @@ -22,6 +22,8 @@ import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.impl.JndiRegistry; +import static org.apache.camel.language.simple.SimpleLanguage.simple; + /** * Unit test for expression option for file consumer. */ @@ -70,7 +72,7 @@ public void configure() throws Exception { public void testConsumeFileBasedOnDatePattern() throws Exception { template.sendBodyAndHeader("file://target/filelanguage/date", "Bye World", Exchange.FILE_NAME, "myfile-20081128.txt"); template.sendBodyAndHeader("file://target/filelanguage/date", "Hello World", Exchange.FILE_NAME, "myfile-20081129.txt"); - template.sendBodyAndHeader("file://target/filelanguage/date", "Goodday World", Exchange.FILE_NAME, "myfile-${date:now:yyyyMMdd}.txt"); + template.sendBodyAndHeader("file://target/filelanguage/date", "Goodday World", Exchange.FILE_NAME, simple("myfile-${date:now:yyyyMMdd}.txt")); context.addRoutes(new RouteBuilder() { @Override diff --git a/camel-core/src/test/java/org/apache/camel/component/file/FileProducerConsumedFileNameEvaluationTest.java b/camel-core/src/test/java/org/apache/camel/component/file/FileProducerConsumedFileNameEvaluationTest.java deleted file mode 100644 index 64da59d0054a7..0000000000000 --- a/camel-core/src/test/java/org/apache/camel/component/file/FileProducerConsumedFileNameEvaluationTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/** - * 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.text.SimpleDateFormat; -import java.util.Date; -import java.util.Map; -import java.util.TreeMap; - -import org.apache.camel.ContextTestSupport; -import org.apache.camel.Exchange; - -/** - * @version - */ -public class FileProducerConsumedFileNameEvaluationTest extends ContextTestSupport { - - @Override - protected void setUp() throws Exception { - deleteDirectory("target/producerconsumedfilename"); - super.setUp(); - } - - public void testFileNameNotEvaluatedWhenMatchingConsumed() throws Exception { - Map headers = new TreeMap(); - headers.put(Exchange.FILE_NAME, "file-${date:now:yyyyMMdd}"); - headers.put(Exchange.FILE_NAME_CONSUMED, "file-${date:now:yyyyMMdd}"); - template.sendBodyAndHeaders("file://target/producerconsumedfilename", "Hello World", headers); - assertFileExists("target/producerconsumedfilename/file-${date:now:yyyyMMdd}"); - } - - public void testFileNameEvaluatedWhenNotMatchingConsumed() throws Exception { - Map headers = new TreeMap(); - headers.put(Exchange.FILE_NAME, "file-${date:now:yyyyMMdd}.txt"); - headers.put(Exchange.FILE_NAME_CONSUMED, "file-consumed"); - template.sendBodyAndHeaders("file://target/producerconsumedfilename", "Hello World", headers); - String date = new SimpleDateFormat("yyyyMMdd").format(new Date()); - assertFileExists("target/producerconsumedfilename/file-" + date + ".txt"); - } - - public void testFileNameEvaluatedWhenConsumedNull() throws Exception { - Map headers = new TreeMap(); - headers.put(Exchange.FILE_NAME, "file-${date:now:yyyyMMdd}.txt"); - template.sendBodyAndHeaders("file://target/producerconsumedfilename", "Hello World", headers); - String date = new SimpleDateFormat("yyyyMMdd").format(new Date()); - assertFileExists("target/producerconsumedfilename/file-" + date + ".txt"); - } -} diff --git a/camel-core/src/test/java/org/apache/camel/component/file/FileProducerExpressionTest.java b/camel-core/src/test/java/org/apache/camel/component/file/FileProducerExpressionTest.java index 684818988e079..208e01fea0ae0 100644 --- a/camel-core/src/test/java/org/apache/camel/component/file/FileProducerExpressionTest.java +++ b/camel-core/src/test/java/org/apache/camel/component/file/FileProducerExpressionTest.java @@ -25,6 +25,8 @@ import org.apache.camel.Exchange; import org.apache.camel.impl.JndiRegistry; +import static org.apache.camel.language.simple.SimpleLanguage.simple; + /** * Unit test for expression option for file producer. */ @@ -43,11 +45,9 @@ protected JndiRegistry createRegistry() throws Exception { return jndi; } - public void testProduceBeanByHeader() throws Exception { - template.sendBodyAndHeader("file://target/filelanguage", "Hello World", - Exchange.FILE_NAME, "${bean:myguidgenerator}.bak"); - - assertFileExists("target/filelanguage/123.bak"); + public void testProducerFileNameHeaderNotEvaluated() { + template.sendBodyAndHeader("file://target/filelanguage", "Hello World", Exchange.FILE_NAME, "$simple{myfile-${date:now:yyyyMMdd}}.txt"); + assertFileExists("target/filelanguage/$simple{myfile-${date:now:yyyyMMdd}}.txt"); } public void testProduceBeanByExpression() throws Exception { @@ -58,7 +58,7 @@ public void testProduceBeanByExpression() throws Exception { public void testProducerDateByHeader() throws Exception { template.sendBodyAndHeader("file://target/filelanguage", "Hello World", - Exchange.FILE_NAME, "myfile-${date:now:yyyyMMdd}.txt"); + Exchange.FILE_NAME, simple("myfile-${date:now:yyyyMMdd}.txt")); String date = new SimpleDateFormat("yyyyMMdd").format(new Date()); assertFileExists("target/filelanguage/myfile-" + date + ".txt"); diff --git a/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpServerTestSupport.java b/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpServerTestSupport.java index 7df7a9296b1e1..308c0416d692a 100644 --- a/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpServerTestSupport.java +++ b/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpServerTestSupport.java @@ -32,6 +32,8 @@ import org.junit.After; import org.junit.Before; +import static org.apache.camel.language.simple.SimpleLanguage.simple; + /** * Base class for unit testing using a FTPServer */ @@ -125,7 +127,7 @@ protected FtpServerFactory createFtpServerFactory() throws Exception { } public void sendFile(String url, Object body, String fileName) { - template.sendBodyAndHeader(url, body, Exchange.FILE_NAME, fileName); + template.sendBodyAndHeader(url, body, Exchange.FILE_NAME, simple(fileName)); } }