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)?$");
