Repository: wicket Updated Branches: refs/heads/wicket-6.x c41701506 -> aa1a0356a
WICKET-5780 Add a resource reference for ContextRelativeResource Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/aa1a0356 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/aa1a0356 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/aa1a0356 Branch: refs/heads/wicket-6.x Commit: aa1a0356a79d9c35f68f95c84165e602b5aae2fb Parents: c417015 Author: Andrea Del Bene <[email protected]> Authored: Thu Dec 4 17:38:39 2014 +0100 Committer: Andrea Del Bene <[email protected]> Committed: Thu Dec 4 20:03:33 2014 +0100 ---------------------------------------------------------------------- .../ContextRelativeResourceReference.java | 173 +++++++++++++++++++ .../resource/PackageResourceReference.java | 22 +-- .../ContextRelativeResourceReferenceTest.java | 85 +++++++++ .../wicket/util/resource/ResourceUtils.java | 37 +++- 4 files changed, 294 insertions(+), 23 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/aa1a0356/wicket-core/src/main/java/org/apache/wicket/request/resource/ContextRelativeResourceReference.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/ContextRelativeResourceReference.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/ContextRelativeResourceReference.java new file mode 100644 index 0000000..4d7b81f --- /dev/null +++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/ContextRelativeResourceReference.java @@ -0,0 +1,173 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket.request.resource; + +import org.apache.wicket.Application; +import org.apache.wicket.util.lang.Args; +import org.apache.wicket.util.resource.ResourceUtils; + +/** + * This is a ResourceReference to handle context-relative resources such as js, css and + * picture files placed in a folder on the context root (ex: '/css/coolTheme.css'). + * The class has a flag (see {@link #isMinifyIt()}) to decide if referenced resource can be + * minified (ex: '/css/coolTheme.min.css') or not. + * + * @author Andrea Del Bene + */ +public class ContextRelativeResourceReference extends ResourceReference +{ + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 1L; + + /** Says if the resource name can be minified or not. */ + private final boolean minifyIt; + + /** The minfied postfix. */ + private final String minPostfix; + + /** The context relative resource. */ + private final ContextRelativeResource contextRelativeResource; + + /** + * Instantiates a new context relative resource reference for the given name. The resource + * will be minified in DEPLOYMENT mode and "min" will be used as postfix. + * + * @param name + * the resource name + */ + public ContextRelativeResourceReference(final String name) + { + this(name, ResourceUtils.MIN_POSTFIX_DEFAULT, true); + } + + + /** + * Instantiates a new context relative resource reference for the given name. + * Parameter {@code minifyIt} says if the resource can be minified (true) or not (false). + * + * @param name + * the resource name + * @param minifyIt + * says if the resource name can be minified or not + */ + public ContextRelativeResourceReference(final String name, final boolean minifyIt) + { + this(name, ResourceUtils.MIN_POSTFIX_DEFAULT, minifyIt); + } + + /** + * Instantiates a new context relative resource reference for the given name. We can + * specify which postfix we want to use for minification with parameter @code minPostfix} + * + * @param name + * the resource name + * @param minPostfix + * the minfied postfix + */ + public ContextRelativeResourceReference(final String name, final String minPostfix) + { + this(name, minPostfix, true); + } + + /** + * Instantiates a new context relative resource reference for the given name. We can + * specify which postfix we want to use for minification with parameter @code minPostfix} + * while parameter {@code minifyIt} says if the resource can be minified (true) or not (false). + * @param name + * the resource name + * @param minPostfix + * the minfied postfix + * @param minifyIt + * says if the resource name can be minified or not + */ + public ContextRelativeResourceReference(final String name, final String minPostfix, final boolean minifyIt) + { + super(name); + + Args.notNull(minPostfix, "minPostfix"); + + this.minPostfix = minPostfix; + this.minifyIt = minifyIt; + this.contextRelativeResource = buildContextRelativeResource(name, minPostfix); + } + + /** + * Build the context-relative resource for this resource reference. + * + * @param name + * the resource name + * @param minPostfix + * the postfix to use to minify the resource name (typically "min") + * @return the context-relative resource + */ + protected ContextRelativeResource buildContextRelativeResource(final String name, final String minPostfix) + { + String minifiedName = name; + + if (canBeMinified()) + { + minifiedName = ResourceUtils.getMinifiedName(name, minPostfix); + } + + return new ContextRelativeResource(minifiedName); + } + + /** + * Says if the referenced resource can be minified. It returns {@code true} if + * both flag {@link #minifyIt} and application's resource settings method + * {@link org.apache.wicket.settings.ResourceSettings#getUseMinifiedResources()}} + * are true. + * + * @return {@code true} if resource can be minified, {@code false} otherwise + */ + protected boolean canBeMinified() + { + return minifyIt && Application.exists() + && Application.get().getResourceSettings().getUseMinifiedResources(); + } + + /* (non-Javadoc) + * @see org.apache.wicket.request.resource.ResourceReference#getResource() + */ + @Override + public final ContextRelativeResource getResource() + { + return contextRelativeResource; + } + + /** + * Returns the flag that says if the resource can be minified (true) or not (false). + * + * @return true, if resource can be minified + */ + public final boolean isMinifyIt() + { + return minifyIt; + } + + + /** + * Gets the minified postfix we use for this resource. + * + * @return the minified postfix + */ + public final String getMinPostfix() + { + return minPostfix; + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/aa1a0356/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 1c874ad..749769e 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 @@ -21,10 +21,11 @@ import java.util.concurrent.ConcurrentMap; import org.apache.wicket.Application; import org.apache.wicket.Session; +import org.apache.wicket.core.util.resource.locator.IResourceStreamLocator; import org.apache.wicket.util.lang.Generics; import org.apache.wicket.util.lang.Packages; import org.apache.wicket.util.resource.IResourceStream; -import org.apache.wicket.core.util.resource.locator.IResourceStreamLocator; +import org.apache.wicket.util.resource.ResourceUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -216,24 +217,7 @@ public class PackageResourceReference extends ResourceReference protected String getMinifiedName() { String name = super.getName(); - String minifiedName; - int idxOfExtension = name.lastIndexOf('.'); - if (idxOfExtension > -1) - { - String extension = name.substring(idxOfExtension); - final String baseName = name.substring(0, name.length() - extension.length() + 1); - if (!".min".equals(extension) && !baseName.endsWith(".min.")) - { - minifiedName = baseName + "min" + extension; - } else - { - minifiedName = name; - } - } else - { - minifiedName = name + ".min"; - } - return minifiedName; + return ResourceUtils.getMinifiedName(name, ResourceUtils.MIN_POSTFIX_DEFAULT); } /** http://git-wip-us.apache.org/repos/asf/wicket/blob/aa1a0356/wicket-core/src/test/java/org/apache/wicket/request/resource/ContextRelativeResourceReferenceTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/ContextRelativeResourceReferenceTest.java b/wicket-core/src/test/java/org/apache/wicket/request/resource/ContextRelativeResourceReferenceTest.java new file mode 100644 index 0000000..80c31bd --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/request/resource/ContextRelativeResourceReferenceTest.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket.request.resource; + +import org.apache.wicket.mock.MockApplication; +import org.apache.wicket.util.tester.WicketTester; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + + +public class ContextRelativeResourceReferenceTest +{ + private static WicketTester tester; + + static final String RESOURCE_NAME = "/foo/baar/myLibrary"; + static final String ALREADY_MINIFIED = RESOURCE_NAME + ".min.js"; + static final String TO_BE_MINIFIED = RESOURCE_NAME + ".js"; + static final String CUSTOM_SUFFIX = "compress"; + + @BeforeClass + static public void setUp() + { + MockApplication application = new MockApplication() + { + @Override + protected void init() + { + super.init(); + getResourceSettings().setUseMinifiedResources(true); + } + }; + + tester = new WicketTester(application); + } + + + @Test + public void testMinifyResource() throws Exception + { + ContextRelativeResourceReference resourceReference = new ContextRelativeResourceReference(TO_BE_MINIFIED); + Assert.assertTrue(testResourceKey(resourceReference, ALREADY_MINIFIED)); + } + + @Test + public void testDontMinifyResource() throws Exception + { + ContextRelativeResourceReference resourceReference = new ContextRelativeResourceReference(ALREADY_MINIFIED, false); + Assert.assertTrue(testResourceKey(resourceReference, ALREADY_MINIFIED)); + + resourceReference = new ContextRelativeResourceReference(TO_BE_MINIFIED, false); + Assert.assertTrue(testResourceKey(resourceReference, TO_BE_MINIFIED)); + + } + + @Test + public void testCustomSuffix() throws Exception + { + ContextRelativeResourceReference resourceReference = new ContextRelativeResourceReference(TO_BE_MINIFIED, CUSTOM_SUFFIX); + Assert.assertTrue(testResourceKey(resourceReference, RESOURCE_NAME + "." + CUSTOM_SUFFIX + ".js")); + } + + private boolean testResourceKey(ContextRelativeResourceReference resourceReference, String expectedName) + { + ContextRelativeResource resource = resourceReference.getResource(); + String resourceKey = resource.getCacheKey().toString(); + + return resourceKey.endsWith(expectedName); + } + +} http://git-wip-us.apache.org/repos/asf/wicket/blob/aa1a0356/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 c62dfbd..1dde2f1 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 @@ -31,6 +31,8 @@ import org.apache.wicket.util.string.Strings; */ public class ResourceUtils { + public static final String MIN_POSTFIX_DEFAULT = "min"; + private static final Pattern LOCALE_PATTERN = Pattern.compile("_([a-z]{2})(_([A-Z]{2})(_([^_]+))?)?$"); private final static Set<String> isoCountries = new ConcurrentHashSet<String>( @@ -38,14 +40,41 @@ public class ResourceUtils private final static Set<String> isoLanguages = new ConcurrentHashSet<String>( Arrays.asList(Locale.getISOLanguages())); - + /** - * Construct. + * Return the minified version for a given resource name. + * For example '/css/coolTheme.css' becomes '/css/coolTheme.min.css' + * + * @param name + * The original resource name + * @param minPostfix + * The postfix to use for minified name + * @return The minified resource name */ - private ResourceUtils() + public static String getMinifiedName(String name, String minPostfix) { + String minifiedName; + int idxOfExtension = name.lastIndexOf('.'); + final String dottedPostfix = "." + minPostfix; + + if (idxOfExtension > -1) + { + String extension = name.substring(idxOfExtension); + final String baseName = name.substring(0, name.length() - extension.length() + 1); + if (!dottedPostfix.equals(extension) && !baseName.endsWith(dottedPostfix + ".")) + { + minifiedName = baseName + minPostfix + extension; + } else + { + minifiedName = name; + } + } else + { + minifiedName = name + dottedPostfix; + } + return minifiedName; } - + /** * Extract the locale from the filename *
