/* * 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.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.cycle.RequestCycle; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.request.resource.PackageResource; import org.apache.wicket.request.resource.PackageResourceReference; import org.apache.wicket.request.resource.ResourceReference; import org.apache.wicket.util.resource.IResourceStream; /** * The source of an audio or a video media component * * @author Tobias Soloschenko * @author Andrew Lombardi * @since 7.0.0 */ public class Source extends WebMarkupContainer { private static final long serialVersionUID = 1L; private boolean displayType; private String type; private String media; private PageParameters pageParameters; private final ResourceReference resourceReference; private final String url; /** * Creates a source * * @param id * the component id */ public Source(String id) { this(id, null, null, null, null); } /** * Creates a source * * @param id * the component id * @param model * the internally used model */ public Source(String id, IModel<?> model) { this(id, model, null, null, null); } /** * Creates a source * * @param id * the component id * @param resourceReference * the resource reference to provide the source data */ public Source(String id, ResourceReference resourceReference) { this(id, null, null, null, resourceReference); } /** * Creates a source * * @param id * the component id * @param model * the internally used model * @param resourceReference * the resource reference to provide the source data */ public Source(String id, IModel<?> model, ResourceReference resourceReference) { this(id, model, null, null, resourceReference); } /** * Creates a source * * @param id * the component id * @param pageParameters * the the page parameters applied to the source URL * @param resourceReference * the resource reference to provide the source data */ public Source(String id, ResourceReference resourceReference, PageParameters pageParameters) { this(id, null, null, pageParameters, resourceReference); } /** * Creates a source * * @param id * the component id * @param model * the internally used model * @param resourceReference * the resource reference to provide the source data * @param pageParameters * the the page parameters applied to the source URL */ public Source(String id, IModel<?> model, ResourceReference resourceReference, PageParameters pageParameters) { this(id, model, null, pageParameters, resourceReference); } /** * Creates a source * * @param id * the component id * @param url * an external URL to provide the source information */ public Source(String id, String url) { this(id, null, url, null, null); } /** * Creates a source * * @param id * the component id * @param model * the internally used model * @param url * an external URL to provide the source information */ public Source(String id, IModel<?> model, String url) { this(id, model, url, null, null); } private Source(String id, IModel<?> model, String url, PageParameters pageParameters, ResourceReference resourceReference) { super(id, model); this.url = url; this.pageParameters = pageParameters; this.resourceReference = resourceReference; } @Override protected void onComponentTag(ComponentTag tag) { checkComponentTag(tag, "source"); super.onComponentTag(tag); if (resourceReference != null) { CharSequence url = RequestCycle.get().urlFor(resourceReference, pageParameters); tag.put("src", url); } else if (url != null) { tag.put("src", url); } if (getDisplayType()) { if (type != null) { tag.put("type", type); } else if (resourceReference != null) { // if package resource reference we can get the content // type of the package resource if(resourceReference instanceof PackageResourceReference){ PackageResource resource = ((PackageResourceReference)resourceReference).getResource(); IResourceStream resourceStream = resource.getResourceStream(); String contentType = resourceStream.getContentType(); tag.put("type", contentType); } } } String _media = getMedia(); if (_media != null) { tag.put("media", _media); } } /** * If the type is going to be displayed * * @return If the type is going to be displayed */ public boolean getDisplayType() { return displayType; } /** * Sets if the type is going to be displayed * * @param displayType * if the type is going to be displayed */ public void setDisplayType(boolean displayType) { this.displayType = displayType; } /** * Gets the type * * @see {@link #setType(String)} * * @return the type of this media element */ public String getType() { return type; } /** * Sets the type<br> * <br> * * * The following list shows some examples of how to use the codecs= MIME parameter in the type * attribute.<br> * <br> * * H.264 Constrained baseline profile video (main and extended video compatible) level 3 and * Low-Complexity AAC audio in MP4 container<br> * <source src='video.mp4' <b>type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'</b>><br> * H.264 Extended profile video (baseline-compatible) level 3 and Low-Complexity AAC audio in * MP4 container<br> * <source src='video.mp4' <b>type='video/mp4; codecs="avc1.58A01E, mp4a.40.2"'</b>><br> * H.264 Main profile video level 3 and Low-Complexity AAC audio in MP4 container<br> * <source src='video.mp4' <b>type='video/mp4; codecs="avc1.4D401E, mp4a.40.2"'</b>><br> * H.264 'High' profile video (incompatible with main, baseline, or extended profiles) level 3 * and Low-Complexity AAC audio in MP4 container<br> * <source src='video.mp4' <b>type='video/mp4; codecs="avc1.64001E, mp4a.40.2"'</b>><br> * MPEG-4 Visual Simple Profile Level 0 video and Low-Complexity AAC audio in MP4 container<br> * <source src='video.mp4' <b>type='video/mp4; codecs="mp4v.20.8, mp4a.40.2"'</b>><br> * MPEG-4 Advanced Simple Profile Level 0 video and Low-Complexity AAC audio in MP4 container<br> * <source src='video.mp4' <b>type='video/mp4; codecs="mp4v.20.240, mp4a.40.2"'</b>><br> * MPEG-4 Visual Simple Profile Level 0 video and AMR audio in 3GPP container<br> * <source src='video.3gp' <b>type='video/3gpp; codecs="mp4v.20.8, samr"'</b>><br> * Theora video and Vorbis audio in Ogg container<br> * <source src='video.ogv' <b>type='video/ogg; codecs="theora, vorbis"'</b>><br> * Theora video and Speex audio in Ogg container<br> * <source src='video.ogv' <b>type='video/ogg; codecs="theora, speex"'</b>><br> * Vorbis audio alone in Ogg container<br> * <source src='audio.ogg' <b>type='audio/ogg; codecs=vorbis'</b>><br> * Speex audio alone in Ogg container<br> * <source src='audio.spx' <b>type='audio/ogg; codecs=speex'</b>><br> * FLAC audio alone in Ogg container<br> * <source src='audio.oga' <b>type='audio/ogg; codecs=flac'</b>><br> * Dirac video and Vorbis audio in Ogg container<br> * <source src='video.ogv' <b>type='video/ogg; codecs="dirac, vorbis"'</b>><br> * Theora video and Vorbis audio in Matroska container<br> * <source src='video.mkv' <b>type='video/x-matroska; codecs="theora, vorbis"'</b>><br> * * @param type * the type of this media element */ public void setType(String type) { this.type = type; } /** * The media for which the content of this source should be shown * * @See {@link #setMedia(String)} * @return The media for which the content of this source should be shown */ public String getMedia() { return media; } /** * Sets the media for which the content of this source should be shown<br> * <br> * * <source src="movie.ogg" type="video/ogg" <b>media="screen and (min-width:320px)"><br> * * @param media * the media for which to content of this source should be shown */ public void setMedia(String media) { this.media = media; } /** * Gets the page parameter applied to the URL of the source * * @return the page parameter applied to the URL of the source */ public PageParameters getPageParameters() { return pageParameters; } /** * Sets the page parameter applied to the URL of the source * * @param pageParameters * the page parameter which are going to be applied to the URL of the source */ public void setPageParameters(PageParameters pageParameters) { this.pageParameters = pageParameters; } }