Fixed WICKET-5967 Unable to load i18n minified js

Moved location of minified (or not) resources to ResourceStreamLocator instead 
of the
resources themselves by adding a lookup for .min.<extension> before 
.<extension> in the list
of extensions to search for. This prioritizes the minified version before the 
non-minified version,
and allows for style_variation_locale resources to be located in minified 
versions as well.


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/87735317
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/87735317
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/87735317

Branch: refs/heads/master
Commit: 8773531793092e302fa86ec61f3919c7008472d6
Parents: b87bc97
Author: Martijn Dashorst <[email protected]>
Authored: Mon Aug 10 17:35:23 2015 +0200
Committer: Martijn Dashorst <[email protected]>
Committed: Mon Aug 10 17:35:23 2015 +0200

----------------------------------------------------------------------
 .../resource/locator/ResourceStreamLocator.java | 31 +++++++-
 .../request/resource/CssPackageResource.java    | 13 +++-
 .../resource/JavaScriptPackageResource.java     | 20 ++++-
 .../resource/PackageResourceReference.java      | 79 +-------------------
 .../MinifiedAwareResourceReferenceTest.java     |  9 ++-
 .../resource/PackageResourceReferenceTest.java  |  2 +-
 .../resource/ResourceReferenceLocatingTest.java |  2 -
 .../wicket/util/resource/ResourceUtils.java     |  2 +
 8 files changed, 72 insertions(+), 86 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/87735317/wicket-core/src/main/java/org/apache/wicket/core/util/resource/locator/ResourceStreamLocator.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/core/util/resource/locator/ResourceStreamLocator.java
 
b/wicket-core/src/main/java/org/apache/wicket/core/util/resource/locator/ResourceStreamLocator.java
index c555873..55a15c4 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/core/util/resource/locator/ResourceStreamLocator.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/core/util/resource/locator/ResourceStreamLocator.java
@@ -197,7 +197,17 @@ public class ResourceStreamLocator implements 
IResourceStreamLocator
                                // it could be an attack, so ignore it and 
pretend there are no resources
                                return new EmptyResourceNameIterator();
                        }
-                       extensions = Collections.singleton(realExtension);
+
+                       // add a minimized file to the resource lookup if 
necessary
+                       if (Application.exists() &&
+                               
Application.get().getResourceSettings().getUseMinifiedResources())
+                       {
+                               extensions = Arrays.asList("min." + 
realExtension, realExtension);
+                       }
+                       else
+                       {
+                               extensions = 
Collections.singleton(realExtension);
+                       }
                }
                else
                {
@@ -209,7 +219,24 @@ public class ResourceStreamLocator implements 
IResourceStreamLocator
                        else
                        {
                                String[] commaSeparated = 
Strings.split(extension, ',');
-                               extensions = Arrays.asList(commaSeparated);
+                               List<String> nonMinifiedExtensions = 
Arrays.asList(commaSeparated);
+
+                               // add a minimized file to the resource lookup 
if necessary
+                               if (Application.exists() &&
+                                       
Application.get().getResourceSettings().getUseMinifiedResources())
+                               {
+                                       ArrayList<String> minifiedExtensions = 
new ArrayList<>();
+                                       for (String nonMinifiedExtension : 
nonMinifiedExtensions)
+                                       {
+                                               minifiedExtensions.add("min." + 
nonMinifiedExtension);
+                                               
minifiedExtensions.add(nonMinifiedExtension);
+                                       }
+                                       extensions = minifiedExtensions;
+                               }
+                               else
+                               {
+                                       extensions = nonMinifiedExtensions;
+                               }
                        }
                }
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/87735317/wicket-core/src/main/java/org/apache/wicket/request/resource/CssPackageResource.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/request/resource/CssPackageResource.java
 
b/wicket-core/src/main/java/org/apache/wicket/request/resource/CssPackageResource.java
index 356ee59..fd48eb8 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/request/resource/CssPackageResource.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/request/resource/CssPackageResource.java
@@ -16,6 +16,8 @@
  */
 package org.apache.wicket.request.resource;
 
+import static 
org.apache.wicket.util.resource.ResourceUtils.MIN_POSTFIX_DEFAULT_AS_EXTENSION;
+
 import java.util.Locale;
 
 import org.apache.wicket.Application;
