WICKET-4762 IResourceVersion should be based on final result

(cherry picked from commit d6135b5d03a3de3007721703780aa93910615914)


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/29b26fff
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/29b26fff
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/29b26fff

Branch: refs/heads/sandbox/WICKET-4686
Commit: 29b26ffffdd619f4e2fe86aa2d2b02ff3e1d6017
Parents: fabec75
Author: Martin Tzvetanov Grigorov <[email protected]>
Authored: Wed Dec 18 12:39:57 2013 +0200
Committer: Martin Tzvetanov Grigorov <[email protected]>
Committed: Wed Dec 18 12:41:00 2013 +0200

----------------------------------------------------------------------
 .../request/resource/PackageResource.java       |  47 ++++++--
 .../resource/JavaScriptPackageResourceTest.java |  41 +++++++
 .../util/resource/ResourceStreamWrapper.java    | 109 +++++++++++++++++++
 3 files changed, 189 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/29b26fff/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 ed75647..ad03e22 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
@@ -16,7 +16,9 @@
  */
 package org.apache.wicket.request.resource;
 
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.Serializable;
 import java.util.Locale;
 
@@ -28,6 +30,7 @@ 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.markup.html.IPackageResourceGuard;
+import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.resource.caching.IStaticCacheableResource;
 import org.apache.wicket.util.io.IOUtils;
 import org.apache.wicket.util.lang.Classes;
@@ -35,6 +38,7 @@ import org.apache.wicket.util.lang.Packages;
 import org.apache.wicket.util.resource.IFixedLocationResourceStream;
 import org.apache.wicket.util.resource.IResourceStream;
 import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
+import org.apache.wicket.util.resource.ResourceStreamWrapper;
 import org.apache.wicket.util.string.Strings;
 import org.apache.wicket.util.time.Time;
 import org.slf4j.Logger;
@@ -295,14 +299,10 @@ public class PackageResource extends AbstractResource 
implements IStaticCacheabl
                        try
                        {
                                // read resource data
-                               final byte[] bytes;
-
-                               bytes = 
IOUtils.toByteArray(resourceStream.getInputStream());
-
-                               final byte[] processed = 
processResponse(attributes, bytes);
+                               final byte[] bytes = 
IOUtils.toByteArray(resourceStream.getInputStream());
 
                                // send Content-Length header
-                               
resourceResponse.setContentLength(processed.length);
+                               resourceResponse.setContentLength(bytes.length);
 
                                // send response body with resource data
                                resourceResponse.setWriteCallback(new 
WriteCallback()
@@ -310,7 +310,7 @@ public class PackageResource extends AbstractResource 
implements IStaticCacheabl
                                        @Override
                                        public void writeData(Attributes 
attributes)
                                        {
-                                               
attributes.getResponse().write(processed);
+                                               
attributes.getResponse().write(bytes);
                                        }
                                });
                        }
@@ -461,7 +461,38 @@ public class PackageResource extends AbstractResource 
implements IStaticCacheabl
                                                ". See IPackageResourceGuard");
                }
 
-               return resourceStream;
+               return new ProcessingResourceStream(resourceStream);
+       }
+
+       /**
+        * An IResourceStream that processes the input stream of the original
+        * IResourceStream
+        */
+       private class ProcessingResourceStream extends ResourceStreamWrapper
+       {
+               private ProcessingResourceStream(IResourceStream delegate)
+               {
+                       super(delegate);
+               }
+
+               @Override
+               public InputStream getInputStream() throws 
ResourceStreamNotFoundException
+               {
+                       byte[] bytes;
+                       InputStream inputStream = super.getInputStream();
+                       try
+                       {
+                               bytes = IOUtils.toByteArray(inputStream);
+                       } catch (IOException iox)
+                       {
+                               throw new WicketRuntimeException(iox);
+                       }
+
+                       RequestCycle cycle = RequestCycle.get();
+                       Attributes attributes = new 
Attributes(cycle.getRequest(), cycle.getResponse());
+                       byte[] processedBytes = processResponse(attributes, 
bytes);
+                       return new ByteArrayInputStream(processedBytes);
+               }
        }
 
        /**

http://git-wip-us.apache.org/repos/asf/wicket/blob/29b26fff/wicket-core/src/test/java/org/apache/wicket/request/resource/JavaScriptPackageResourceTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/request/resource/JavaScriptPackageResourceTest.java
 
b/wicket-core/src/test/java/org/apache/wicket/request/resource/JavaScriptPackageResourceTest.java
index 396bde9..39fd9c6 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/request/resource/JavaScriptPackageResourceTest.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/request/resource/JavaScriptPackageResourceTest.java
@@ -16,11 +16,16 @@
  */
 package org.apache.wicket.request.resource;
 
