You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@manifoldcf.apache.org by kw...@apache.org on 2015/05/08 10:16:41 UTC

svn commit: r1678300 - in /manifoldcf/trunk: CHANGES.txt connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputConnector.java

Author: kwright
Date: Fri May  8 08:16:41 2015
New Revision: 1678300

URL: http://svn.apache.org/r1678300
Log:
Fix for CONNECTORS-1197

Modified:
    manifoldcf/trunk/CHANGES.txt
    manifoldcf/trunk/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputConnector.java

Modified: manifoldcf/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/CHANGES.txt?rev=1678300&r1=1678299&r2=1678300&view=diff
==============================================================================
--- manifoldcf/trunk/CHANGES.txt (original)
+++ manifoldcf/trunk/CHANGES.txt Fri May  8 08:16:41 2015
@@ -3,6 +3,9 @@ $Id$
 
 ======================= 2.2-dev =====================
 
+CONNECTORS-1197: Add "windows" file mode to file system output connector.
+(Karl Wright
+
 CONNECTORS-1195: Fix for NumberFormatException exception thrown in Maximum Bandwidth Report
 (Kishore Kumar)
 

Modified: manifoldcf/trunk/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputConnector.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputConnector.java?rev=1678300&r1=1678299&r2=1678300&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputConnector.java (original)
+++ manifoldcf/trunk/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputConnector.java Fri May  8 08:16:41 2015
@@ -28,6 +28,7 @@ import java.io.BufferedReader;
 import java.io.StringReader;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.SystemUtils;
 
 import java.net.URI;
 import java.net.URISyntaxException;
@@ -629,17 +630,94 @@ public class FileOutputConnector extends
    */
   final private String documentURItoFilePath(String documentURI) throws URISyntaxException, NullPointerException {
     StringBuffer path = new StringBuffer();
-    URI uri = null;
+    URI uri = new URI(documentURI);
+    if (SystemUtils.IS_OS_WINDOWS)
+      windowsFileName(path, uri);
+    else
+      unixFileName(path, uri);
+    return path.toString();
+  }
+  
+  final private void windowsFileName(final StringBuffer path, final URI uri) {
+    // Illegal characters: \ / : * ? " < > |
+    boolean endsWithSlash = false;
+    if (uri.getScheme() != null) {
+      path.append(uri.getScheme());
+      path.append("_");
+      endsWithSlash = true;
+    }
 
-    uri = new URI(documentURI);
+    if (uri.getHost() != null) {
+      path.append(uri.getHost());
+      endsWithSlash = false;
+      if (uri.getPort() != -1) {
+        path.append("_");
+        path.append(uri.getPort());
+      }
+      if (uri.getRawPath() != null) {
+        if (uri.getRawPath().length() == 0) {
+          path.append("_");
+          endsWithSlash = true;
+        } else if (uri.getRawPath().equals("/")) {
+          path.append(uri.getRawPath());
+          endsWithSlash = false;
+        } else {
+          for (String name : uri.getRawPath().split("/")) {
+            if (name.length() > 0) {
+              path.append("_");
+              path.append(convertWindowsString(name));
+              endsWithSlash = false;
+            }
+          }
+        }
+      }
+      if (uri.getRawQuery() != null) {
+        path.append("_");
+        path.append(convertWindowsString(uri.getRawQuery()));
+        endsWithSlash = false;
+      }
+    } else {
+      if (uri.getRawSchemeSpecificPart() != null) {
+        for (String name : uri.getRawSchemeSpecificPart().split("/")) {
+          if (name.length() > 0) {
+            path.append("_");
+            path.append(convertWindowsString(name));
+            endsWithSlash = false;
+          }
+        }
+      }
+    }
+
+    if (endsWithSlash) {
+      path.append(".content");
+    }
+  }
+  
+  final private String convertWindowsString(final String input) {
+    StringBuilder sb = new StringBuilder();
+    for (int i = 0; i < input.length(); i++) {
+      char c = input.charAt(i);
+      // Handle filename disallowed special characters!
+      if (c == ':' || c == '/' || c == '\\' | c == '*' | c == '"' | c == '?' | c == '|' || c == '<' || c == '>') {
+        sb.append('_');
+      }
+      else
+        sb.append(c);
+    }
+    return sb.toString();
+  }
 
+  final private void unixFileName(final StringBuffer path, final URI uri) {
+    boolean endsWithSlash = false;
     if (uri.getScheme() != null) {
       path.append(uri.getScheme());
       path.append("/");
+      endsWithSlash = true;
     }
 
     if (uri.getHost() != null) {
       path.append(uri.getHost());
+      endsWithSlash = false;
       if (uri.getPort() != -1) {
         path.append(":");
         path.append(uri.getPort());
@@ -647,39 +725,43 @@ public class FileOutputConnector extends
       if (uri.getRawPath() != null) {
         if (uri.getRawPath().length() == 0) {
           path.append("/");
+          endsWithSlash = true;
         } else if (uri.getRawPath().equals("/")) {
           path.append(uri.getRawPath());
+          endsWithSlash = false;
         } else {
           for (String name : uri.getRawPath().split("/")) {
             if (name.length() > 0) {
               path.append("/");
-              path.append(convertString(name));
+              path.append(convertUnixString(name));
+              endsWithSlash = false;
             }
           }
         }
       }
       if (uri.getRawQuery() != null) {
         path.append("?");
-        path.append(convertString(uri.getRawQuery()));
+        path.append(convertUnixString(uri.getRawQuery()));
+        endsWithSlash = false;
       }
     } else {
       if (uri.getRawSchemeSpecificPart() != null) {
         for (String name : uri.getRawSchemeSpecificPart().split("/")) {
           if (name.length() > 0) {
             path.append("/");
-            path.append(convertString(name));
+            path.append(convertUnixString(name));
+            endsWithSlash = false;
           }
         }
       }
     }
 
-    if (path.toString().endsWith("/")) {
+    if (endsWithSlash) {
       path.append(".content");
     }
-    return path.toString();
   }
   
-  final private String convertString(final String input) {
+  final private String convertUnixString(final String input) {
     StringBuilder sb = new StringBuilder();
     for (int i = 0; i < input.length(); i++) {
       char c = input.charAt(i);