Author: ningjiang
Date: Mon Aug 13 04:27:07 2012
New Revision: 1372259

URL: http://svn.apache.org/viewvc?rev=1372259&view=rev
Log:
CAMEL-5407 Better error message when trying to write a null body as file

Added:
    
camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileProducerAllowNullBodyFileAlreadyExistsTest.java
    
camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileProducerAllowNullBodyTest.java
Modified:
    
camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileOperations.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileOperations.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileOperations.java?rev=1372259&r1=1372258&r2=1372259&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileOperations.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileOperations.java
 Mon Aug 13 04:27:07 2012
@@ -160,7 +160,7 @@ public class FileOperations implements G
         ObjectHelper.notNull(endpoint, "endpoint");
 
         File file = new File(fileName);
-
+        
         // if an existing file already exists what should we do?
         if (file.exists()) {
             if (endpoint.getFileExist() == GenericFileExist.Ignore) {
@@ -169,6 +169,21 @@ public class FileOperations implements G
                 return true;
             } else if (endpoint.getFileExist() == GenericFileExist.Fail) {
                 throw new GenericFileOperationFailedException("File already 
exist: " + file + ". Cannot write new file.");
+            } 
+        }
+        
+        // Do an explicit test for a null body and decide what to do
+        if (exchange.getIn().getBody() == null) {
+            if (endpoint.isAllowNullBody()) {
+                LOG.trace("The in message of exchange body was null.");
+                try {
+                    writeFileEmptyBody(file);
+                    return true;
+                } catch (IOException e) {
+                    throw new GenericFileOperationFailedException("Cannot 
store file: " + file, e);
+                }
+            } else {
+                throw new GenericFileOperationFailedException("Cannot write 
null body to file.");
             }
         }
 
@@ -326,6 +341,25 @@ public class FileOperations implements G
             IOHelper.close(out, target.getName(), LOG);
         }
     }
+    
+    /**
+     * Creates a new file if the file doesn't exist.
+     * If the endpoint's existing file logic is set to 'Override' then the 
target file will be truncated
+     */
+    private void writeFileEmptyBody(File target) throws IOException {
+        if (!target.exists()) {
+            target.createNewFile();
+        } else if (endpoint.getFileExist() == GenericFileExist.Override) {
+            LOG.trace("Truncating file as it already exists and endpoint set 
to Override file.");
+            FileChannel out = new FileOutputStream(target).getChannel();
+            try {
+                out.truncate(0);
+            } finally {
+                IOHelper.force(out, target.getName(), LOG);
+                IOHelper.close(out, target.getName(), LOG);
+            }
+        }
+    }
 
     /**
      * Creates and prepares the output file channel. Will position itself in 
correct position if the file is writable

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java?rev=1372259&r1=1372258&r2=1372259&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java
 Mon Aug 13 04:27:07 2012
@@ -96,6 +96,7 @@ public abstract class GenericFileEndpoin
     protected GenericFileExclusiveReadLockStrategy<T> 
exclusiveReadLockStrategy;
     protected boolean keepLastModified;
     protected String doneFileName;
+    protected boolean allowNullBody;
 
     public GenericFileEndpoint() {
     }
@@ -616,6 +617,14 @@ public abstract class GenericFileEndpoin
         this.keepLastModified = keepLastModified;
     }
 
+    public boolean isAllowNullBody() {
+        return allowNullBody;
+    }
+    
+    public void setAllowNullBody(boolean allowNullBody) {
+        this.allowNullBody = allowNullBody;
+    }
+    
     /**
      * Configures the given message with the file which sets the body to the
      * file object.

Added: 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileProducerAllowNullBodyFileAlreadyExistsTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileProducerAllowNullBodyFileAlreadyExistsTest.java?rev=1372259&view=auto
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileProducerAllowNullBodyFileAlreadyExistsTest.java
 (added)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileProducerAllowNullBodyFileAlreadyExistsTest.java
 Mon Aug 13 04:27:07 2012
@@ -0,0 +1,74 @@
+/**
+ * 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 org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+
+/**
+ * Unit tests to ensure that when the option allowNullBody is set to true then
+ * If the fileExist option is set to Append the file's contents will not be 
modified
+ * If the fileExist option is set to Override the file's contents will be empty
+ */
+public class FileProducerAllowNullBodyFileAlreadyExistsTest extends 
ContextTestSupport {
+    @Override
+    protected void setUp() throws Exception {
+        deleteDirectory("target/allow");
+        super.setUp();
+        template.sendBodyAndHeader("file://target/allow", "Hello world", 
Exchange.FILE_NAME, "hello.txt");
+    }
+
+    public void testFileExistAppendAllowNullBody() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:appendTypeAppendResult");
+        mock.expectedMessageCount(1);
+        mock.expectedFileExists("target/allow/hello.txt", "Hello world");
+
+        template.sendBody("direct:appendTypeAppend", null);
+
+        assertMockEndpointsSatisfied();
+    }
+    
+    public void testFileExistOverrideAllowNullBody() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:appendTypeOverrideResult");
+        mock.expectedMessageCount(1);
+        mock.expectedFileExists("target/allow/hello.txt", "");
+
+        template.sendBody("direct:appendTypeOverride", null);
+
+        assertMockEndpointsSatisfied();
+    }
+    
+    
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:appendTypeAppend")
+                    .setHeader(Exchange.FILE_NAME, constant("hello.txt"))
+                    
.to("file://target/allow?allowNullBody=true&fileExist=Append")
+                    .to("mock:appendTypeAppendResult");
+                
+                from("direct:appendTypeOverride")
+                     .setHeader(Exchange.FILE_NAME, constant("hello.txt"))
+                     
.to("file://target/allow?allowNullBody=true&fileExist=Override")
+                     .to("mock:appendTypeOverrideResult");
+            }
+        };
+    }
+}

Added: 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileProducerAllowNullBodyTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileProducerAllowNullBodyTest.java?rev=1372259&view=auto
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileProducerAllowNullBodyTest.java
 (added)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileProducerAllowNullBodyTest.java
 Mon Aug 13 04:27:07 2012
@@ -0,0 +1,53 @@
+/**
+ * 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 org.apache.camel.CamelExecutionException;
+import org.apache.camel.ContextTestSupport;
+
+/**
+ * Unit tests to ensure that 
+ * When the allowNullBody option is set to true it will create an empty file 
and not throw an exception
+ * When the allowNullBody option is set to false it will throw an exception of 
"Cannot write null body to file."
+ */
+public class FileProducerAllowNullBodyTest extends ContextTestSupport {
+
+    @Override
+    protected void setUp() throws Exception {
+        deleteDirectory("target/allow");
+        super.setUp();
+    }
+
+    public void testAllowNullBodyTrue() throws Exception {
+        
template.sendBody("file://target/allow?allowNullBody=true&fileName=allowNullBody.txt",
 null);
+        assertFileExists("./target/allow/allowNullBody.txt");
+    }
+    
+    public void testAllowNullBodyFalse() throws Exception {
+        try {
+            
template.sendBody("file://target/allow?fileName=allowNullBody.txt", null);
+            fail("Should have thrown a GenericFileOperationFailedException");
+        } catch (CamelExecutionException e) {
+            GenericFileOperationFailedException cause = 
assertIsInstanceOf(GenericFileOperationFailedException.class, e.getCause());
+            assertEquals("Cannot write null body to file.", 
cause.getMessage());
+        }
+        
+        assertFalse("allowNullBody set to false with null body should not 
create a new file", new File("./target/allow/allowNullBody.txt").exists());
+    }
+}


Reply via email to