You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ta...@apache.org on 2020/10/06 14:15:54 UTC

[myfaces] branch master updated: MYFACES-4225

This is an automated email from the ASF dual-hosted git repository.

tandraschko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/myfaces.git


The following commit(s) were added to refs/heads/master by this push:
     new 2533d06  MYFACES-4225
2533d06 is described below

commit 2533d0609819eb583daf90652e703117ec523bee
Author: Thomas Andraschko <ta...@apache.org>
AuthorDate: Tue Oct 6 16:15:45 2020 +0200

    MYFACES-4225
---
 .../myfaces/resource/ResourceHandlerCache.java     |  2 +-
 .../apache/myfaces/resource/ResourceLoader.java    | 40 ++++++++++++++--
 .../apache/myfaces/resource/ResourceMetaImpl.java  | 56 ++++++++++++++++++++++
 .../TempDirFileCacheContractResourceLoader.java    |  6 ---
 .../resource/TempDirFileCacheResourceLoader.java   |  6 ---
 .../application/ResourceHandlerImplTest.java       | 13 ++---
 6 files changed, 97 insertions(+), 26 deletions(-)

diff --git a/impl/src/main/java/org/apache/myfaces/resource/ResourceHandlerCache.java b/impl/src/main/java/org/apache/myfaces/resource/ResourceHandlerCache.java
index 453a800..02f2076 100644
--- a/impl/src/main/java/org/apache/myfaces/resource/ResourceHandlerCache.java
+++ b/impl/src/main/java/org/apache/myfaces/resource/ResourceHandlerCache.java
@@ -300,7 +300,7 @@ public class ResourceHandlerCache
         
         if (log.isLoggable(Level.FINE))
         {
-            log.log(Level.FINE, "Attemping to set confirmLibraryExists on cache " + libraryName);
+            log.log(Level.FINE, "Attemping to set confirmLibraryNotExists on cache " + libraryName);
         }
 
         _libraryExistsCacheMap.put(libraryName, Boolean.FALSE);
diff --git a/impl/src/main/java/org/apache/myfaces/resource/ResourceLoader.java b/impl/src/main/java/org/apache/myfaces/resource/ResourceLoader.java
index 1422674..b0c7d51 100644
--- a/impl/src/main/java/org/apache/myfaces/resource/ResourceLoader.java
+++ b/impl/src/main/java/org/apache/myfaces/resource/ResourceLoader.java
@@ -24,6 +24,8 @@ import java.util.Comparator;
 import java.util.Iterator;
 import javax.faces.application.ResourceVisitOption;
 import javax.faces.context.FacesContext;
+import org.apache.myfaces.config.MyfacesConfig;
+import org.apache.myfaces.util.lang.ConcurrentLRUCache;
 
 /**
  * Base class for resource loaders.  Resource loaders can lookup resources 
@@ -34,11 +36,23 @@ public abstract class ResourceLoader
     
     public static final String VERSION_INVALID = "INVALID";
     
-    private String _prefix;
+    private String prefix;
+    private boolean resourceCacheEnabled;
+    private ConcurrentLRUCache<Object, Boolean> resourceExistsCache;
     
     public ResourceLoader(String prefix)
     {
-        _prefix = prefix;
+        this.prefix = prefix;
+        
+        FacesContext facesContext = FacesContext.getCurrentInstance();
+        MyfacesConfig myfacesConfig = MyfacesConfig.getCurrentInstance(facesContext);
+        this.resourceCacheEnabled = myfacesConfig.isResourceHandlerCacheEnabled();
+        
+        if (this.resourceCacheEnabled)
+        {
+            int maxSize = myfacesConfig.getResourceHandlerCacheSize();
+            this.resourceExistsCache =  new ConcurrentLRUCache<>(maxSize * 2, maxSize);
+        }
     }
 
     public abstract String getResourceVersion(String path);
@@ -70,7 +84,23 @@ public abstract class ResourceLoader
     
     public boolean resourceExists(ResourceMeta resourceMeta)
     {
-        return (getResourceURL(resourceMeta) != null);
+        if (resourceMeta == null)
+        {
+            return false;
+        }
+
+        if (resourceCacheEnabled)
+        {
+            Boolean exists = resourceExistsCache.get(resourceMeta);
+            if (exists == null)
+            {
+                exists = getResourceURL(resourceMeta) != null;
+                resourceExistsCache.put(resourceMeta, exists);
+            }
+            return exists;
+        }
+
+        return getResourceURL(resourceMeta) != null;
     }
 
     public Iterator<String> iterator(FacesContext facesContext, 
@@ -162,11 +192,11 @@ public abstract class ResourceLoader
     
     public String getPrefix()
     {
-        return _prefix;
+        return prefix;
     }
 
     public void setPrefix(String prefix)
     {
-        _prefix = prefix;
+        this.prefix = prefix;
     }
 }
diff --git a/impl/src/main/java/org/apache/myfaces/resource/ResourceMetaImpl.java b/impl/src/main/java/org/apache/myfaces/resource/ResourceMetaImpl.java
index d343e75..5dd62a1 100644
--- a/impl/src/main/java/org/apache/myfaces/resource/ResourceMetaImpl.java
+++ b/impl/src/main/java/org/apache/myfaces/resource/ResourceMetaImpl.java
@@ -18,6 +18,8 @@
  */
 package org.apache.myfaces.resource;
 
+import java.util.Objects;
+
 /**
  * Contains the metadata information to reference a resource 
  */
@@ -160,4 +162,58 @@ public class ResourceMetaImpl extends ResourceMeta
         this.lastModified = lastModified;
     }
 
