Author: rajikak
Date: Fri Aug  9 05:58:20 2013
New Revision: 1512144

URL: http://svn.apache.org/r1512144
Log:
fixed SYNAPSE-502.

Modified:
    
synapse/trunk/java/modules/transports/core/vfs/src/main/java/org/apache/synapse/transport/vfs/VFSConstants.java
    
synapse/trunk/java/modules/transports/core/vfs/src/main/java/org/apache/synapse/transport/vfs/VFSOutTransportInfo.java
    
synapse/trunk/java/modules/transports/core/vfs/src/main/java/org/apache/synapse/transport/vfs/VFSTransportSender.java
    
synapse/trunk/java/modules/transports/core/vfs/src/main/java/org/apache/synapse/transport/vfs/VFSUtils.java

Modified: 
synapse/trunk/java/modules/transports/core/vfs/src/main/java/org/apache/synapse/transport/vfs/VFSConstants.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/vfs/src/main/java/org/apache/synapse/transport/vfs/VFSConstants.java?rev=1512144&r1=1512143&r2=1512144&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/vfs/src/main/java/org/apache/synapse/transport/vfs/VFSConstants.java
 (original)
+++ 
synapse/trunk/java/modules/transports/core/vfs/src/main/java/org/apache/synapse/transport/vfs/VFSConstants.java
 Fri Aug  9 05:58:20 2013
