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;
        }
 
        /**

Reply via email to