@@ -39,10 +41,16 @@ public class CssPackageResource extends PackageResource
         * Construct.
         * 
         * @param scope
+        *            This argument will be used to get the class loader for 
loading the package
+        *            resource, and to determine what package it is in
         * @param name
+        *            The relative path to the resource
         * @param locale
+        *            The locale of the resource
         * @param style
+        *            The style of the resource
         * @param variation
+        *            The component's variation (of the style)
         */
        public CssPackageResource(Class<?> scope, String name, Locale locale, 
String style,
                String variation)
@@ -51,8 +59,9 @@ public class CssPackageResource extends PackageResource
 
                this.name = name;
 
-               // CSS resources can be compressed if there is configured 
ICssCompressor
-               setCompress(true);
+               // CSS resources can be compressed if there is configured 
ICssCompressor, and the
+               // resource isn't already minified (the file already has .min. 
in its name).
+               setCompress(!name.contains(MIN_POSTFIX_DEFAULT_AS_EXTENSION));
        }
 
        @Override

http://git-wip-us.apache.org/repos/asf/wicket/blob/87735317/wicket-core/src/main/java/org/apache/wicket/request/resource/JavaScriptPackageResource.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/request/resource/JavaScriptPackageResource.java
 
b/wicket-core/src/main/java/org/apache/wicket/request/resource/JavaScriptPackageResource.java
index b2577ab..0692555 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/request/resource/JavaScriptPackageResource.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/request/resource/JavaScriptPackageResource.java
@@ -16,11 +16,14 @@
  */
 package org.apache.wicket.request.resource;
 
+import static 
org.apache.wicket.util.resource.ResourceUtils.MIN_POSTFIX_DEFAULT_AS_EXTENSION;
+
 import java.util.Locale;
 
 import org.apache.wicket.Application;
 import org.apache.wicket.javascript.IJavaScriptCompressor;
 import org.apache.wicket.resource.IScopeAwareTextResourceProcessor;
+import org.apache.wicket.util.resource.ResourceUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -37,6 +40,18 @@ public class JavaScriptPackageResource extends 
PackageResource
 
        /**
         * Construct.
+        * 
+        * @param scope
+        *            This argument will be used to get the class loader for 
loading the package
+        *            resource, and to determine what package it is in
+        * @param name
+        *            The relative path to the resource
+        * @param locale
+        *            The locale of the resource
+        * @param style
+        *            The style of the resource
+        * @param variation
+        *            The component's variation (of the style)
         */
        public JavaScriptPackageResource(Class<?> scope, String name, Locale 
locale, String style,
                String variation)
@@ -45,8 +60,9 @@ public class JavaScriptPackageResource extends PackageResource
 
                this.name = name;
 
-               // JS resources can be compressed if there is configured 
IJavaScriptCompressor
-               setCompress(true);
+               // JS resources can be compressed if there is configured 
IJavaScriptCompressor, and the
+               // resource isn't already minified (the file already has .min. 
in its name).
+               setCompress(!name.contains(MIN_POSTFIX_DEFAULT_AS_EXTENSION));
        }
 
        @Override

http://git-wip-us.apache.org/repos/asf/wicket/blob/87735317/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResourceReference.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResourceReference.java
 
b/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResourceReference.java
index 8197ed6..40d7d0c 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResourceReference.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResourceReference.java
@@ -16,6 +16,8 @@
  */
 package org.apache.wicket.request.resource;
 
+import static 
org.apache.wicket.util.resource.ResourceUtils.MIN_POSTFIX_DEFAULT_AS_EXTENSION;
+
 import java.util.Locale;
 import java.util.concurrent.ConcurrentMap;
 
