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