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);

Reply via email to