You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by ad...@apache.org on 2014/12/04 20:03:10 UTC

wicket git commit: WICKET-5780 Add a resource reference for ContextRelativeResource

Repository: wicket
Updated Branches:
  refs/heads/master f7fc5d095 -> f4b51cd57


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/f4b51cd5
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/f4b51cd5
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/f4b51cd5

Branch: refs/heads/master
Commit: f4b51cd577699b1a7d3f1463ce239386cfa68ce5
Parents: f7fc5d0
Author: Andrea Del Bene <ad...@apache.org>
Authored: Thu Dec 4 17:38:39 2014 +0100
Committer: Andrea Del Bene <ad...@apache.org>
Committed: Thu Dec 4 17:58:02 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/f4b51cd5/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/f4b51cd5/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/f4b51cd5/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/f4b51cd5/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 a51f359..5fd28dc 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 HashSet<>(
@@ -38,14 +40,41 @@ public class ResourceUtils
 
 	private final static Set<String> isoLanguages = new HashSet<>(
 		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
 	 * 


Re: wicket git commit: WICKET-5780 Add a resource reference for ContextRelativeResource

Posted by Martin Grigorov <mg...@apache.org>.
On Fri, Dec 5, 2014 at 11:56 AM, Andrea Del Bene <an...@gmail.com>
wrote:

> On 04/12/14 21:48, Martin Grigorov wrote:
>
>> On Thu, Dec 4, 2014 at 8:03 PM, <ad...@apache.org> wrote:
>>
>>  Repository: wicket
>>> Updated Branches:
>>>    refs/heads/master f7fc5d095 -> f4b51cd57
>>>
>>>
>>> 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/f4b51cd5
>>> Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/f4b51cd5
>>> Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/f4b51cd5
>>>
>>> Branch: refs/heads/master
>>> Commit: f4b51cd577699b1a7d3f1463ce239386cfa68ce5
>>> Parents: f7fc5d0
>>> Author: Andrea Del Bene <ad...@apache.org>
>>> Authored: Thu Dec 4 17:38:39 2014 +0100
>>> Committer: Andrea Del Bene <ad...@apache.org>
>>> Committed: Thu Dec 4 17:58:02 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/
>>> f4b51cd5/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);
>>>
>>>  What is the reason the resource has to be pre-built. A new instance
>> could
>> be instantiated on each request in #getReource() too.
>>
>>  Just for performance reasons. Do you think it's neglectable?


I think the performance shouldn't be a problem.


>
>  +       }
>>> +
>>> +       /**
>>> +        * 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)
>>>
>>>  Overrideable method called by the constructor. May lead to subtle bugs
>> ...
>>
>>  Ok, better make it final....
>
>  +       {
>>> +               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()
>>> +        */
>>>
>>>  This kind of javadoc is just noise. I'm trying to remove them from the
>> rest
>> of the code anyway.
>>
> Ok
>
>>
>>
>>  +       @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()
>>>
>>>  Why 'final' ?
>> This just reduces the flexibility.
>> And people complain about the overusa of 'final' in Wicket every second
>> day
>> ...
>>
>>  Ok.


Remove 'final' only if a new resource is constructed for every call to
#getResource().
Otherwise there is no need to remove the 'final'.


>
>  +       {
>>> +               return minifyIt;
>>> +       }
>>> +
>>> +
>>> +       /**
>>> +        * Gets the minified postfix we use for this resource.
>>> +        *
>>> +        * @return the minified postfix
>>> +        */
>>> +       public final String getMinPostfix()
>>>
>>>  final
>>
>>
>>  +       {
>>> +               return minPostfix;
>>> +       }
>>> +}
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/wicket/blob/
>>> f4b51cd5/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/
>>> f4b51cd5/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;
>>>
>>>  Why static ?
>> It begs for memory/thread local leaks.
>> Why not extending from WicketTestCase ?
>>
> Well, actually I don't need WicketTester for my tests, I just need to have
> a valid Application in the ThreadContext. I will remove static variable and
> if I don't find better solutions I will use the classic WicketTestCase.


