Repository: wicket Updated Branches: refs/heads/WICKET-5819_Improvements [created] b3c9843f8
WICKET-5819 - Improvement not to read the whole media file Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/b3c9843f Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/b3c9843f Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/b3c9843f Branch: refs/heads/WICKET-5819_Improvements Commit: b3c9843f805560f6685106b97cd2f9ddab8c28a9 Parents: 91f2f8a Author: Tobias Soloschenko <[email protected]> Authored: Sat May 23 15:51:55 2015 +0200 Committer: Tobias Soloschenko <[email protected]> Committed: Sat May 23 15:51:55 2015 +0200 ---------------------------------------------------------------------- .../request/resource/PackageResource.java | 97 ++++++++++++++------ .../resource/PackageResourceReference.java | 21 ++++- .../org/apache/wicket/examples/media/Home.java | 2 +- 3 files changed, 86 insertions(+), 34 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/b3c9843f/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 ee8bfec..8de030b 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 @@ -79,7 +79,9 @@ public class PackageResource extends AbstractResource implements IStaticCacheabl /** * Exception thrown when the creation of a package resource is not allowed. */ - public static final class PackageResourceBlockedException extends WicketRuntimeException implements IWicketInternalException + public static final class PackageResourceBlockedException extends WicketRuntimeException + implements + IWicketInternalException { private static final long serialVersionUID = 1L; @@ -126,9 +128,9 @@ public class PackageResource extends AbstractResource implements IStaticCacheabl private final String variation; /** - * A flag indicating whether {@code ITextResourceCompressor} can be used to compress this resource. - * Default is {@code false} because this resource may be used for binary data (e.g. an image). - * Specializations of this class should change this flag appropriately. + * A flag indicating whether {@code ITextResourceCompressor} can be used to compress this + * resource. Default is {@code false} because this resource may be used for binary data (e.g. an + * image). Specializations of this class should change this flag appropriately. */ private boolean compress = false; @@ -143,6 +145,8 @@ public class PackageResource extends AbstractResource implements IStaticCacheabl */ private String textEncoding = null; + private boolean readPartially = false; + /** * Hidden constructor. * @@ -286,7 +290,7 @@ public class PackageResource extends AbstractResource implements IStaticCacheabl if (resourceStream == null) { return sendResourceError(resourceResponse, HttpServletResponse.SC_NOT_FOUND, - "Unable to find resource"); + "Unable to find resource"); } // add Last-Modified header (to support HEAD requests and If-Modified-Since) @@ -316,19 +320,27 @@ public class PackageResource extends AbstractResource implements IStaticCacheabl { // read resource data to get the content length InputStream inputStream = resourceStream.getInputStream(); - byte[] bytes = IOUtils.toByteArray(inputStream); - long contentLength = bytes.length; + byte[] bytes = null; // send Content-Length header - resourceResponse.setContentLength(contentLength); + if (readPartially) + { + resourceResponse.setContentLength(resourceStream.length().bytes()); + } + else + { + bytes = IOUtils.toByteArray(inputStream); + resourceResponse.setContentLength(new Long(bytes.length)); + } // get content range information Long startbyte = RequestCycle.get().getMetaData(CONTENT_RANGE_STARTBYTE); Long endbyte = RequestCycle.get().getMetaData(CONTENT_RANGE_ENDBYTE); // send response body with resource data - resourceResponse.setWriteCallback(new PartWriterCallback( - new ByteArrayInputStream(bytes), contentLength, startbyte, endbyte)); + resourceResponse.setWriteCallback(new PartWriterCallback(bytes != null + ? new ByteArrayInputStream(bytes) : inputStream, + resourceResponse.getContentLength(), startbyte, endbyte)); } catch (IOException e) { @@ -421,8 +433,8 @@ public class PackageResource extends AbstractResource implements IStaticCacheabl } /** - * @return whether {@link org.apache.wicket.resource.ITextResourceCompressor} can be used to compress the - * resource. + * @return whether {@link org.apache.wicket.resource.ITextResourceCompressor} can be used to + * compress the resource. */ public boolean getCompress() { @@ -441,9 +453,10 @@ public class PackageResource extends AbstractResource implements IStaticCacheabl private IResourceStream internalGetResourceStream(final String style, final Locale locale) { IResourceStreamLocator resourceStreamLocator = Application.get() - .getResourceSettings() - .getResourceStreamLocator(); - IResourceStream resourceStream = resourceStreamLocator.locate(getScope(), absolutePath, style, variation, locale, null, false); + .getResourceSettings() + .getResourceStreamLocator(); + IResourceStream resourceStream = resourceStreamLocator.locate(getScope(), absolutePath, + style, variation, locale, null, false); String realPath = absolutePath; if (resourceStream instanceof IFixedLocationResourceStream) @@ -467,8 +480,8 @@ public class PackageResource extends AbstractResource implements IStaticCacheabl if (accept(realPath) == false) { throw new PackageResourceBlockedException( - "Access denied to (static) package resource " + absolutePath + - ". See IPackageResourceGuard"); + "Access denied to (static) package resource " + absolutePath + + ". See IPackageResourceGuard"); } if (resourceStream != null) @@ -493,19 +506,23 @@ public class PackageResource extends AbstractResource implements IStaticCacheabl @Override public InputStream getInputStream() throws ResourceStreamNotFoundException { - byte[] bytes; + byte[] bytes = null; InputStream inputStream = super.getInputStream(); - try - { - bytes = IOUtils.toByteArray(inputStream); - } - catch (IOException iox) - { - throw new WicketRuntimeException(iox); - } - finally + + if (!readPartially) { - IOUtils.closeQuietly(this); + try + { + bytes = IOUtils.toByteArray(inputStream); + } + catch (IOException iox) + { + throw new WicketRuntimeException(iox); + } + finally + { + IOUtils.closeQuietly(this); + } } RequestCycle cycle = RequestCycle.get(); @@ -519,8 +536,15 @@ public class PackageResource extends AbstractResource implements IStaticCacheabl // use empty request and response in case of non-http thread. WICKET-5532 attributes = new Attributes(new MockWebRequest(Url.parse("")), new StringResponse()); } - byte[] processedBytes = processResponse(attributes, bytes); - return new ByteArrayInputStream(processedBytes); + if (bytes != null) + { + byte[] processedBytes = processResponse(attributes, bytes); + return new ByteArrayInputStream(processedBytes); + } + else + { + return inputStream; + } } } @@ -710,4 +734,17 @@ public class PackageResource extends AbstractResource implements IStaticCacheabl return sb.toString(); } } + + /** + * If the packaage resource should be read partially + * + * @param readPartially + * if the package resource should be read partially + * @return the current package resource + */ + public PackageResource readPartially(boolean readPartially) + { + this.readPartially = readPartially; + return this; + } } http://git-wip-us.apache.org/repos/asf/wicket/blob/b3c9843f/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 749769e..c3d3353 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 @@ -43,6 +43,8 @@ public class PackageResourceReference extends ResourceReference private static final String JAVASCRIPT_EXTENSION = "js"; private transient ConcurrentMap<UrlAttributes, UrlAttributes> urlAttributesCacheMap; + + private boolean readPartially = false; /** * Cache for existence of minified version of the resource to avoid repetitive calls @@ -117,17 +119,17 @@ public class PackageResourceReference extends ResourceReference if (CSS_EXTENSION.equals(extension)) { resource = new CssPackageResource(getScope(), getName(), getLocale(), getStyle(), - getVariation()); + getVariation()).readPartially(readPartially); } else if (JAVASCRIPT_EXTENSION.equals(extension)) { resource = new JavaScriptPackageResource(getScope(), getName(), getLocale(), getStyle(), - getVariation()); + getVariation()).readPartially(readPartially); } else { resource = new PackageResource(getScope(), getName(), getLocale(), getStyle(), - getVariation()); + getVariation()).readPartially(readPartially); } removeCompressFlagIfUnnecessary(resource); @@ -273,4 +275,17 @@ public class PackageResourceReference extends ResourceReference return value; } + + /** + * If the packaage resource should be read partially + * + * @param readPartially + * if the package resource should be read partially + * @return the current package resource + */ + public PackageResourceReference readPartially(boolean readPartially) + { + this.readPartially = readPartially; + return this; + } } http://git-wip-us.apache.org/repos/asf/wicket/blob/b3c9843f/wicket-examples/src/main/java/org/apache/wicket/examples/media/Home.java ---------------------------------------------------------------------- diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/media/Home.java b/wicket-examples/src/main/java/org/apache/wicket/examples/media/Home.java index 9055ff1..9089e76 100644 --- a/wicket-examples/src/main/java/org/apache/wicket/examples/media/Home.java +++ b/wicket-examples/src/main/java/org/apache/wicket/examples/media/Home.java @@ -50,7 +50,7 @@ public final class Home extends WicketExamplePage // Internal video with several options Video video1 = new Video("video1", new PackageResourceReference(Home.class, - "video.mp4")); + "video.mp4").readPartially(true)); video1.setAutoplay(false); video1.setControls(true); video1.setLooping(false);