+    @Override
+    public int hashCode()
+    {
+        int hash = 3;
+        hash = 79 * hash + Objects.hashCode(this._libraryName);
+        hash = 79 * hash + Objects.hashCode(this._libraryVersion);
+        hash = 79 * hash + Objects.hashCode(this._resourceName);
+        hash = 79 * hash + Objects.hashCode(this._resourceVersion);
+        hash = 79 * hash + Objects.hashCode(this._contractName);
+        return hash;
+    }
+
+    @Override
+    public boolean equals(Object obj)
+    {
+        if (this == obj)
+        {
+            return true;
+        }
+        if (obj == null)
+        {
+            return false;
+        }
+        if (getClass() != obj.getClass())
+        {
+            return false;
+        }
+        final ResourceMetaImpl other = (ResourceMetaImpl) obj;
+        if (!Objects.equals(this._prefix, other._prefix))
+        {
+            return false;
+        }
+        if (!Objects.equals(this._libraryName, other._libraryName))
+        {
+            return false;
+        }
+        if (!Objects.equals(this._libraryVersion, other._libraryVersion))
+        {
+            return false;
+        }
+        if (!Objects.equals(this._resourceName, other._resourceName))
+        {
+            return false;
+        }
+        if (!Objects.equals(this._resourceVersion, other._resourceVersion))
+        {
+            return false;
+        }
+        if (!Objects.equals(this._contractName, other._contractName))
+        {
+            return false;
+        }
+        return true;
+    }
 }
diff --git a/impl/src/main/java/org/apache/myfaces/resource/TempDirFileCacheContractResourceLoader.java b/impl/src/main/java/org/apache/myfaces/resource/TempDirFileCacheContractResourceLoader.java
index daa504f..54b69db 100644
--- a/impl/src/main/java/org/apache/myfaces/resource/TempDirFileCacheContractResourceLoader.java
+++ b/impl/src/main/java/org/apache/myfaces/resource/TempDirFileCacheContractResourceLoader.java
@@ -165,12 +165,6 @@ public class TempDirFileCacheContractResourceLoader extends ContractResourceLoad
     {
         return getResourceInputStream(resourceMeta, null);
     }
-    
-    @Override
-    public boolean resourceExists(ResourceMeta resourceMeta)
-    {
-        return super.resourceExists(resourceMeta);
-    }
 
     @SuppressWarnings("unchecked")
     private File createOrGetTempFile(FacesContext facesContext, ResourceMeta resourceMeta)
diff --git a/impl/src/main/java/org/apache/myfaces/resource/TempDirFileCacheResourceLoader.java b/impl/src/main/java/org/apache/myfaces/resource/TempDirFileCacheResourceLoader.java
index e7d0efc..1e868a0 100644
--- a/impl/src/main/java/org/apache/myfaces/resource/TempDirFileCacheResourceLoader.java
+++ b/impl/src/main/java/org/apache/myfaces/resource/TempDirFileCacheResourceLoader.java
@@ -206,12 +206,6 @@ public class TempDirFileCacheResourceLoader extends ResourceLoaderWrapper
     {
         return getResourceInputStream(resourceMeta, null);
     }
-    
-    @Override
-    public boolean resourceExists(ResourceMeta resourceMeta)
-    {
-        return super.resourceExists(resourceMeta);
-    }
 
     @SuppressWarnings("unchecked")
     private File createOrGetTempFile(FacesContext facesContext, ResourceMeta resourceMeta)
diff --git a/impl/src/test/java/org/apache/myfaces/application/ResourceHandlerImplTest.java b/impl/src/test/java/org/apache/myfaces/application/ResourceHandlerImplTest.java
index 92e712b..b752ca4 100644
--- a/impl/src/test/java/org/apache/myfaces/application/ResourceHandlerImplTest.java
+++ b/impl/src/test/java/org/apache/myfaces/application/ResourceHandlerImplTest.java
@@ -289,13 +289,11 @@ public class ResourceHandlerImplTest extends AbstractJsfTestCase
         Mockito.verify(loader, Mockito.times(4)).createResourceMeta(
                 Mockito.any(), Mockito.eq("test"), Mockito.any(), Mockito.eq("test.png"), Mockito.any());
     }
-    
-    @Ignore
+
     @Test
-    public void testNegativeCache()
+    public void testResourceExistsCache()
     {
         ResourceLoader loader = Mockito.spy(new ClassLoaderResourceLoader(null));
-        Mockito.when(loader.resourceExists(Mockito.any())).thenReturn(false);
 
         ResourceHandlerCache cache = Mockito.spy(new ResourceHandlerCache());   
         
@@ -313,9 +311,8 @@ public class ResourceHandlerImplTest extends AbstractJsfTestCase
 
         Mockito.verify(cache, Mockito.times(4)).getResource(
                 Mockito.eq("test.png"), Mockito.eq("test"), Mockito.eq("test"), Mockito.any());
-        Mockito.verify(cache, Mockito.times(1)).putResource(
-                Mockito.eq("test.png"), Mockito.eq("test"), Mockito.eq("test"), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any());
-        Mockito.verify(loader, Mockito.times(1)).createResourceMeta(
-                Mockito.any(), Mockito.eq("test"), Mockito.any(), Mockito.eq("test.png"), Mockito.any());
+        Mockito.verify(loader, Mockito.times(1)).getResourceURL(Mockito.any());
+        Mockito.verify(loader, Mockito.never()).getResourceInputStream(Mockito.any());
+        
     }
 }