@@ -55,19 +57,6 @@ public class PackageResourceReference extends 
ResourceReference
        private boolean readBuffered = true;
 
        /**
-        * Cache for existence of minified version of the resource to avoid 
repetitive calls to
-        * 
org.apache.wicket.util.resource.locator.IResourceStreamLocator#locate() and
-        * #getMinifiedName().
-        */
-       private static final ConcurrentMap<PackageResourceReference, String> 
MINIFIED_NAMES_CACHE = Generics.newConcurrentHashMap();
-
-       /**
-        * A constant used to indicate that there is no minified version of the 
resource.
-        */
-       // WARNING: always compare by identity!
-       private static final String NO_MINIFIED_NAME = new String();
-
-       /**
         * Construct.
         * 
         * @param key
@@ -166,8 +155,8 @@ public class PackageResourceReference extends 
ResourceReference
         */
        protected final void removeCompressFlagIfUnnecessary(final 
PackageResource resource)
        {
-               String minifiedName = MINIFIED_NAMES_CACHE.get(this);
-               if (minifiedName != null && minifiedName != NO_MINIFIED_NAME)
+               String minifiedName = getName();
+               if (minifiedName != null && 
minifiedName.contains(MIN_POSTFIX_DEFAULT_AS_EXTENSION))
                {
                        resource.setCompress(false);
                }
@@ -248,38 +237,6 @@ public class PackageResourceReference extends 
ResourceReference
        }
 
        /**
-        * Initializes the cache for the existence of the minified resource.
-        * 
-        * @return the name of the minified resource or the special constant 
{@link #NO_MINIFIED_NAME}
-        *         if there is no minified version
-        */
-       private String internalGetMinifiedName()
-       {
-               String minifiedName = MINIFIED_NAMES_CACHE.get(this);
-               if (minifiedName != null)
-               {
-                       return minifiedName;
-               }
-
-               String name = getMinifiedName();
-               IResourceStreamLocator locator = Application.get()
-                       .getResourceSettings()
-                       .getResourceStreamLocator();
-               String absolutePath = Packages.absolutePath(getScope(), name);
-               IResourceStream stream = locator.locate(getScope(), 
absolutePath, getStyle(),
-                       getVariation(), getLocale(), null, true);
-
-               minifiedName = stream != null ? name : NO_MINIFIED_NAME;
-               MINIFIED_NAMES_CACHE.put(this, minifiedName);
-               if (minifiedName == NO_MINIFIED_NAME && log.isDebugEnabled())
-               {
-                       log.debug("No minified version of '" + super.getName() +
-                               "' found, expected a file with the name '" + 
name + "', using full version");
-               }
-               return minifiedName;
-       }
-
-       /**
         * @return How the minified file should be named.
         */
        protected String getMinifiedName()
@@ -288,34 +245,6 @@ public class PackageResourceReference extends 
ResourceReference
                return ResourceUtils.getMinifiedName(name, 
ResourceUtils.MIN_POSTFIX_DEFAULT);
        }
 
-       /**
-        * Returns the name of the file: minified or full version. This method 
is called in a
-        * multithreaded context, so it has to be thread safe.
-        *
-        * @see org.apache.wicket.request.resource.ResourceReference#getName()
-        */
-       @Override
-       public String getName()
-       {
-               String name = null;
-
-               if (Application.exists() &&
-                       
Application.get().getResourceSettings().getUseMinifiedResources())
-               {
-                       String minifiedName = internalGetMinifiedName();
-                       if (minifiedName != NO_MINIFIED_NAME)
-                       {
-                               name = minifiedName;
-                       }
-               }
-
-               if (name == null)
-               {
-                       name = super.getName();
-               }
-               return name;
-       }
-
        @Override
        public ResourceReference.UrlAttributes getUrlAttributes()
        {

http://git-wip-us.apache.org/repos/asf/wicket/blob/87735317/wicket-core/src/test/java/org/apache/wicket/request/resource/MinifiedAwareResourceReferenceTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/request/resource/MinifiedAwareResourceReferenceTest.java
 
b/wicket-core/src/test/java/org/apache/wicket/request/resource/MinifiedAwareResourceReferenceTest.java
index 73aee8d..653adb8 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/request/resource/MinifiedAwareResourceReferenceTest.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/request/resource/MinifiedAwareResourceReferenceTest.java
@@ -16,6 +16,10 @@
  */
 package org.apache.wicket.request.resource;
 
+import java.util.Locale;
+import java.util.Map;
+import java.util.Properties;
+
 import org.apache.wicket.Application;
 import org.apache.wicket.core.util.resource.locator.ResourceStreamLocator;
 import org.apache.wicket.request.resource.IResource.Attributes;
@@ -52,7 +56,7 @@ public class MinifiedAwareResourceReferenceTest extends 
WicketTestCase
                
Application.get().getResourceSettings().setUseMinifiedResources(true);
                ResourceReference reference = new JavaScriptResourceReference(
                        MinifiedAwareResourceReferenceTest.class, "b.js");
-               assertEquals("b.min.js", reference.getName());
+               assertEquals("b.js", reference.getName());
                String fileContent = renderResource(reference);
                assertEquals("// b.min.js", fileContent.trim());
        }