>
>>  +
>>> +       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));
>>>
>>>  no tester.destroy() => thread local leak
>>
>>
>>  +       }
>>> +
>>> +       @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));
>>>
>>>  no tester.destroy() => thread local leak
>>
>>
>>  +
>>> +       }
>>> +
>>> +       @Test
>>> +       public void testCustomSuffix() throws Exception
>>> +       {
>>> +               ContextRelativeResourceReference resourceReference = new
>>> ContextRelativeResourceReference(TO_BE_MINIFIED, CUSTOM_SUFFIX);
>>> +               Assert.assertTrue(testResourceKey(resourceReference,
>>> RESOURCE_NAME + "." + CUSTOM_SUFFIX + ".js"));
>>>
>>>  no tester.destroy() => thread local leak
>>
>>
>>  +       }
>>> +
>>> +       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/
>>> f4b51cd5/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 a51f359..5fd28dc 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";
>>>
>>>  missing javadoc
>>
>>  ok
>
>> +
>>>          private static final Pattern LOCALE_PATTERN =
>>> Pattern.compile("_([a-z]{2})(_([A-Z]{2})(_([^_]+))?)?$");
>>>
>>>          private final static Set<String> isoCountries = new HashSet<>(
>>> @@ -38,14 +40,41 @@ public class ResourceUtils
>>>
>>>          private final static Set<String> isoLanguages = new HashSet<>(
>>>                  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()
>>>
>>>  Why did you remove the private constructor ?
>> Is this class supposed to be instantiated now ?
>>
> No no, it's not intended to be instantiated. I just realized now that this
> is a practice to prevent "static" classes from being instantiated. I will
> revert this change.
>
>
>>
>>  +       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
>>>           *
>>>
>>>
>>>
>
Thanks!

Re: wicket git commit: WICKET-5780 Add a resource reference for ContextRelativeResource

Posted by Andrea Del Bene <an...@gmail.com>.
On 04/12/14 21:48, Martin Grigorov wrote:
> On Thu, Dec 4, 2014 at 8:03 PM, <ad...@apache.org> wrote:
>
>> Repository: wicket
>> Updated Branches:
>>    refs/heads/master f7fc5d095 -> f4b51cd57
>>
>>
>> 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/f4b51cd5
>> Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/f4b51cd5
>> Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/f4b51cd5
>>
>> Branch: refs/heads/master
>> Commit: f4b51cd577699b1a7d3f1463ce239386cfa68ce5
>> Parents: f7fc5d0
>> Author: Andrea Del Bene <ad...@apache.org>
>> Authored: Thu Dec 4 17:38:39 2014 +0100
>> Committer: Andrea Del Bene <ad...@apache.org>
>> Committed: Thu Dec 4 17:58:02 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/f4b51cd5/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);
>>
> What is the reason the resource has to be pre-built. A new instance could
> be instantiated on each request in #getReource() too.
>
Just for performance reasons. Do you think it's neglectable?
>> +       }
>> +
>> +       /**
>> +        * 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)
>>
> Overrideable method called by the constructor. May lead to subtle bugs ...
>
Ok, better make it final....
>> +       {
>> +               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()
>> +        */
>>
> This kind of javadoc is just noise. I'm trying to remove them from the rest
> of the code anyway.
Ok
>
>
>> +       @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()
>>
> Why 'final' ?
> This just reduces the flexibility.
> And people complain about the overusa of 'final' in Wicket every second day
> ...
>
Ok.
>> +       {
>> +               return minifyIt;
>> +       }
>> +
>> +
>> +       /**
>> +        * Gets the minified postfix we use for this resource.
>> +        *
>> +        * @return the minified postfix
>> +        */
>> +       public final String getMinPostfix()
>>
> final
>
>
>> +       {
>> +               return minPostfix;
>> +       }
>> +}
>>
>>
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/f4b51cd5/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/f4b51cd5/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;
>>
> Why static ?
> It begs for memory/thread local leaks.
> Why not extending from WicketTestCase ?
Well, actually I don't need WicketTester for my tests, I just need to 
have a valid Application in the ThreadContext. I will remove static 
variable and if I don't find better solutions I will use the classic 
WicketTestCase.
>
>> +
>> +       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));
>>
> no tester.destroy() => thread local leak
>
>
>> +       }
>> +
>> +       @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));
>>
> no tester.destroy() => thread local leak
>
>
>> +
>> +       }
>> +
>> +       @Test
>> +       public void testCustomSuffix() throws Exception
>> +       {
>> +               ContextRelativeResourceReference resourceReference = new
>> ContextRelativeResourceReference(TO_BE_MINIFIED, CUSTOM_SUFFIX);
>> +               Assert.assertTrue(testResourceKey(resourceReference,
>> RESOURCE_NAME + "." + CUSTOM_SUFFIX + ".js"));
>>
> no tester.destroy() => thread local leak
>
>
>> +       }
>> +
>> +       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/f4b51cd5/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 a51f359..5fd28dc 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";
>>
> missing javadoc
>
ok
>> +
>>          private static final Pattern LOCALE_PATTERN =
>> Pattern.compile("_([a-z]{2})(_([A-Z]{2})(_([^_]+))?)?$");
>>
>>          private final static Set<String> isoCountries = new HashSet<>(
>> @@ -38,14 +40,41 @@ public class ResourceUtils
>>
>>          private final static Set<String> isoLanguages = new HashSet<>(
>>                  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()
>>
> Why did you remove the private constructor ?
> Is this class supposed to be instantiated now ?
No no, it's not intended to be instantiated. I just realized now that 
this is a practice to prevent "static" classes from being instantiated. 
I will revert this change.
>
>
>> +       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
>>           *
>>
>>


Re: wicket git commit: WICKET-5780 Add a resource reference for ContextRelativeResource

Posted by Martin Grigorov <mg...@apache.org>.
On Thu, Dec 4, 2014 at 8:03 PM, <ad...@apache.org> wrote:

> Repository: wicket
> Updated Branches:
>   refs/heads/master f7fc5d095 -> f4b51cd57
>
>
> 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/f4b51cd5
> Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/f4b51cd5
> Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/f4b51cd5
>
> Branch: refs/heads/master
> Commit: f4b51cd577699b1a7d3f1463ce239386cfa68ce5
> Parents: f7fc5d0
> Author: Andrea Del Bene <ad...@apache.org>
> Authored: Thu Dec 4 17:38:39 2014 +0100
> Committer: Andrea Del Bene <ad...@apache.org>
> Committed: Thu Dec 4 17:58:02 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/f4b51cd5/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);
>

What is the reason the resource has to be pre-built. A new instance could
be instantiated on each request in #getReource() too.


> +       }
> +
> +       /**
> +        * 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)
>

Overrideable method called by the constructor. May lead to subtle bugs ...


> +       {
> +               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()
> +        */
>

