[exo-jcr-commits] exo-jcr SVN: r2291 - jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/util/io.

do-not-reply at jboss.org do-not-reply at jboss.org
Tue Apr 20 09:52:00 EDT 2010


Author: sergiykarpenko
Date: 2010-04-20 09:51:59 -0400 (Tue, 20 Apr 2010)
New Revision: 2291

Modified:
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/util/io/FileCleaner.java
Log:
EXOJCR-671: FileCleaner - LinkedHashSet changed to ConcurrentLinkedQueue

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/util/io/FileCleaner.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/util/io/FileCleaner.java	2010-04-20 13:36:19 UTC (rev 2290)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/util/io/FileCleaner.java	2010-04-20 13:51:59 UTC (rev 2291)
@@ -23,8 +23,9 @@
 import org.exoplatform.services.log.Log;
 
 import java.io.File;
-import java.util.LinkedHashSet;
+import java.util.HashSet;
 import java.util.Set;
+import java.util.concurrent.ConcurrentLinkedQueue;
 
 /**
  * Created by The eXo Platform SAS.
@@ -40,7 +41,7 @@
 
    protected static Log log = ExoLogger.getLogger("exo.jcr.component.core.FileCleaner");
 
-   protected Set<File> files = new LinkedHashSet<File>();
+   protected final ConcurrentLinkedQueue<File> files = new ConcurrentLinkedQueue<File>();
 
    public FileCleaner()
    {
@@ -77,11 +78,11 @@
    /**
     * @param file
     */
-   public synchronized void addFile(File file)
+   public void addFile(File file)
    {
       if (file.exists())
       {
-         files.add(file);
+         files.offer(file);
       }
    }
 
@@ -106,51 +107,47 @@
     */
    protected void callPeriodically() throws Exception
    {
-      if (files != null && files.size() > 0)
+      File file = null;
+      Set<File> notRemovedFiles = new HashSet<File>();
+      while ((file = files.poll()) != null)
       {
-         Set<File> oldFiles = files;
-         files = new LinkedHashSet<File>();
-         for (File file : oldFiles)
+         if (file.exists())
          {
-            if (file.exists())
+            if (!file.delete())
             {
-               if (!file.delete())
-               {
-                  files.add(file);
+               notRemovedFiles.add(file);
 
-                  if (log.isDebugEnabled())
-                     log.debug("Could not delete " + (file.isDirectory() ? "directory" : "file")
-                        + ". Will try next time: " + file.getAbsolutePath());
-               }
-               else if (log.isDebugEnabled())
-               {
-                  log.debug((file.isDirectory() ? "Directory" : "File") + " deleted : " + file.getAbsolutePath());
-               }
+               if (log.isDebugEnabled())
+                  log.debug("Could not delete " + (file.isDirectory() ? "directory" : "file")
+                     + ". Will try next time: " + file.getAbsolutePath());
             }
+            else if (log.isDebugEnabled())
+            {
+               log.debug((file.isDirectory() ? "Directory" : "File") + " deleted : " + file.getAbsolutePath());
+            }
          }
       }
+
+      //add do lists tail all not removed files
+      if (!notRemovedFiles.isEmpty())
+      {
+         files.addAll(notRemovedFiles);
+      }
    }
 
    private void registerShutdownHook()
    {
-      // register shutdownhook for final cleaning up
+      // register shutdown hook for final cleaning up
       try
       {
          Runtime.getRuntime().addShutdownHook(new Thread()
          {
             public void run()
             {
-               Set<File> oldFiles = files;
-               files = null;
-               // synchronize on the list before iterating over it in order
-               // to avoid ConcurrentModificationException (JCR-549)
-               // @see java.lang.util.Collections.synchronizedList(java.util.List)
-               synchronized (oldFiles)
+               File file = null;
+               while ((file = files.poll()) != null)
                {
-                  for (File file : oldFiles)
-                  {
-                     file.delete();
-                  }
+                  file.delete();
                }
             }
          });



More information about the exo-jcr-commits mailing list