+import java.io.IOException;
+import java.io.InputStream;
+
 import org.apache.wicket.WicketTestCase;
 import org.apache.wicket.javascript.IJavaScriptCompressor;
 import org.apache.wicket.markup.html.PackageResourceTest;
 import org.apache.wicket.mock.MockApplication;
 import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.util.io.IOUtils;
+import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
 import org.junit.Test;
 
 /**
@@ -86,6 +91,42 @@ public class JavaScriptPackageResourceTest extends 
WicketTestCase
        }
 
        /**
+        * https://issues.apache.org/jira/browse/WICKET-4762
+        *
+        * Asserts that the input stream used to calculate the IResourceVersion 
is the
+        * same as the one used for the actual response
+        */
+       @Test
+       public void cacheableStreamIsCompressed() throws 
ResourceStreamNotFoundException, IOException
+       {
+               JavaScriptPackageResource resource = new 
JavaScriptPackageResource(
+                               PackageResourceTest.class, "packaged1.txt", 
null, null, null)
+               {
+                       private static final long serialVersionUID = 1L;
+
+                       @Override
+                       protected IJavaScriptCompressor getCompressor()
+                       {
+                               return new IJavaScriptCompressor()
+                               {
+
+                                       @Override
+                                       public String compress(String original)
+                                       {
+                                               return RESOURCE_COMPRESSED;
+                                       }
+                               };
+                       }
+               };
+
+               tester.startResource(resource);
+               assertEquals(RESOURCE_COMPRESSED, 
tester.getLastResponseAsString());
+               InputStream cacheableStream = 
resource.getCacheableResourceStream().getInputStream();
+               InputStream stream = 
resource.getResourceStream().getInputStream();
+               assertEquals(IOUtils.toString(cacheableStream), 
IOUtils.toString(stream));
+       }
+
+       /**
         * Tests that a {@link JavaScriptPackageResource} can use the 
application level
         * {@link IJavaScriptCompressor} when there is no custom
         */

http://git-wip-us.apache.org/repos/asf/wicket/blob/29b26fff/wicket-util/src/main/java/org/apache/wicket/util/resource/ResourceStreamWrapper.java
----------------------------------------------------------------------
diff --git 
a/wicket-util/src/main/java/org/apache/wicket/util/resource/ResourceStreamWrapper.java
 
b/wicket-util/src/main/java/org/apache/wicket/util/resource/ResourceStreamWrapper.java
new file mode 100644
index 0000000..8b78be3
--- /dev/null
+++ 
b/wicket-util/src/main/java/org/apache/wicket/util/resource/ResourceStreamWrapper.java
@@ -0,0 +1,109 @@
+/*
+ * 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.util.resource;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Locale;
+
+import org.apache.wicket.util.lang.Args;
+import org.apache.wicket.util.lang.Bytes;
+import org.apache.wicket.util.time.Time;
+
+/**
+ * A IResourceStream that wraps another resource stream
+ */
+public class ResourceStreamWrapper implements IResourceStream
+{
+       private final IResourceStream delegate;
+
+       public ResourceStreamWrapper(IResourceStream delegate)
+       {
+               this.delegate = Args.notNull(delegate, "delegate");
+       }
+
+       protected IResourceStream getDelegate()
+       {
+               return delegate;
+       }
+
+       @Override
+       public String getContentType()
+       {
+               return delegate.getContentType();
+       }
+
+       @Override
+       public Bytes length()
+       {
+               return delegate.length();
+       }
+
+       @Override
+       public InputStream getInputStream() throws 
ResourceStreamNotFoundException
+       {
+               return delegate.getInputStream();
+       }
+
+       @Override
+       public void close() throws IOException
+       {
+               delegate.close();
+       }
+
+       @Override
+       public Locale getLocale()
+       {
+               return delegate.getLocale();
+       }
+
+       @Override
+       public void setLocale(Locale locale)
+       {
+               delegate.setLocale(locale);
+       }
+
+       @Override
+       public String getStyle()
+       {
+               return delegate.getStyle();
+       }
+
+       @Override
+       public void setStyle(String style)
+       {
+               delegate.setStyle(style);
+       }
+
+       @Override
+       public String getVariation()
+       {
+               return delegate.getVariation();
+       }
+
+       @Override
+       public void setVariation(String variation)
+       {
+               delegate.setVariation(variation);
+       }
+
+       @Override
+       public Time lastModifiedTime()
+       {
+               return delegate.lastModifiedTime();
+       }
+}

Reply via email to