This kind of javadoc is just noise. I'm trying to remove them from the rest
of the code anyway.


> +       @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()
>

Why 'final' ?
This just reduces the flexibility.
And people complain about the overusa of 'final' in Wicket every second day
...


> +       {
> +               return minifyIt;
> +       }
> +
> +
> +       /**
> +        * Gets the minified postfix we use for this resource.
> +        *
> +        * @return the minified postfix
> +        */
> +       public final String getMinPostfix()
>

final


> +       {
> +               return minPostfix;
> +       }
> +}
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/f4b51cd5/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/f4b51cd5/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;
>

Why static ?
It begs for memory/thread local leaks.
Why not extending from WicketTestCase ?


> +
> +       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));
>

no tester.destroy() => thread local leak


> +       }
> +
> +       @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));
>

no tester.destroy() => thread local leak


> +
> +       }
> +
> +       @Test
> +       public void testCustomSuffix() throws Exception
> +       {
> +               ContextRelativeResourceReference resourceReference = new
> ContextRelativeResourceReference(TO_BE_MINIFIED, CUSTOM_SUFFIX);
> +               Assert.assertTrue(testResourceKey(resourceReference,
> RESOURCE_NAME + "." + CUSTOM_SUFFIX + ".js"));
>

no tester.destroy() => thread local leak


> +       }
> +
> +       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/f4b51cd5/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 a51f359..5fd28dc 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";
>

missing javadoc


> +
>         private static final Pattern LOCALE_PATTERN =
> Pattern.compile("_([a-z]{2})(_([A-Z]{2})(_([^_]+))?)?$");
>
>         private final static Set<String> isoCountries = new HashSet<>(
> @@ -38,14 +40,41 @@ public class ResourceUtils
>
>         private final static Set<String> isoLanguages = new HashSet<>(
>                 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()
>

Why did you remove the private constructor ?
Is this class supposed to be instantiated now ?


> +       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
>          *
>
>