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 2013/03/21 23:35:24 UTC

svn commit: r1459562 - in /manifoldcf/branches/CONNECTORS-664: connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/LLSERVER.java framework/core/src/main/java/org/apache/manifoldcf/core/system/ManifoldCF.java

Author: kwright
Date: Thu Mar 21 22:35:23 2013
New Revision: 1459562

URL: http://svn.apache.org/r1459562
Log:
Better handling of temp directories etc.

Modified:
    manifoldcf/branches/CONNECTORS-664/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/LLSERVER.java
    manifoldcf/branches/CONNECTORS-664/framework/core/src/main/java/org/apache/manifoldcf/core/system/ManifoldCF.java

Modified: manifoldcf/branches/CONNECTORS-664/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/LLSERVER.java
URL: http://svn.apache.org/viewvc/manifoldcf/branches/CONNECTORS-664/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/LLSERVER.java?rev=1459562&r1=1459561&r2=1459562&view=diff
==============================================================================
--- manifoldcf/branches/CONNECTORS-664/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/LLSERVER.java (original)
+++ manifoldcf/branches/CONNECTORS-664/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/LLSERVER.java Thu Mar 21 22:35:23 2013
@@ -130,35 +130,11 @@ public class LLSERVER
             {
               java.security.cert.Certificate cert = keystore.getCertificate(alias);
               byte[] certData = cert.getEncoded();
-              File fileName = new File(certFolder,alias + ".cer");
+              File fileName = new File(certFolder,ManifoldCF.safeFileName(alias) + ".cer");
               FileOutputStream fos = new FileOutputStream(fileName);
               try
               {
-                OutputStreamWriter osw = new OutputStreamWriter(fos,"ASCII");
-                try
-                {
-                  osw.write("-----BEGIN CERTIFICATE-----\n");
-                  String certBase64 = new Base64().encodeByteArray(certData);
-                  int offset = 0;
-                  while (offset < certBase64.length())
-                  {
-                    int remainder = certBase64.length() - offset;
-                    if (remainder < 64)
-                    {
-                      osw.write(certBase64,offset,remainder);
-                      osw.write("\n");
-                      break;
-                    }
-                    osw.write(certBase64,offset,64);
-                    offset += 64;
-                    osw.write("\n");
-                  }
-                  osw.write("-----END CERTIFICATE-----\n");
-                }
-                finally
-                {
-                  osw.flush();
-                }
+                fos.write(certData);
               }
               finally
               {
@@ -217,33 +193,8 @@ public class LLSERVER
   protected void createCertFolder()
     throws ManifoldCFException
   {
-    String tempDirLocation = System.getProperty("java.io.tmpdir");
-    if (tempDirLocation == null)
-      throw new ManifoldCFException("Can't find temporary directory!");
-    File tempDir = new File(tempDirLocation);
-    // Start with current timestamp, and generate a hash, then look for collision
-    long currentFileID = System.currentTimeMillis();
-    long currentFileHash = (currentFileID << 5) ^ (currentFileID >> 3);
-    int raceConditionRepeat = 0;
-    while (raceConditionRepeat < 1000)
-    {
-      File tempCertDir = new File(tempDir,"llcrt_"+currentFileID+".d");
-      if (tempCertDir.mkdir())
-      {
-        certFolder = tempCertDir;
-        return;
-      }
-      if (tempCertDir.exists())
-      {
-        currentFileID++;
-        continue;
-      }
-      // Doesn't exist but couldn't create either.  COULD be a race condition; we'll only know if we retry
-      // lots and nothing changes.
-      raceConditionRepeat++;
-      Thread.yield();
-    }
-    throw new ManifoldCFException("Temporary directory appears to be unwritable");
+    certFolder = ManifoldCF.createTempDir("llcrt_",".d");
+    ManifoldCF.addFile(certFolder);
   }
   
   /** Release temporary session-bound cert directory.
@@ -252,32 +203,11 @@ public class LLSERVER
   {
     if (certFolder != null)
     {
-      recursiveDelete(certFolder);
+      ManifoldCF.deleteFile(certFolder);
       certFolder = null;
     }
   }
 
-  /** Recursive delete: for cleaning up company folder.
-  *@param directoryPath is the File describing the directory to be removed.
-  */
-  protected static void recursiveDelete(File directoryPath)
-  {
-    File[] children = directoryPath.listFiles();
-    if (children != null)
-    {
-      int i = 0;
-      while (i < children.length)
-      {
-        File x = children[i++];
-        if (x.isDirectory())
-          recursiveDelete(x);
-        else
-          x.delete();
-      }
-    }
-    directoryPath.delete();
-  }
-
   /**
   * Returns the server name where the Livelink
   * Server has been installed on

Modified: manifoldcf/branches/CONNECTORS-664/framework/core/src/main/java/org/apache/manifoldcf/core/system/ManifoldCF.java
URL: http://svn.apache.org/viewvc/manifoldcf/branches/CONNECTORS-664/framework/core/src/main/java/org/apache/manifoldcf/core/system/ManifoldCF.java?rev=1459562&r1=1459561&r2=1459562&view=diff
==============================================================================
--- manifoldcf/branches/CONNECTORS-664/framework/core/src/main/java/org/apache/manifoldcf/core/system/ManifoldCF.java (original)
+++ manifoldcf/branches/CONNECTORS-664/framework/core/src/main/java/org/apache/manifoldcf/core/system/ManifoldCF.java Thu Mar 21 22:35:23 2013
@@ -397,21 +397,23 @@ public class ManifoldCF
   }
 
   /** Recursive delete: for cleaning up company folder.
-  *@param directoryPath is the File describing the directory to be removed.
+  *@param directoryPath is the File describing the directory or file to be removed.
   */
-  protected static void recursiveDelete(File directoryPath)
+  public static void recursiveDelete(File directoryPath)
   {
-    File[] children = directoryPath.listFiles();
-    if (children != null)
+    if (!directoryPath.exists())
+      return;
+    if (directoryPath.isDirectory())
     {
-      int i = 0;
-      while (i < children.length)
+      File[] children = directoryPath.listFiles();
+      if (children != null)
       {
-        File x = children[i++];
-        if (x.isDirectory())
+        int i = 0;
+        while (i < children.length)
+        {
+          File x = children[i++];
           recursiveDelete(x);
-        else
-          x.delete();
+        }
       }
     }
     directoryPath.delete();
@@ -718,6 +720,39 @@ public class ManifoldCF
     master.dropUserAndDatabase(masterUsername,masterPassword,null);
   }
 
+  /** Create temporary directory.
+  */
+  public static File createTempDir(String prefix, String suffix)
+    throws ManifoldCFException
+  {
+    String tempDirLocation = System.getProperty("java.io.tmpdir");
+    if (tempDirLocation == null)
+      throw new ManifoldCFException("Can't find temporary directory!");
+    File tempDir = new File(tempDirLocation);
+    // Start with current timestamp, and generate a hash, then look for collision
+    long currentFileID = System.currentTimeMillis();
+    long currentFileHash = (currentFileID << 5) ^ (currentFileID >> 3);
+    int raceConditionRepeat = 0;
+    while (raceConditionRepeat < 1000)
+    {
+      File tempCertDir = new File(tempDir,prefix+currentFileHash+suffix);
+      if (tempCertDir.mkdir())
+      {
+        return tempCertDir;
+      }
+      if (tempCertDir.exists())
+      {
+        currentFileHash++;
+        continue;
+      }
+      // Doesn't exist but couldn't create either.  COULD be a race condition; we'll only know if we retry
+      // lots and nothing changes.
+      raceConditionRepeat++;
+      Thread.yield();
+    }
+    throw new ManifoldCFException("Temporary directory appears to be unwritable");
+  }
+
   /** Add a file to the tracking system. */
   public static void addFile(File f)
   {
@@ -1194,8 +1229,8 @@ public class ManifoldCF
   /** Class that tracks files that need to be cleaned up on exit */
   protected static class FileTrack implements IShutdownHook
   {
-    /** Key and value are both File objects */
-    protected Map<File,File> filesToDelete = new HashMap<File,File>();
+    /** Set of File objects */
+    protected Set<File> filesToDelete = new HashSet<File>();
 
     /** Constructor */
     public FileTrack()
@@ -1207,7 +1242,7 @@ public class ManifoldCF
     {
       synchronized (this)
       {
-        filesToDelete.put(f,f);
+        filesToDelete.add(f);
       }
     }
 
@@ -1216,12 +1251,12 @@ public class ManifoldCF
     {
       // Because we never reuse file names, it is OK to delete twice.
       // So the delete() can be outside the synchronizer.
-      f.delete();
+      recursiveDelete(f);
       synchronized (this)
       {
         filesToDelete.remove(f);
       }
-  }
+    }
 
     /** Delete all remaining files */
     public void doCleanup()
@@ -1229,10 +1264,10 @@ public class ManifoldCF
     {
       synchronized (this)
       {
-	Iterator iter = filesToDelete.keySet().iterator();
+	Iterator<File> iter = filesToDelete.iterator();
 	while (iter.hasNext())
 	{
-	  File f = (File)iter.next();
+	  File f = iter.next();
 	  f.delete();
 	}
 	filesToDelete.clear();