Repository: wicket Updated Branches: refs/heads/WICKET-5906-7.x [created] 830794f88
WICKET-5906 Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/79a3d50b Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/79a3d50b Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/79a3d50b Branch: refs/heads/WICKET-5906-7.x Commit: 79a3d50be3924a33d34e034fd2f8eab7e54c75fb Parents: 3dd37b3 Author: Andrea Del Bene <â[email protected]â> Authored: Wed Jun 3 09:54:22 2015 +0200 Committer: Andrea Del Bene <â[email protected]â> Committed: Wed Jun 3 09:54:22 2015 +0200 ---------------------------------------------------------------------- .../mapper/AbstractResourceReferenceMapper.java | 156 ------------------- .../mapper/BasicResourceReferenceMapper.java | 6 +- .../core/request/mapper/ResourceMapper.java | 4 +- .../resource/PackageResourceReference.java | 22 ++- .../apache/wicket/resource/ResourceUtil.java | 148 +++++++++++++++++- .../AbstractResourceReferenceMapperOwnTest.java | 5 +- .../org/apache/wicket/util/lang/Objects.java | 5 + .../org/apache/wicket/util/string/Strings.java | 12 ++ 8 files changed, 189 insertions(+), 169 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/79a3d50b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractResourceReferenceMapper.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractResourceReferenceMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractResourceReferenceMapper.java index f95ca9e..7dea46e 100644 --- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractResourceReferenceMapper.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractResourceReferenceMapper.java @@ -16,12 +16,8 @@ */ package org.apache.wicket.core.request.mapper; -import java.util.Locale; - import org.apache.wicket.request.Url; import org.apache.wicket.request.resource.ResourceReference; -import org.apache.wicket.util.lang.Args; -import org.apache.wicket.util.string.Strings; /** * Base class for encoding and decoding {@link ResourceReference}s @@ -31,158 +27,6 @@ import org.apache.wicket.util.string.Strings; public abstract class AbstractResourceReferenceMapper extends AbstractComponentMapper { /** - * Escapes any occurrences of <em>-</em> character in the style and variation - * attributes with <em>~</em>. Any occurrence of <em>~</em> is encoded as <em>~~</em>. - * - * @param attribute - * the attribute to escape - * @return the attribute with escaped separator character - */ - public static CharSequence escapeAttributesSeparator(String attribute) - { - CharSequence tmp = Strings.replaceAll(attribute, "~", "~~"); - return Strings.replaceAll(tmp, "-", "~"); - } - - /** - * Reverts the escaping applied by {@linkplain #escapeAttributesSeparator(String)} - unescapes - * occurrences of <em>~</em> character in the style and variation attributes with <em>-</em>. - * - * @param attribute - * the attribute to unescape - * @return the attribute with escaped separator character - */ - public static String unescapeAttributesSeparator(String attribute) - { - String tmp = attribute.replaceAll("(\\w)~(\\w)", "$1-$2"); - return Strings.replaceAll(tmp, "~~", "~").toString(); - } - - protected final String encodeResourceReferenceAttributes(ResourceReference.UrlAttributes attributes) - { - if (attributes == null || - (attributes.getLocale() == null && attributes.getStyle() == null && attributes.getVariation() == null)) - { - return null; - } - else - { - StringBuilder res = new StringBuilder(32); - if (attributes.getLocale() != null) - { - res.append(attributes.getLocale()); - } - boolean styleEmpty = Strings.isEmpty(attributes.getStyle()); - if (!styleEmpty) - { - res.append('-'); - res.append(escapeAttributesSeparator(attributes.getStyle())); - } - if (!Strings.isEmpty(attributes.getVariation())) - { - if (styleEmpty) - { - res.append("--"); - } - else - { - res.append('-'); - } - res.append(escapeAttributesSeparator(attributes.getVariation())); - } - return res.toString(); - } - } - - private static String nonEmpty(String s) - { - if (Strings.isEmpty(s)) - { - return null; - } - else - { - return s; - } - } - - protected final ResourceReference.UrlAttributes decodeResourceReferenceAttributes(String attributes) - { - Locale locale = null; - String style = null; - String variation = null; - - if (Strings.isEmpty(attributes) == false) - { - String split[] = Strings.split(attributes, '-'); - locale = parseLocale(split[0]); - if (split.length == 2) - { - style = nonEmpty(unescapeAttributesSeparator(split[1])); - } - else if (split.length == 3) - { - style = nonEmpty(unescapeAttributesSeparator(split[1])); - variation = nonEmpty(unescapeAttributesSeparator(split[2])); - } - } - return new ResourceReference.UrlAttributes(locale, style, variation); - } - - private static Locale parseLocale(String locale) - { - if (Strings.isEmpty(locale)) - { - return null; - } - else - { - String parts[] = locale.toLowerCase().split("_", 3); - if (parts.length == 1) - { - return new Locale(parts[0]); - } - else if (parts.length == 2) - { - return new Locale(parts[0], parts[1]); - } - else if (parts.length == 3) - { - return new Locale(parts[0], parts[1], parts[2]); - } - else - { - return null; - } - } - } - - protected void encodeResourceReferenceAttributes(Url url, ResourceReference reference) - { - String encoded = encodeResourceReferenceAttributes(reference.getUrlAttributes()); - if (!Strings.isEmpty(encoded)) - { - url.getQueryParameters().add(new Url.QueryParameter(encoded, "")); - } - } - - protected ResourceReference.UrlAttributes getResourceReferenceAttributes(Url url) - { - Args.notNull(url, "url"); - - if (url.getQueryParameters().size() > 0) - { - Url.QueryParameter param = url.getQueryParameters().get(0); - if (Strings.isEmpty(param.getValue())) - { - return decodeResourceReferenceAttributes(param.getName()); - } - } - return new ResourceReference.UrlAttributes(null, null, null); - } - - - /** * {@inheritDoc} * * Remove the first parameter because it brings meta information like locale http://git-wip-us.apache.org/repos/asf/wicket/blob/79a3d50b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BasicResourceReferenceMapper.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BasicResourceReferenceMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BasicResourceReferenceMapper.java index e7d14b7..6438f1e 100755 --- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BasicResourceReferenceMapper.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BasicResourceReferenceMapper.java @@ -33,6 +33,7 @@ import org.apache.wicket.request.resource.ResourceReferenceRegistry; import org.apache.wicket.request.resource.caching.IResourceCachingStrategy; import org.apache.wicket.request.resource.caching.IStaticCacheableResource; import org.apache.wicket.request.resource.caching.ResourceUrl; +import org.apache.wicket.resource.ResourceUtil; import org.apache.wicket.resource.bundles.ResourceBundleReference; import org.apache.wicket.util.IProvider; import org.apache.wicket.util.lang.Args; @@ -124,7 +125,7 @@ public class BasicResourceReferenceMapper extends AbstractResourceReferenceMappe name.append(segment); } - ResourceReference.UrlAttributes attributes = getResourceReferenceAttributes(url); + ResourceReference.UrlAttributes attributes = ResourceUtil.decodeResourceReferenceAttributes(url); Class<?> scope = resolveClass(className); @@ -212,7 +213,8 @@ public class BasicResourceReferenceMapper extends AbstractResourceReferenceMappe // need to remove indexed parameters otherwise the URL won't be able to decode parameters.clearIndexed(); } - encodeResourceReferenceAttributes(url, reference); + + ResourceUtil.encodeResourceReferenceAttributes(url, reference); StringTokenizer tokens = new StringTokenizer(reference.getName(), "/"); http://git-wip-us.apache.org/repos/asf/wicket/blob/79a3d50b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/ResourceMapper.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/ResourceMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/ResourceMapper.java index cc6f6d3..eb2278e 100644 --- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/ResourceMapper.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/ResourceMapper.java @@ -37,6 +37,7 @@ import org.apache.wicket.request.resource.ResourceReference; import org.apache.wicket.request.resource.caching.IResourceCachingStrategy; import org.apache.wicket.request.resource.caching.IStaticCacheableResource; import org.apache.wicket.request.resource.caching.ResourceUrl; +import org.apache.wicket.resource.ResourceUtil; import org.apache.wicket.util.lang.Args; import org.apache.wicket.util.string.Strings; @@ -201,7 +202,8 @@ public class ResourceMapper extends AbstractMapper implements IRequestMapper // add caching information addCachingDecoration(url, parameters); - + + ResourceUtil.encodeResourceReferenceAttributes(url, resourceReference); // create url return encodePageParameters(url, parameters, parametersEncoder); } http://git-wip-us.apache.org/repos/asf/wicket/blob/79a3d50b/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 4bd20f0..c7f8da1 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 @@ -22,7 +22,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.request.Url; +import org.apache.wicket.request.cycle.RequestCycle; +import org.apache.wicket.resource.ResourceUtil; import org.apache.wicket.util.lang.Generics; +import org.apache.wicket.util.lang.Objects; import org.apache.wicket.util.lang.Packages; import org.apache.wicket.util.resource.IResourceStream; import org.apache.wicket.util.resource.ResourceUtils; @@ -119,21 +123,27 @@ public class PackageResourceReference extends ResourceReference final String extension = getExtension(); final PackageResource resource; + + final Url url = RequestCycle.get().getRequest().getUrl(); + final UrlAttributes urlAttributes = ResourceUtil.decodeResourceReferenceAttributes(url); if (CSS_EXTENSION.equals(extension)) { - resource = new CssPackageResource(getScope(), getName(), getLocale(), getStyle(), - getVariation()).readBuffered(readBuffered); + resource = new CssPackageResource(getScope(), getName(), Objects.defaultIfNull(getLocale(), urlAttributes.getLocale()), + Objects.defaultIfNull(getStyle(), urlAttributes.getStyle()), + Objects.defaultIfNull(getVariation(), urlAttributes.getVariation())).readBuffered(readBuffered); } else if (JAVASCRIPT_EXTENSION.equals(extension)) { - resource = new JavaScriptPackageResource(getScope(), getName(), getLocale(), - getStyle(), getVariation()).readBuffered(readBuffered); + resource = new JavaScriptPackageResource(getScope(), getName(), Objects.defaultIfNull(getLocale(), urlAttributes.getLocale()), + Objects.defaultIfNull(getStyle(), urlAttributes.getStyle()), + Objects.defaultIfNull(getVariation(), urlAttributes.getVariation())).readBuffered(readBuffered); } else { - resource = new PackageResource(getScope(), getName(), getLocale(), getStyle(), - getVariation()).readBuffered(readBuffered); + resource = new PackageResource(getScope(), getName(), Objects.defaultIfNull(getLocale(), urlAttributes.getLocale()), + Objects.defaultIfNull(getStyle(), urlAttributes.getStyle()), + Objects.defaultIfNull(getVariation(), urlAttributes.getVariation())).readBuffered(readBuffered); } removeCompressFlagIfUnnecessary(resource); http://git-wip-us.apache.org/repos/asf/wicket/blob/79a3d50b/wicket-core/src/main/java/org/apache/wicket/resource/ResourceUtil.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/resource/ResourceUtil.java b/wicket-core/src/main/java/org/apache/wicket/resource/ResourceUtil.java index 3f03207..b94ad25 100644 --- a/wicket-core/src/main/java/org/apache/wicket/resource/ResourceUtil.java +++ b/wicket-core/src/main/java/org/apache/wicket/resource/ResourceUtil.java @@ -19,11 +19,16 @@ package org.apache.wicket.resource; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; +import java.util.Locale; import org.apache.wicket.WicketRuntimeException; +import org.apache.wicket.request.Url; +import org.apache.wicket.request.resource.ResourceReference; import org.apache.wicket.util.io.IOUtils; +import org.apache.wicket.util.lang.Args; import org.apache.wicket.util.resource.IResourceStream; import org.apache.wicket.util.resource.ResourceStreamNotFoundException; +import org.apache.wicket.util.string.Strings; /** * Utilities for resources. @@ -33,9 +38,129 @@ import org.apache.wicket.util.resource.ResourceStreamNotFoundException; public class ResourceUtil { - private ResourceUtil() + public static ResourceReference.UrlAttributes decodeResourceReferenceAttributes(String attributes) { - // no-op + Locale locale = null; + String style = null; + String variation = null; + + if (Strings.isEmpty(attributes) == false) + { + String split[] = Strings.split(attributes, '-'); + locale = parseLocale(split[0]); + if (split.length == 2) + { + style = Strings.notEmpty(unescapeAttributesSeparator(split[1]), null); + } + else if (split.length == 3) + { + style = Strings.notEmpty(unescapeAttributesSeparator(split[1]), null); + variation = Strings.notEmpty(unescapeAttributesSeparator(split[2]), null); + } + } + return new ResourceReference.UrlAttributes(locale, style, variation); + } + + public static ResourceReference.UrlAttributes decodeResourceReferenceAttributes(Url url) + { + Args.notNull(url, "url"); + + if (url.getQueryParameters().size() > 0) + { + Url.QueryParameter param = url.getQueryParameters().get(0); + if (Strings.isEmpty(param.getValue())) + { + return decodeResourceReferenceAttributes(param.getName()); + } + } + return new ResourceReference.UrlAttributes(null, null, null); + } + + public static String encodeResourceReferenceAttributes(ResourceReference.UrlAttributes attributes) + { + if (attributes == null || + (attributes.getLocale() == null && attributes.getStyle() == null && attributes.getVariation() == null)) + { + return null; + } + else + { + StringBuilder res = new StringBuilder(32); + if (attributes.getLocale() != null) + { + res.append(attributes.getLocale()); + } + boolean styleEmpty = Strings.isEmpty(attributes.getStyle()); + if (!styleEmpty) + { + res.append('-'); + res.append(escapeAttributesSeparator(attributes.getStyle())); + } + if (!Strings.isEmpty(attributes.getVariation())) + { + if (styleEmpty) + { + res.append("--"); + } + else + { + res.append('-'); + } + res.append(escapeAttributesSeparator(attributes.getVariation())); + } + return res.toString(); + } + } + + public static void encodeResourceReferenceAttributes(Url url, ResourceReference reference) + { + String encoded = encodeResourceReferenceAttributes(reference.getUrlAttributes()); + if (!Strings.isEmpty(encoded)) + { + url.getQueryParameters().add(new Url.QueryParameter(encoded, "")); + } + } + + /** + * Escapes any occurrences of <em>-</em> character in the style and variation + * attributes with <em>~</em>. Any occurrence of <em>~</em> is encoded as <em>~~</em>. + * + * @param attribute + * the attribute to escape + * @return the attribute with escaped separator character + */ + public static CharSequence escapeAttributesSeparator(String attribute) + { + CharSequence tmp = Strings.replaceAll(attribute, "~", "~~"); + return Strings.replaceAll(tmp, "-", "~"); + } + + public static Locale parseLocale(String locale) + { + if (Strings.isEmpty(locale)) + { + return null; + } + else + { + String parts[] = locale.toLowerCase().split("_", 3); + if (parts.length == 1) + { + return new Locale(parts[0]); + } + else if (parts.length == 2) + { + return new Locale(parts[0], parts[1]); + } + else if (parts.length == 3) + { + return new Locale(parts[0], parts[1], parts[2]); + } + else + { + return null; + } + } } /** @@ -91,4 +216,23 @@ public class ResourceUtil throw new WicketRuntimeException("failed to locate stream from " + resourceStream, e); } } + + /** + * Reverts the escaping applied by {@linkplain #escapeAttributesSeparator(String)} - unescapes + * occurrences of <em>~</em> character in the style and variation attributes with <em>-</em>. + * + * @param attribute + * the attribute to unescape + * @return the attribute with escaped separator character + */ + public static String unescapeAttributesSeparator(String attribute) + { + String tmp = attribute.replaceAll("(\\w)~(\\w)", "$1-$2"); + return Strings.replaceAll(tmp, "~~", "~").toString(); + } + + private ResourceUtil() + { + // no-op + } } http://git-wip-us.apache.org/repos/asf/wicket/blob/79a3d50b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/AbstractResourceReferenceMapperOwnTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/AbstractResourceReferenceMapperOwnTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/AbstractResourceReferenceMapperOwnTest.java index 478fe19..1345687 100644 --- a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/AbstractResourceReferenceMapperOwnTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/AbstractResourceReferenceMapperOwnTest.java @@ -19,6 +19,7 @@ package org.apache.wicket.core.request.mapper; import org.apache.wicket.request.IRequestHandler; import org.apache.wicket.request.Request; import org.apache.wicket.request.Url; +import org.apache.wicket.resource.ResourceUtil; import org.junit.Assert; import org.junit.Test; @@ -31,7 +32,7 @@ public class AbstractResourceReferenceMapperOwnTest extends Assert public void testEscapeAttributesSeparator() throws Exception { AbstractResourceReferenceMapper mapper = new Mapper(); - CharSequence escaped = mapper.escapeAttributesSeparator("my-style~is~~cool"); + CharSequence escaped = ResourceUtil.escapeAttributesSeparator("my-style~is~~cool"); assertEquals("my~style~~is~~~~cool", escaped.toString()); } @@ -39,7 +40,7 @@ public class AbstractResourceReferenceMapperOwnTest extends Assert public void testUnescapeAttributesSeparator() throws Exception { AbstractResourceReferenceMapper mapper = new Mapper(); - CharSequence escaped = mapper.unescapeAttributesSeparator("my~style~~is~~~~cool"); + CharSequence escaped = ResourceUtil.unescapeAttributesSeparator("my~style~~is~~~~cool"); assertEquals("my-style~is~~cool", escaped.toString()); } http://git-wip-us.apache.org/repos/asf/wicket/blob/79a3d50b/wicket-util/src/main/java/org/apache/wicket/util/lang/Objects.java ---------------------------------------------------------------------- diff --git a/wicket-util/src/main/java/org/apache/wicket/util/lang/Objects.java b/wicket-util/src/main/java/org/apache/wicket/util/lang/Objects.java index 4757401..42b14c5 100755 --- a/wicket-util/src/main/java/org/apache/wicket/util/lang/Objects.java +++ b/wicket-util/src/main/java/org/apache/wicket/util/lang/Objects.java @@ -772,4 +772,9 @@ public final class Objects private Objects() { } + + public static <T> T defaultIfNull(T originalObj, T defaultObj) + { + return originalObj != null ? originalObj : defaultObj; + } } http://git-wip-us.apache.org/repos/asf/wicket/blob/79a3d50b/wicket-util/src/main/java/org/apache/wicket/util/string/Strings.java ---------------------------------------------------------------------- diff --git a/wicket-util/src/main/java/org/apache/wicket/util/string/Strings.java b/wicket-util/src/main/java/org/apache/wicket/util/string/Strings.java index 49119f7..a9a54b9 100755 --- a/wicket-util/src/main/java/org/apache/wicket/util/string/Strings.java +++ b/wicket-util/src/main/java/org/apache/wicket/util/string/Strings.java @@ -1562,4 +1562,16 @@ public final class Strings String.format("Cannot convert '%s' to enum constant of type '%s'.", value, enumClass), e); } } + + public static String notEmpty(String originalString, String normalizedValue) + { + if (isEmpty(originalString)) + { + return normalizedValue; + } + else + { + return originalString; + } + } }
