Repository: wicket Updated Branches: refs/heads/pr-86-media_tags a11950c7f -> eb4c6164e
WICKET-5819 Media tags - examples / minor changes Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/42e89211 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/42e89211 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/42e89211 Branch: refs/heads/pr-86-media_tags Commit: 42e89211079e35894f4a804b279d5a5a8e3acee9 Parents: a11950c Author: klopfdreh <klopfdreh@192.168.2.110> Authored: Mon Feb 16 10:33:39 2015 +0100 Committer: klopfdreh <klopfdreh@192.168.2.110> Committed: Mon Feb 16 10:33:39 2015 +0100 ---------------------------------------------------------------------- .../markup/html/media/MediaComponent.java | 39 ++++--- .../media/MediaStreamingResourceReference.java | 40 ++++--- .../wicket/markup/html/media/audio/Audio.java | 10 ++ .../wicket/markup/html/media/video/Video.java | 10 ++ .../org/apache/wicket/examples/media/Home.html | 15 +++ .../org/apache/wicket/examples/media/Home.java | 103 +++++++++++++++++++ .../examples/media/VideosApplication.java | 63 ++++++++++++ .../apache/wicket/examples/media/novideo.gif | Bin 0 -> 25903 bytes .../org/apache/wicket/examples/media/video.mp4 | Bin 0 -> 2757913 bytes wicket-examples/src/main/webapp/WEB-INF/web.xml | 22 +++- 10 files changed, 270 insertions(+), 32 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/42e89211/wicket-core/src/main/java/org/apache/wicket/markup/html/media/MediaComponent.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/media/MediaComponent.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/media/MediaComponent.java index 20f39ec..d8f6d49 100755 --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/media/MediaComponent.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/media/MediaComponent.java @@ -19,8 +19,10 @@ package org.apache.wicket.markup.html.media; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.model.IModel; +import org.apache.wicket.request.Url; import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParametersEncoder; /** * The media component is used to provide basic functionality to the video and audio component. The @@ -106,7 +108,7 @@ public abstract class MediaComponent extends WebMarkupContainer * Constructor. * * @param id - * The component id + * The component id */ public MediaComponent(String id) { @@ -117,9 +119,9 @@ public abstract class MediaComponent extends WebMarkupContainer * Constructor. * * @param id - * The component id + * The component id * @param model - * The component model + * The component model */ public MediaComponent(String id, IModel<?> model) { @@ -130,12 +132,12 @@ public abstract class MediaComponent extends WebMarkupContainer * Constructor. * * @param id - * The component id + * The component id * @param mediaStreamingResourceReference */ public MediaComponent(String id, MediaStreamingResourceReference mediaStreamingResourceReference) { - this(id, null, null, null,mediaStreamingResourceReference); + this(id, null, null, null, mediaStreamingResourceReference); } public MediaComponent(String id, IModel<?> model, @@ -168,8 +170,13 @@ public abstract class MediaComponent extends WebMarkupContainer this(id, model, url, null, null); } + public MediaComponent(String id, IModel<?> model, String url, PageParameters pageParameters) + { + this(id, model, url, pageParameters, null); + } + private MediaComponent(String id, IModel<?> model, String url, PageParameters pageParameters, - MediaStreamingResourceReference mediaStreamingResourceReference) + MediaStreamingResourceReference mediaStreamingResourceReference) { super(id, model); this.url = url; @@ -187,18 +194,20 @@ public abstract class MediaComponent extends WebMarkupContainer String timeManagement = ""; if (startTime != null) { - timeManagement += "#t=" + startTime + - (endTime != null ? "," + endTime : ""); + timeManagement += "#t=" + startTime + (endTime != null ? "," + endTime : ""); } if (mediaStreamingResourceReference != null) { - CharSequence urlToMediaReference = RequestCycle.get().urlFor(mediaStreamingResourceReference, pageParameters); + CharSequence urlToMediaReference = RequestCycle.get().urlFor( + mediaStreamingResourceReference, pageParameters); tag.put("src", urlToMediaReference + timeManagement); } else if (url != null) { - tag.put("src", url + timeManagement); + Url encoded = new PageParametersEncoder().encodePageParameters(pageParameters); + String queryString = encoded.getQueryString(); + tag.put("src", url + (queryString != null ? "?" + queryString : "") + timeManagement); } String mg = getMediaGroup(); @@ -339,12 +348,12 @@ public abstract class MediaComponent extends WebMarkupContainer /** * Sets the type of preload. * <ul> - * <li><b>none</b>: Hints to the user agent that either the author does not expect the user to need - * the media resource, or that the server wants to minimise unnecessary traffic.</li> + * <li><b>none</b>: Hints to the user agent that either the author does not expect the user to + * need the media resource, or that the server wants to minimise unnecessary traffic.</li> * - * <li><b>metadata</b>: Hints to the user agent that the author does not expect the user to need the - * media resource, but that fetching the resource metadata (dimensions, first frame, track list, - * duration, etc) is reasonable.</li> + * <li><b>metadata</b>: Hints to the user agent that the author does not expect the user to need + * the media resource, but that fetching the resource metadata (dimensions, first frame, track + * list, duration, etc) is reasonable.</li> * * <li><b>auto</b>: Hints to the user agent that the user agent can put the user's needs first * without risk to the server, up to and including optimistically downloading the entire http://git-wip-us.apache.org/repos/asf/wicket/blob/42e89211/wicket-core/src/main/java/org/apache/wicket/markup/html/media/MediaStreamingResourceReference.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/media/MediaStreamingResourceReference.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/media/MediaStreamingResourceReference.java index 6231eed..ed6932b 100755 --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/media/MediaStreamingResourceReference.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/media/MediaStreamingResourceReference.java @@ -72,7 +72,11 @@ public class MediaStreamingResourceReference extends PackageResourceReference @Override protected ResourceResponse newResourceResponse(Attributes attributes) { - IResourceStream packageResourceStream = getResourceStream(); + IResourceStream resourceStream = getResourceStream(); + if (resourceStream == null) + { + throw new WicketRuntimeException("Cannot find resource: " + toString()); + } Long startbyte = null; Long endbyte = null; try @@ -83,19 +87,20 @@ public class MediaStreamingResourceReference extends PackageResourceReference if (!(request instanceof WebRequest) || !(response instanceof WebResponse)) { throw new IllegalStateException( - "Web request/response are required! Request: " + request + ", response: " + response); + "Web request/response are required! Request: " + request + + ", response: " + response); } WebRequest webRequest = (WebRequest)request; WebResponse webResponse = (WebResponse)response; - long length = packageResourceStream.length().bytes(); + long length = resourceStream.length().bytes(); ResourceResponse resourceResponse = new ResourceResponse(); - resourceResponse.setContentType(packageResourceStream.getContentType()); + resourceResponse.setContentType(resourceStream.getContentType()); resourceResponse.setFileName(MediaStreamingResourceReference.this.getName()); resourceResponse.setContentDisposition(ContentDisposition.ATTACHMENT); - resourceResponse.setLastModified(packageResourceStream.lastModifiedTime()); + resourceResponse.setLastModified(resourceStream.lastModifiedTime()); // accept ranges, so that the player can // load and play content from a specific byte position @@ -123,8 +128,8 @@ public class MediaStreamingResourceReference extends PackageResourceReference String[] rangeParts = Strings.split(range, '-'); if ("0".equals(rangeParts[0])) { - webResponse.setHeader("Content-Range", - "bytes 0-" + (length - 1) + "/" + length); + webResponse.setHeader("Content-Range", "bytes 0-" + (length - 1) + "/" + + length); resourceResponse.setContentLength(length); } else @@ -132,21 +137,28 @@ public class MediaStreamingResourceReference extends PackageResourceReference startbyte = Long.parseLong(rangeParts[0]); if (rangeParts.length == 2) { - endbyte = Long.parseLong(rangeParts[1]); + if (!"".equals(rangeParts[1].trim())) + { + endbyte = Long.parseLong(rangeParts[1]); + } + else + { + endbyte = length - 1; + } } else { endbyte = length - 1; } - webResponse.setHeader("Content-Range", - "bytes " + startbyte + '-' + endbyte + '/' + length); + webResponse.setHeader("Content-Range", "bytes " + startbyte + '-' + + endbyte + '/' + length); resourceResponse.setContentLength((endbyte - startbyte) + 1); } } // Apply the writer callback to send the requested part to the client - resourceResponse.setWriteCallback(new PartWriterCallback( - packageResourceStream, startbyte, endbyte)); + resourceResponse.setWriteCallback(new PartWriterCallback(resourceStream, + startbyte, endbyte)); return resourceResponse; } @@ -157,11 +169,11 @@ public class MediaStreamingResourceReference extends PackageResourceReference } finally { - if (packageResourceStream != null) + if (resourceStream != null) { try { - packageResourceStream.close(); + resourceStream.close(); } catch (IOException e) { http://git-wip-us.apache.org/repos/asf/wicket/blob/42e89211/wicket-core/src/main/java/org/apache/wicket/markup/html/media/audio/Audio.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/media/audio/Audio.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/media/audio/Audio.java index 3ab9615..c29d98c 100755 --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/media/audio/Audio.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/media/audio/Audio.java @@ -76,6 +76,16 @@ public class Audio extends MediaComponent super(id, model, url); } + public Audio(String id, String url, PageParameters pageParameters) + { + super(id, null, url, pageParameters); + } + + public Audio(String id, IModel<?> model, String url, PageParameters pageParameters) + { + super(id, model, url, pageParameters); + } + @Override protected void onComponentTag(ComponentTag tag) { http://git-wip-us.apache.org/repos/asf/wicket/blob/42e89211/wicket-core/src/main/java/org/apache/wicket/markup/html/media/video/Video.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/media/video/Video.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/media/video/Video.java index 5a8b167..a608a4b 100755 --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/media/video/Video.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/media/video/Video.java @@ -86,6 +86,16 @@ public class Video extends MediaComponent super(id, model, url); } + public Video(String id, String url, PageParameters pageParameters) + { + super(id, null, url, pageParameters); + } + + public Video(String id, IModel<?> model, String url, PageParameters pageParameters) + { + super(id, model, url, pageParameters); + } + @Override protected void onComponentTag(ComponentTag tag) { http://git-wip-us.apache.org/repos/asf/wicket/blob/42e89211/wicket-examples/src/main/java/org/apache/wicket/examples/media/Home.html ---------------------------------------------------------------------- diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/media/Home.html b/wicket-examples/src/main/java/org/apache/wicket/examples/media/Home.html new file mode 100644 index 0000000..efceee8 --- /dev/null +++ b/wicket-examples/src/main/java/org/apache/wicket/examples/media/Home.html @@ -0,0 +1,15 @@ +<html xmlns:wicket="http://wicket.apache.org"> +<head> + <title>Wicket Examples - videos</title> + <link rel="stylesheet" type="text/css" href="style.css"/> +</head> +<body> + <span wicket:id="mainNavigation"/> + <video wicket:id="video1" /> + <video wicket:id="video2" /> + <video wicket:id="video3"> + <source wicket:id="source3" /> + </video><br><br> + For more video examples see comments in the java sources<br><br>The second movie is not displayed because of CORS settings - please read <a href="http://en.wikipedia.org/wiki/Cross-origin_resource_sharing">Cross-origin_resource_sharing - Wikipedia</a> for more information. +</body> +</html> http://git-wip-us.apache.org/repos/asf/wicket/blob/42e89211/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 new file mode 100644 index 0000000..558b126 --- /dev/null +++ b/wicket-examples/src/main/java/org/apache/wicket/examples/media/Home.java @@ -0,0 +1,103 @@ +/* + * 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.examples.media; + +import java.util.UUID; + +import org.apache.wicket.examples.WicketExamplePage; +import org.apache.wicket.markup.html.media.MediaComponent.Cors; +import org.apache.wicket.markup.html.media.MediaStreamingResourceReference; +import org.apache.wicket.markup.html.media.Source; +import org.apache.wicket.markup.html.media.video.Video; +import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.request.resource.PackageResourceReference; + + +/** + * Demonstrates different flavors of org.apache.wicket.examples.videos.<br> + * <br> + * + * Videos are from: http://media.w3.org/2010/05/video/<br> + * <br> + * Images are from: http://search.creativecommons.org/ with check on commercial use and modify... + * + * @author Tobias Soloschenko + */ +public final class Home extends WicketExamplePage +{ + + /** + * Constructor + */ + public Home() + { + // Internal video with several options + + Video video1 = new Video("video1", new MediaStreamingResourceReference(Home.class, + "video.mp4")); + video1.setAutoplay(false); + video1.setControls(true); + video1.setLooping(false); + video1.setWidth(320); + video1.setHeight(240); + video1.setPoster(new PackageResourceReference(Home.class, "novideo.gif")); + add(video1); + + // External video + PageParameters pageParameters = new PageParameters(); + pageParameters.add("random", UUID.randomUUID().toString()); + pageParameters.add("test", "test"); + Video video2 = new Video("video2", "http://media.w3.org/2010/05/video/movie_300.mp4", + pageParameters); + video2.setCrossOrigin(Cors.ANONYMOUS); + add(video2); + + // video with source + + Video video3 = new Video("video3"); + video3.setPoster(new PackageResourceReference(Home.class, "novideo.gif")); + + Source source3 = new Source("source3", new MediaStreamingResourceReference(Home.class, + "video.mp4")); + // Need to be set to true to show the type + source3.setDisplayType(true); + // the default type is the mime type of the image with no codec information + source3.setType("video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\""); + video3.add(source3); + + add(video3); + + // video with track + + /* + * Video video4 = new Video("video4", new MediaStreamingResourceReference(Home.class, + * "dummyVideo.m4a")); + * + * // source tag Source source4 = new Source("source4", + * "http://www.mytestpage.xc/video.m4a"); + * source4.setMedia("screen and (device-width:500px)"); source4.setType("video/mp4"); + * source4.setDisplayType(true); video4.add(source4); + * + * // tack tag Track track4 = new Track("track4", new PackageResourceReference(Home.class, + * "dummySubtitles.vtt")); track4.setKind(Kind.subtitles); + * track4.setLabel("Subtitles of video"); track4.setSrclang(Locale.GERMANY); + * track4.setDefaultTrack(true); video4.add(track4); + * + * add(video4); + */ + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/42e89211/wicket-examples/src/main/java/org/apache/wicket/examples/media/VideosApplication.java ---------------------------------------------------------------------- diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/media/VideosApplication.java b/wicket-examples/src/main/java/org/apache/wicket/examples/media/VideosApplication.java new file mode 100644 index 0000000..c17a393 --- /dev/null +++ b/wicket-examples/src/main/java/org/apache/wicket/examples/media/VideosApplication.java @@ -0,0 +1,63 @@ +/* + * 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.examples.media; + +import org.apache.wicket.Page; +import org.apache.wicket.examples.WicketExampleApplication; +import org.apache.wicket.markup.html.IPackageResourceGuard; +import org.apache.wicket.markup.html.SecurePackageResourceGuard; + + +/** + * Application class for the videos examples. + * + * @author Tobias Soloschenko + */ +public class VideosApplication extends WicketExampleApplication +{ + /** + * Constructor + */ + public VideosApplication() + { + + } + + /** + * @see org.apache.wicket.Application#getHomePage() + */ + @Override + public Class<? extends Page> getHomePage() + { + return Home.class; + } + + /** + * @see org.apache.wicket.examples.WicketExampleApplication#init() + */ + @Override + protected void init() + { + IPackageResourceGuard packageResourceGuard = getResourceSettings().getPackageResourceGuard(); + if (packageResourceGuard instanceof SecurePackageResourceGuard) + { + SecurePackageResourceGuard guard = (SecurePackageResourceGuard)packageResourceGuard; + guard.addPattern("+*.mp4"); + } + } + +} http://git-wip-us.apache.org/repos/asf/wicket/blob/42e89211/wicket-examples/src/main/java/org/apache/wicket/examples/media/novideo.gif ---------------------------------------------------------------------- diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/media/novideo.gif b/wicket-examples/src/main/java/org/apache/wicket/examples/media/novideo.gif new file mode 100644 index 0000000..98cc51a Binary files /dev/null and b/wicket-examples/src/main/java/org/apache/wicket/examples/media/novideo.gif differ http://git-wip-us.apache.org/repos/asf/wicket/blob/42e89211/wicket-examples/src/main/java/org/apache/wicket/examples/media/video.mp4 ---------------------------------------------------------------------- diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/media/video.mp4 b/wicket-examples/src/main/java/org/apache/wicket/examples/media/video.mp4 new file mode 100644 index 0000000..cf59777 Binary files /dev/null and b/wicket-examples/src/main/java/org/apache/wicket/examples/media/video.mp4 differ http://git-wip-us.apache.org/repos/asf/wicket/blob/42e89211/wicket-examples/src/main/webapp/WEB-INF/web.xml ---------------------------------------------------------------------- diff --git a/wicket-examples/src/main/webapp/WEB-INF/web.xml b/wicket-examples/src/main/webapp/WEB-INF/web.xml index 92f956a..6b91161 100644 --- a/wicket-examples/src/main/webapp/WEB-INF/web.xml +++ b/wicket-examples/src/main/webapp/WEB-INF/web.xml @@ -16,9 +16,9 @@ limitations under the License. --> <web-app xmlns="http://java.sun.com/xml/ns/javaee" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" - version="2.5"> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" + version="3.0"> <display-name>Wicket Examples</display-name> @@ -160,6 +160,15 @@ <param-value>org.apache.wicket.examples.images.ImagesApplication</param-value> </init-param> </filter> + + <filter> + <filter-name>VideosApplication</filter-name> + <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class> + <init-param> + <param-name>applicationClassName</param-name> + <param-value>org.apache.wicket.examples.media.VideosApplication</param-value> + </init-param> + </filter> <filter> <filter-name>LibraryApplication</filter-name> @@ -542,6 +551,13 @@ <dispatcher>REQUEST</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping> + + <filter-mapping> + <filter-name>VideosApplication</filter-name> + <url-pattern>/videos/*</url-pattern> + <dispatcher>REQUEST</dispatcher> + <dispatcher>INCLUDE</dispatcher> + </filter-mapping> <filter-mapping> <filter-name>HelloWorldApplication</filter-name>