@@ -74,7 +78,8 @@ public class MinifiedAwareResourceReferenceTest extends 
WicketTestCase
                String fileContent = renderResource(reference);
                assertEquals("//a", fileContent);
 
-               assertEquals(1, locator.minLocated);
+               // this will try 3 lookups for minified resources: en_US.min, 
en.min and .min 
+               assertEquals(3, locator.minLocated);
        }
 
        private class MinCountingResourceStreamLocator extends 
ResourceStreamLocator

http://git-wip-us.apache.org/repos/asf/wicket/blob/87735317/wicket-core/src/test/java/org/apache/wicket/request/resource/PackageResourceReferenceTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/request/resource/PackageResourceReferenceTest.java
 
b/wicket-core/src/test/java/org/apache/wicket/request/resource/PackageResourceReferenceTest.java
index 81d7cde..df70f16 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/request/resource/PackageResourceReferenceTest.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/request/resource/PackageResourceReferenceTest.java
@@ -198,7 +198,7 @@ public class PackageResourceReferenceTest extends 
WicketTestCase
         * see WICKET-5251 : Proper detection of already minified resources
         */
        @Test
-       public void testMinifiedNameDetectMinInName() throws Exception
+       public void testMinifiedNameDetectMinInName()
        {
                final PackageResourceReference html5minjs = new 
PackageResourceReference("html5.min.js");
                Assert.assertEquals("html5.min.js", 
html5minjs.getMinifiedName());

http://git-wip-us.apache.org/repos/asf/wicket/blob/87735317/wicket-core/src/test/java/org/apache/wicket/request/resource/ResourceReferenceLocatingTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/request/resource/ResourceReferenceLocatingTest.java
 
b/wicket-core/src/test/java/org/apache/wicket/request/resource/ResourceReferenceLocatingTest.java
index 3be3f60..b2eca5f 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/request/resource/ResourceReferenceLocatingTest.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/request/resource/ResourceReferenceLocatingTest.java
@@ -27,7 +27,6 @@ import java.util.Locale;
 
 import org.apache.wicket.util.io.Streams;
 import org.apache.wicket.util.tester.WicketTestCase;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -38,7 +37,6 @@ import org.junit.runners.Parameterized.Parameters;
  */
 @SuppressWarnings("javadoc")
 @RunWith(Parameterized.class)
-@Ignore("WICKET-5967 - Unable to load i18n minified js")
 public class ResourceReferenceLocatingTest extends WicketTestCase
 {
        /** Loads the test cases from a spread sheet in semi-colon separated 
format. */

http://git-wip-us.apache.org/repos/asf/wicket/blob/87735317/wicket-util/src/main/java/org/apache/wicket/util/resource/ResourceUtils.java
----------------------------------------------------------------------
diff --git 
a/wicket-util/src/main/java/org/apache/wicket/util/resource/ResourceUtils.java 
b/wicket-util/src/main/java/org/apache/wicket/util/resource/ResourceUtils.java
index ac1d025..868b727 100644
--- 
a/wicket-util/src/main/java/org/apache/wicket/util/resource/ResourceUtils.java
+++ 
b/wicket-util/src/main/java/org/apache/wicket/util/resource/ResourceUtils.java
@@ -33,6 +33,8 @@ public class ResourceUtils
 {
        /** The default postfix for minified names (ex: /css/mystyle.min.css) 
**/
        public static final String MIN_POSTFIX_DEFAULT = "min";
+       /** The default postfix for minified names (ex: /css/mystyle.min.css) 
**/
+       public static final String MIN_POSTFIX_DEFAULT_AS_EXTENSION = ".min.";
        /** Regular expression patter to extract the locale from the filename 
(ex: de_DE) **/
        private static final Pattern LOCALE_MIN_PATTERN = Pattern
                .compile("_([a-z]{2})(_([A-Z]{2})(_([^_\\.]+))?)?(\\.min)?$");

Reply via email to