WICKET-6586 Broken JavaScript due to fix charsetName in JavaScriptPackageResource
Introduce PackageResource#getProcessingEncoding() that could be overridden by the application to use a custom encoding to read a resource from the class path. Move the compressing logic from Css/JavaScript-PackageResource to PackageResource class to DRY it. Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/072b2fc7 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/072b2fc7 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/072b2fc7 Branch: refs/heads/WICKET-6563 Commit: 072b2fc7fd521ec07e40fc5af16b75db47694b33 Parents: 6ee5313 Author: Martin Tzvetanov Grigorov <mgrigo...@apache.org> Authored: Fri Oct 12 09:58:04 2018 +0300 Committer: Martin Tzvetanov Grigorov <mgrigo...@apache.org> Committed: Fri Oct 12 09:58:04 2018 +0300 ---------------------------------------------------------------------- .../request/resource/CssPackageResource.java | 49 +---------- .../resource/JavaScriptPackageResource.java | 49 +---------- .../request/resource/PackageResource.java | 92 +++++++++++++++++++- 3 files changed, 93 insertions(+), 97 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/072b2fc7/wicket-core/src/main/java/org/apache/wicket/request/resource/CssPackageResource.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/CssPackageResource.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/CssPackageResource.java index fd48eb8..d1d2ba7 100644 --- a/wicket-core/src/main/java/org/apache/wicket/request/resource/CssPackageResource.java +++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/CssPackageResource.java @@ -22,9 +22,6 @@ import java.util.Locale; import org.apache.wicket.Application; import org.apache.wicket.css.ICssCompressor; -import org.apache.wicket.resource.IScopeAwareTextResourceProcessor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Package resource for css files. It strips comments and whitespace from css. @@ -33,10 +30,6 @@ public class CssPackageResource extends PackageResource { private static final long serialVersionUID = 1L; - private static final Logger log = LoggerFactory.getLogger(CssPackageResource.class); - - private final String name; - /** * Construct. * @@ -57,54 +50,14 @@ public class CssPackageResource extends PackageResource { super(scope, name, locale, style, variation); - this.name = name; - // CSS resources can be compressed if there is configured ICssCompressor, and the // resource isn't already minified (the file already has .min. in its name). setCompress(!name.contains(MIN_POSTFIX_DEFAULT_AS_EXTENSION)); } - @Override - protected byte[] processResponse(final Attributes attributes, final byte[] bytes) - { - final byte[] processedResponse = super.processResponse(attributes, bytes); - - ICssCompressor compressor = getCompressor(); - - if (compressor != null && getCompress()) - { - try - { - String charsetName = "UTF-8"; - String nonCompressed = new String(processedResponse, charsetName); - String output; - if (compressor instanceof IScopeAwareTextResourceProcessor) - { - IScopeAwareTextResourceProcessor scopeAwareProcessor = (IScopeAwareTextResourceProcessor) compressor; - output = scopeAwareProcessor.process(nonCompressed, getScope(), name); - } - else - { - output = compressor.compress(nonCompressed); - } - return output.getBytes(charsetName); - } - catch (Exception e) - { - log.error("Error while filtering content", e); - return processedResponse; - } - } - else - { - // don't strip the comments - return processedResponse; - } - } - /** * Gets the {@link ICssCompressor} to be used. By default returns the configured compressor on - * application level, but can be overriden by the user application to provide compressor + * application level, but can be overridden by the user application to provide compressor * specific to the resource. * * @return the configured application level Css compressor. May be {@code null}. http://git-wip-us.apache.org/repos/asf/wicket/blob/072b2fc7/wicket-core/src/main/java/org/apache/wicket/request/resource/JavaScriptPackageResource.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/JavaScriptPackageResource.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/JavaScriptPackageResource.java index 0692555..78133ef 100644 --- a/wicket-core/src/main/java/org/apache/wicket/request/resource/JavaScriptPackageResource.java +++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/JavaScriptPackageResource.java @@ -22,10 +22,6 @@ import java.util.Locale; import org.apache.wicket.Application; import org.apache.wicket.javascript.IJavaScriptCompressor; -import org.apache.wicket.resource.IScopeAwareTextResourceProcessor; -import org.apache.wicket.util.resource.ResourceUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Package resource for javascript files. @@ -34,10 +30,6 @@ public class JavaScriptPackageResource extends PackageResource { private static final long serialVersionUID = 1L; - private static final Logger log = LoggerFactory.getLogger(JavaScriptPackageResource.class); - - private final String name; - /** * Construct. * @@ -58,51 +50,11 @@ public class JavaScriptPackageResource extends PackageResource { super(scope, name, locale, style, variation); - this.name = name; - // JS resources can be compressed if there is configured IJavaScriptCompressor, and the // resource isn't already minified (the file already has .min. in its name). setCompress(!name.contains(MIN_POSTFIX_DEFAULT_AS_EXTENSION)); } - @Override - protected byte[] processResponse(final Attributes attributes, byte[] bytes) - { - final byte[] processedResponse = super.processResponse(attributes, bytes); - - IJavaScriptCompressor compressor = getCompressor(); - - if (compressor != null && getCompress()) - { - try - { - String charsetName = "UTF-8"; - String nonCompressed = new String(processedResponse, charsetName); - String output; - if (compressor instanceof IScopeAwareTextResourceProcessor) - { - IScopeAwareTextResourceProcessor scopeAwareProcessor = (IScopeAwareTextResourceProcessor)compressor; - output = scopeAwareProcessor.process(nonCompressed, getScope(), name); - } - else - { - output = compressor.compress(nonCompressed); - } - return output.getBytes(charsetName); - } - catch (Exception e) - { - log.error("Error while filtering content", e); - return processedResponse; - } - } - else - { - // don't strip the comments - return processedResponse; - } - } - /** * Gets the {@link IJavaScriptCompressor} to be used. By default returns the configured * compressor on application level, but can be overriden by the user application to provide @@ -110,6 +62,7 @@ public class JavaScriptPackageResource extends PackageResource * * @return the configured application level JavaScript compressor. May be {@code null}. */ + @Override protected IJavaScriptCompressor getCompressor() { IJavaScriptCompressor compressor = null; http://git-wip-us.apache.org/repos/asf/wicket/blob/072b2fc7/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResource.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResource.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResource.java index ad5a919..614d6f2 100644 --- a/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResource.java +++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResource.java @@ -20,6 +20,8 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.Locale; import java.util.Objects; @@ -31,11 +33,14 @@ import org.apache.wicket.Session; import org.apache.wicket.WicketRuntimeException; import org.apache.wicket.core.util.lang.WicketObjects; import org.apache.wicket.core.util.resource.locator.IResourceStreamLocator; +import org.apache.wicket.javascript.IJavaScriptCompressor; import org.apache.wicket.markup.html.IPackageResourceGuard; import org.apache.wicket.mock.MockWebRequest; import org.apache.wicket.request.Url; import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.resource.caching.IStaticCacheableResource; +import org.apache.wicket.resource.IScopeAwareTextResourceProcessor; +import org.apache.wicket.resource.ITextResourceCompressor; import org.apache.wicket.response.StringResponse; import org.apache.wicket.util.io.IOUtils; import org.apache.wicket.util.lang.Classes; @@ -119,6 +124,11 @@ public class PackageResource extends AbstractResource implements IStaticCacheabl private final String scopeName; /** + * The name of the resource + */ + private final String name; + + /** * The resource's style */ private final String style; @@ -183,6 +193,7 @@ public class PackageResource extends AbstractResource implements IStaticCacheabl path = name; } + this.name = name; this.scopeName = scope.getName(); this.locale = locale; this.style = style; @@ -283,6 +294,11 @@ public class PackageResource extends AbstractResource implements IStaticCacheabl return WicketObjects.resolveClass(scopeName); } + public final String getName() + { + return name; + } + /** * Gets the style. * @@ -408,7 +424,81 @@ public class PackageResource extends AbstractResource implements IStaticCacheabl */ protected byte[] processResponse(final Attributes attributes, final byte[] original) { - return original; + return compressResponse(attributes, original); + } + + /** + * Compresses the response if its is eligible and there is a configured compressor + * + * @param attributes + * * current request attributes from client + * * @param original + * * the original response + * * @return the compressed response + */ + protected byte[] compressResponse(final Attributes attributes, final byte[] original) + { + ITextResourceCompressor compressor = getCompressor(); + + if (compressor != null && getCompress()) + { + try + { + Charset charset = getProcessingEncoding(); + String nonCompressed = new String(original, charset); + String output; + if (compressor instanceof IScopeAwareTextResourceProcessor) + { + IScopeAwareTextResourceProcessor scopeAwareProcessor = (IScopeAwareTextResourceProcessor)compressor; + output = scopeAwareProcessor.process(nonCompressed, getScope(), name); + } + else + { + output = compressor.compress(nonCompressed); + } + final String textEncoding = getTextEncoding(); + final Charset outputCharset; + if (Strings.isEmpty(textEncoding)) + { + outputCharset = charset; + } + else + { + outputCharset = Charset.forName(textEncoding); + } + return output.getBytes(outputCharset); + } + catch (Exception e) + { + log.error("Error while compressing the content", e); + return original; + } + } + else + { + // don't strip the comments + return original; + } + } + + /** + * @return The charset to use to read the resource + */ + protected Charset getProcessingEncoding() + { + return StandardCharsets.UTF_8; + } + + /** + * Gets the {@link IJavaScriptCompressor} to be used. By default returns the configured + * compressor on application level, but can be overriden by the user application to provide + * compressor specific to the resource. + * + * @return the configured application level JavaScript compressor. May be {@code null}. + */ + protected ITextResourceCompressor getCompressor() + { + return null; } /**