@@ -20,7 +20,7 @@
 package org.apache.synapse.transport.vfs;
 
 public final class VFSConstants {
-    
+
     // vfs transport prefix (e.g. used in an out EPR etc)
     public static final String VFS_PREFIX = "vfs:";
 
@@ -41,8 +41,8 @@ public final class VFSConstants {
     public static final String TRANSPORT_FILE_FILE_URI = 
"transport.vfs.FileURI";
     public static final String TRANSPORT_FILE_FILE_NAME_PATTERN = 
"transport.vfs.FileNamePattern";
     public static final String TRANSPORT_FILE_CONTENT_TYPE = 
"transport.vfs.ContentType";
-    public static final String TRANSPORT_FILE_LOCKING = 
"transport.vfs.Locking";    
-    public static final String TRANSPORT_FILE_LOCKING_ENABLED = "enable";    
+    public static final String TRANSPORT_FILE_LOCKING = 
"transport.vfs.Locking";
+    public static final String TRANSPORT_FILE_LOCKING_ENABLED = "enable";
     public static final String TRANSPORT_FILE_LOCKING_DISABLED = "disable";
 
     public static final String REPLY_FILE_URI = "transport.vfs.ReplyFileURI";
@@ -53,15 +53,15 @@ public final class VFSConstants {
 
     public static final String DEFAULT_XML_RESPONSE_FILE = "response.xml";
     public static final String DEFAULT_NON_XML_RESPONSE_FILE = "response.dat";
-    
+
     public static final String STREAMING = "transport.vfs.Streaming";
-    
+
     public static final String MAX_RETRY_COUNT = "transport.vfs.MaxRetryCount";
     public static final String RECONNECT_TIMEOUT = 
"transport.vfs.ReconnectTimeout";
     public static final String APPEND = "transport.vfs.Append";
     public static final int DEFAULT_MAX_RETRY_COUNT = 3;
     public static final long DEFAULT_RECONNECT_TIMEOUT = 30000;
-    
+
     // transport header property names used by the VFS transport
     public static final String FILE_PATH = "FILE_PATH";
     public static final String FILE_NAME = "FILE_NAME";
@@ -99,6 +99,11 @@ public final class VFSConstants {
       public static final String TRANSPORT_FAILED_RECORD_NEXT_RETRY_DURATION =
               "transport.vfs.FailedRecordNextRetryDuration";
 
+      /**
+       * Should use a temp file when uploading ?
+       */
+      public static final String TRANSPORT_FILE_USE_TEMP_FILE = 
"transport.vfs.UseTempFile";
+
       public static final int DEFAULT_NEXT_RETRY_DURATION = 3000; // 3 seconds
 
       /**

Modified: 
synapse/trunk/java/modules/transports/core/vfs/src/main/java/org/apache/synapse/transport/vfs/VFSOutTransportInfo.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/vfs/src/main/java/org/apache/synapse/transport/vfs/VFSOutTransportInfo.java?rev=1512144&r1=1512143&r2=1512144&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/vfs/src/main/java/org/apache/synapse/transport/vfs/VFSOutTransportInfo.java
 (original)
+++ 
synapse/trunk/java/modules/transports/core/vfs/src/main/java/org/apache/synapse/transport/vfs/VFSOutTransportInfo.java
 Fri Aug  9 05:58:20 2013
@@ -43,22 +43,23 @@ public class VFSOutTransportInfo impleme
     private long reconnectTimeout = 30000;
     private boolean append;
     private boolean fileLocking;
+    private boolean isUseTempFile = false;
 
     /**
      * Constructs the VFSOutTransportInfo containing the information about the 
file to which the
      * response has to be submitted to.
-     * 
+     *
      * @param outFileURI URI of the file to which the message is delivered
      */
     VFSOutTransportInfo(String outFileURI, boolean fileLocking) {
-        
+
         if (outFileURI.startsWith(VFSConstants.VFS_PREFIX)) {
             this.outFileURI = 
outFileURI.substring(VFSConstants.VFS_PREFIX.length());
         } else {
             this.outFileURI = outFileURI;
         }
 
-        Map<String,String> properties = BaseUtils.getEPRProperties(outFileURI);
+        Map<String, String> properties = 
BaseUtils.getEPRProperties(outFileURI);
         if (properties.containsKey(VFSConstants.MAX_RETRY_COUNT)) {
             String strMaxRetryCount = 
properties.get(VFSConstants.MAX_RETRY_COUNT);
             maxRetryCount = Integer.parseInt(strMaxRetryCount);
@@ -66,6 +67,11 @@ public class VFSOutTransportInfo impleme
             maxRetryCount = VFSConstants.DEFAULT_MAX_RETRY_COUNT;
         }
 
+        if (properties.containsKey(VFSConstants.TRANSPORT_FILE_USE_TEMP_FILE)) 
{
+            String useTempFile = 
properties.get(VFSConstants.TRANSPORT_FILE_USE_TEMP_FILE);
+            isUseTempFile = Boolean.valueOf(useTempFile).booleanValue();
+        }
+
         if (properties.containsKey(VFSConstants.RECONNECT_TIMEOUT)) {
             String strReconnectTimeout = 
properties.get(VFSConstants.RECONNECT_TIMEOUT);
             reconnectTimeout = Long.parseLong(strReconnectTimeout) * 1000;
@@ -122,10 +128,14 @@ public class VFSOutTransportInfo impleme
         return reconnectTimeout;
     }
 
+    public boolean isUseTempFile() {
+        return isUseTempFile;
+    }
+
     public void setReconnectTimeout(long reconnectTimeout) {
         this.reconnectTimeout = reconnectTimeout;
     }
-    
+
     public boolean isAppend() {
         return append;
     }

Modified: 
synapse/trunk/java/modules/transports/core/vfs/src/main/java/org/apache/synapse/transport/vfs/VFSTransportSender.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/vfs/src/main/java/org/apache/synapse/transport/vfs/VFSTransportSender.java?rev=1512144&r1=1512143&r2=1512144&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/vfs/src/main/java/org/apache/synapse/transport/vfs/VFSTransportSender.java
 (original)
+++ 
synapse/trunk/java/modules/transports/core/vfs/src/main/java/org/apache/synapse/transport/vfs/VFSTransportSender.java
 Fri Aug  9 05:58:20 2013
@@ -38,6 +38,7 @@ import org.apache.commons.vfs2.FileSyste
 import org.apache.commons.vfs2.FileType;
 import org.apache.commons.vfs2.impl.StandardFileSystemManager;
 
+import java.io.File;
 import java.io.IOException;
 
 /**
@@ -127,7 +128,9 @@ public class VFSTransportSender extends 
                 int maxRetryCount = vfsOutInfo.getMaxRetryCount();
                 long reconnectionTimeout = vfsOutInfo.getReconnectTimeout();
                 boolean append = vfsOutInfo.isAppend();
-                
+                boolean isUseTempFile = vfsOutInfo.isUseTempFile();
+                String tempTargetFileName, actualTargetFileName = null;
+
                 while (wasError) {
                     
                     try {
@@ -152,7 +155,7 @@ public class VFSTransportSender extends 
                         try {
                             Thread.sleep(reconnectionTimeout);
                         } catch (InterruptedException e2) {
-                            e2.printStackTrace();
+                            Thread.currentThread().interrupt();
                         }
                     }
                 }
@@ -160,9 +163,14 @@ public class VFSTransportSender extends 
                 if (replyFile.exists()) {
 
                     if (replyFile.getType() == FileType.FOLDER) {
+                        if (isUseTempFile) {
+                            tempTargetFileName = 
VFSUtils.generateTempFileName();
+                            actualTargetFileName = 
VFSUtils.getFileName(msgCtx, vfsOutInfo);
+                        } else {
+                            tempTargetFileName = VFSUtils.getFileName(msgCtx, 
vfsOutInfo);
+                        }
                         // we need to write a file containing the message to 
this folder
-                        FileObject responseFile = 
fsManager.resolveFile(replyFile,
-                                VFSUtils.getFileName(msgCtx, vfsOutInfo));
+                        FileObject responseFile = 
fsManager.resolveFile(replyFile, tempTargetFileName);
 
                         // if file locking is not disabled acquire the lock
                         // before uploading the file
@@ -180,7 +188,16 @@ public class VFSTransportSender extends 
                             populateResponseFile(responseFile, msgCtx,append, 
false);
                         }
 
+                        if (isUseTempFile) {
+                            
responseFile.moveTo(fsManager.resolveFile(replyFile, actualTargetFileName));
+                        }
+
                     } else if (replyFile.getType() == FileType.FILE) {
+                        if (isUseTempFile) {
+                            tempTargetFileName = 
VFSUtils.generateTempFileName();
+                            actualTargetFileName = 
replyFile.getURL().toString();
+                            replyFile = getTempFileObject(fsManager, 
replyFile, tempTargetFileName);
+                        }
 
                         // if file locking is not disabled acquire the lock
                         // before uploading the file
@@ -192,11 +209,20 @@ public class VFSTransportSender extends 
                             populateResponseFile(replyFile, msgCtx, append, 
false);
                         }
 
+                        if (isUseTempFile) {
+                            
replyFile.moveTo(fsManager.resolveFile(actualTargetFileName));
+                        }
                     } else {
                         handleException("Unsupported reply file type : " + 
replyFile.getType() +
                                 " for file : " + vfsOutInfo.getOutFileURI());
                     }
                 } else {
+                    if (isUseTempFile) {
+                        tempTargetFileName = VFSUtils.generateTempFileName();
+                        actualTargetFileName = replyFile.getURL().toString();
+                        replyFile = getTempFileObject(fsManager, replyFile, 
tempTargetFileName);
+                    }
+
                     // if file locking is not disabled acquire the lock before 
uploading the file
                     if (vfsOutInfo.isFileLockingEnabled()) {
                         acquireLockForSending(replyFile, vfsOutInfo);
@@ -207,6 +233,10 @@ public class VFSTransportSender extends 
                         replyFile.createFile();
                         populateResponseFile(replyFile, msgCtx, append, false);
                     }
+
+                    if (isUseTempFile) {
+                        
replyFile.moveTo(fsManager.resolveFile(actualTargetFileName));
+                    }
                 }
             } catch (FileSystemException e) {
                 handleException("Error resolving reply file : " +
@@ -278,4 +308,12 @@ public class VFSTransportSender extends 
             }
         }
     }
+
+    private FileObject getTempFileObject(FileSystemManager fsManager,
+                                         FileObject originalFileObj,
+                                         String fileName) throws 
FileSystemException {
+        FileObject pareFileObject = originalFileObj.getParent();
+        String parentURL = pareFileObject.getURL().toString();
+        return 
fsManager.resolveFile(parentURL.concat(File.separator).concat(fileName));
+    }
 }

Modified: 
synapse/trunk/java/modules/transports/core/vfs/src/main/java/org/apache/synapse/transport/vfs/VFSUtils.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/vfs/src/main/java/org/apache/synapse/transport/vfs/VFSUtils.java?rev=1512144&r1=1512143&r2=1512144&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/vfs/src/main/java/org/apache/synapse/transport/vfs/VFSUtils.java
 (original)
+++ 
synapse/trunk/java/modules/transports/core/vfs/src/main/java/org/apache/synapse/transport/vfs/VFSUtils.java
 Fri Aug  9 05:58:20 2013
@@ -33,10 +33,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.text.SimpleDateFormat;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.Map;
-import java.util.Random;
+import java.util.*;
 import java.util.regex.Pattern;
 import java.util.regex.Matcher;
 
@@ -114,12 +111,12 @@ public class VFSUtils extends BaseUtils 
      * @return boolean true if the lock has been acquired or false if not
      */
     public synchronized static boolean acquireLock(FileSystemManager 
fsManager, FileObject fo) {
-        
+
         // generate a random lock value to ensure that there are no two parties
         // processing the same file
         Random random = new Random();
         byte[] lockValue = String.valueOf(random.nextLong()).getBytes();
-        
+
         try {
             // check whether there is an existing lock for this item, if so it 
is assumed
             // to be processed by an another listener (downloading) or a 
sender (uploading)
@@ -214,6 +211,13 @@ public class VFSUtils extends BaseUtils 
         return url;
     }
 
+    /**
+     * Generate a unique file name to be used as a temp file
+     * @return the temp file name
+     */
+    public static String generateTempFileName() {
+        return "file".concat(UUID.randomUUID().toString());
+    }
 
     private static boolean verifyLock(byte[] lockValue, FileObject lockObject) 
{
         try {


Reply via email to