You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by ts...@apache.org on 2015/05/23 15:54:24 UTC

wicket git commit: WICKET-5819 - Improvement not to read the whole media file

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 <ts...@apache.org>
Authored: Sat May 23 15:51:55 2015 +0200
Committer: Tobias Soloschenko <ts...@apache.org>
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);