[exo-jcr-commits] exo-jcr SVN: r4418 - ws/trunk/exo.ws.rest.ext/src/main/java/org/exoplatform/services/rest/ext/groovy.

do-not-reply at jboss.org do-not-reply at jboss.org
Tue May 24 02:47:34 EDT 2011


Author: tolusha
Date: 2011-05-24 02:47:34 -0400 (Tue, 24 May 2011)
New Revision: 4418

Modified:
   ws/trunk/exo.ws.rest.ext/src/main/java/org/exoplatform/services/rest/ext/groovy/DefaultGroovyResourceLoader.java
Log:
EXOJCR-1187: avoid using intern calls

Modified: ws/trunk/exo.ws.rest.ext/src/main/java/org/exoplatform/services/rest/ext/groovy/DefaultGroovyResourceLoader.java
===================================================================
--- ws/trunk/exo.ws.rest.ext/src/main/java/org/exoplatform/services/rest/ext/groovy/DefaultGroovyResourceLoader.java	2011-05-24 06:33:05 UTC (rev 4417)
+++ ws/trunk/exo.ws.rest.ext/src/main/java/org/exoplatform/services/rest/ext/groovy/DefaultGroovyResourceLoader.java	2011-05-24 06:47:34 UTC (rev 4418)
@@ -31,6 +31,13 @@
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.FutureTask;
 
 /**
  * @author <a href="mailto:andrew00x at gmail.com">Andrey Parfonov</a>
@@ -41,6 +48,8 @@
 {
    private static final String DEFAULT_SOURCE_FILE_EXTENSION = ".groovy";
 
+   public final ConcurrentMap<String, Future<URL>> findResourceURLTasks = new ConcurrentHashMap<String, Future<URL>>();
+   
    // TODO need configurable ?
    private int maxEntries = 512;
 
@@ -100,30 +109,80 @@
       return resource;
    }
 
-   protected URL getResource(String filename) throws MalformedURLException
+   protected URL getResource(final String filename) throws MalformedURLException
    {
-      URL resource = null;
-      filename = filename.intern();
-      synchronized (filename)
+      // First we check the cache outside the synchronized block
+      URL resource = resources.get(filename);
+      if (resource != null && checkResource(resource))
       {
-         resource = resources.get(filename);
-         boolean inCache = resource != null;
-         if (inCache && !checkResource(resource))
-            resource = null; // Resource in cache is unreachable.
-         for (int i = 0; i < roots.length && resource == null; i++)
+         // The resource could be found in the cache and is reachable
+         return resource;
+      }
+      // The resource cannot be found or is unreachable
+      // Check if a corresponding findResourceURL task exists
+      Future<URL> findResourceURLTask = findResourceURLTasks.get(filename);
+      if (findResourceURLTask == null)
+      {
+         // The task doesn't exist so we create it
+         FutureTask<URL> f = new FutureTask<URL>(new Callable<URL>()
          {
-            URL tmp = new URL(roots[i], filename);
-            if (checkResource(tmp))
-               resource = tmp;
+            public URL call() throws Exception
+            {
+               return findResourceURL(filename);
+            }
+         });
+         // We add the new task to the existing tasks
+         findResourceURLTask = findResourceURLTasks.putIfAbsent(filename, f);
+         if (findResourceURLTask == null)
+         {
+            // The task has not be registered so we launch it
+            findResourceURLTask = f;
+            f.run();
          }
-         if (resource != null)
-            resources.put(filename, resource);
-         else if (inCache)
-            resources.remove(filename);
       }
+      try
+      {
+         return findResourceURLTask.get();
+      }
+      catch (CancellationException e)
+      {
+         findResourceURLTasks.remove(filename, findResourceURLTask);
+      }
+      catch (ExecutionException e)
+      {
+         throw (MalformedURLException)e.getCause();
+      }
+      catch (InterruptedException e)
+      {
+         Thread.currentThread().interrupt();
+      }
+      return null;
+   }
+
+   protected URL findResourceURL(String filename) throws MalformedURLException
+   {
+      URL resource = resources.get(filename);
+      boolean inCache = resource != null;
+      if (inCache && !checkResource(resource))
+         resource = null; // Resource in cache is unreachable.
+      for (int i = 0; i < roots.length && resource == null; i++)
+      {
+         URL tmp = createURL(roots[i], filename);
+         if (checkResource(tmp))
+            resource = tmp;
+      }
+      if (resource != null)
+         resources.put(filename, resource);
+      else if (inCache)
+         resources.remove(filename);
       return resource;
    }
-
+   
+   protected URL createURL(URL root, String filename) throws MalformedURLException
+   {
+      return new URL(root, filename);
+   }
+   
    protected String getSourceFileExtension()
    {
       return DEFAULT_SOURCE_FILE_EXTENSION;



More information about the exo-jcr-commits mailing list