/**
* Licensed to The Apereo Foundation under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
*
* The Apereo Foundation licenses this file to you under the Educational
* Community 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://opensource.org/licenses/ecl2.txt
*
* 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.opencastproject.metadata.mpeg7;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
/**
* Implements the mpeg-7 metadata container.
*/
public class Mpeg7CatalogImpl implements Mpeg7Catalog {
/** Serial version UID */
private static final long serialVersionUID = 5521535164920498997L;
/** The multimedia content list */
private HashMap<MultimediaContent.Type, MultimediaContentImpl<? extends MultimediaContentType>> multimediaContent = null;
/** The default element namespace */
public static final String NS = "mpeg7";
/**
* Creates a new mpeg-7 metadata container.
*/
public Mpeg7CatalogImpl() {
multimediaContent = new HashMap<MultimediaContent.Type, MultimediaContentImpl<? extends MultimediaContentType>>();
}
/**
* Creates a new mpeg-7 metadata container from the serialized stream.
*/
public Mpeg7CatalogImpl(InputStream in) {
this();
loadCatalogData(in);
}
/**
* Populates the catalog.
*
* @param in
* The input stream containing the content
* @throws IllegalStateException
* if reading the catalog fails
*/
private void loadCatalogData(InputStream in) throws IllegalStateException {
Mpeg7Parser parser = new Mpeg7Parser(this);
try {
parser.parse(in);
} catch (Exception e) {
throw new IllegalStateException("Unable to load mpeg-7 catalog data:" + e.getMessage(), e);
}
}
/**
* Creates a new mpeg-7 metadata container file.
*
* @return the new mpeg-7 metadata container
*/
public static Mpeg7CatalogImpl newInstance() {
Mpeg7CatalogImpl mpeg7 = new Mpeg7CatalogImpl();
return mpeg7;
}
/**
* @see org.opencastproject.metadata.mpeg7.Mpeg7#multimediaContent()
*/
public Iterator<MultimediaContent<? extends MultimediaContentType>> multimediaContent() {
List<MultimediaContent<? extends MultimediaContentType>> result = new ArrayList<MultimediaContent<? extends MultimediaContentType>>();
for (MultimediaContent<? extends MultimediaContentType> o : multimediaContent.values()) {
result.add(o);
}
return result.iterator();
}
/**
* @see org.opencastproject.metadata.mpeg7.Mpeg7#getMultimediaContent(org.opencastproject.mediapackage.mpeg7.MultimediaContent.Type)
*/
public MultimediaContent<? extends MultimediaContentType> getMultimediaContent(MultimediaContent.Type type) {
return multimediaContent.get(type);
}
/**
* Saves the mpeg-7 metadata container to disk.
*
* @throws ParserConfigurationException
* if the xml parser environment is not correctly configured
* @throws TransformerException
* if serialization of the metadata document fails
* @throws IOException
* if an error with catalog file handling occurs
*/
public Document toXml() throws ParserConfigurationException, TransformerException, IOException {
Document doc = createDocument();
// Root element
Element root = doc.getDocumentElement();
// Description
Element descriptionNode = doc.createElement("Description");
descriptionNode.setAttribute("xsi:type", "ContentEntityType");
root.appendChild(descriptionNode);
// MultimediaContent
for (MultimediaContent<? extends MultimediaContentType> mc : multimediaContent.values()) {
descriptionNode.appendChild(mc.toXml(doc));
}
return doc;
}
/**
* Create a DOM representation of the Mpeg-7.
*/
private Document createDocument() throws ParserConfigurationException {
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Element rootElement = doc.createElementNS("urn:mpeg:mpeg7:schema:2001", "Mpeg7");
rootElement.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:mpeg7", "urn:mpeg7:schema:2001");
rootElement.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xsi",
"http://www.w3.org/2001/XMLSchema-instance");
doc.appendChild(rootElement);
return doc;
}
/**
* @see org.opencastproject.metadata.mpeg7.Mpeg7#addAudioContent(java.lang.String,
* org.opencastproject.metadata.mpeg7.MediaTime, org.opencastproject.metadata.mpeg7.MediaLocator)
*/
@SuppressWarnings("unchecked")
public Audio addAudioContent(String id, MediaTime time, MediaLocator locator) {
MultimediaContentImpl<Audio> content = (MultimediaContentImpl<Audio>) getMultimediaContent(MultimediaContent.Type.AudioType);
if (content == null) {
content = new MultimediaContentImpl<Audio>(MultimediaContent.Type.AudioType);
multimediaContent.put(MultimediaContent.Type.AudioType, content);
}
MultimediaContentTypeImpl<AudioSegment> audio = new MultimediaContentTypeImpl<AudioSegment>(MultimediaContentType.Type.Audio, id);
audio.setMediaTime(time);
audio.setMediaLocator(locator);
content.add(audio);
return audio;
}
/**
* @see org.opencastproject.metadata.mpeg7.Mpeg7#removeAudioContent(java.lang.String)
*/
public Audio removeAudioContent(String id) {
MultimediaContentType element = removeContentElement(id, MultimediaContent.Type.AudioType);
if (element != null)
return (Audio) element;
return null;
}
/**
* @see org.opencastproject.metadata.mpeg7.Mpeg7#hasAudioContent()
*/
public boolean hasAudioContent() {
MultimediaContent<?> content = getMultimediaContent(MultimediaContent.Type.AudioType);
return content != null && content.size() > 0;
}
/**
* @see org.opencastproject.metadata.mpeg7.Mpeg7#audioContent()
*/
@SuppressWarnings("unchecked")
public Iterator<Audio> audioContent() {
MultimediaContent<Audio> content = (MultimediaContent<Audio>) getMultimediaContent(MultimediaContent.Type.AudioType);
if (content != null)
return content.elements();
return null;
}
/**
* @see org.opencastproject.metadata.mpeg7.Mpeg7#addVideoContent(java.lang.String,
* org.opencastproject.mediapackage.mpeg7.MediaTime, org.opencastproject.mediapackage.mpeg7.MediaLocator)
*/
@SuppressWarnings("unchecked")
public Video addVideoContent(String id, MediaTime time, MediaLocator locator) {
MultimediaContentImpl<Video> content = (MultimediaContentImpl<Video>) getMultimediaContent(MultimediaContent.Type.VideoType);
if (content == null) {
content = new MultimediaContentImpl<Video>(MultimediaContent.Type.VideoType);
multimediaContent.put(MultimediaContent.Type.VideoType, content);
}
MultimediaContentTypeImpl<VideoSegment> video = new MultimediaContentTypeImpl<VideoSegment>(MultimediaContentType.Type.Video, id);
content.add(video);
video.setMediaTime(time);
video.setMediaLocator(locator);
return video;
}
/**
* @see org.opencastproject.metadata.mpeg7.Mpeg7#removeVideoContent(java.lang.String)
*/
public Video removeVideoContent(String id) {
MultimediaContentType element = removeContentElement(id, MultimediaContent.Type.VideoType);
if (element != null)
return (Video) element;
return null;
}
/**
* @see org.opencastproject.metadata.mpeg7.Mpeg7#hasVideoContent()
*/
public boolean hasVideoContent() {
MultimediaContent<?> content = getMultimediaContent(MultimediaContent.Type.VideoType);
return content != null && content.size() > 0;
}
/**
* @see org.opencastproject.metadata.mpeg7.Mpeg7#videoContent()
*/
@SuppressWarnings("unchecked")
public Iterator<Video> videoContent() {
MultimediaContent<Video> content = (MultimediaContent<Video>) getMultimediaContent(MultimediaContent.Type.VideoType);
if (content != null)
return content.elements();
return null;
}
/**
* @see org.opencastproject.metadata.mpeg7.Mpeg7#addAudioVisualContent(java.lang.String,
* org.opencastproject.mediapackage.mpeg7.MediaTime, org.opencastproject.mediapackage.mpeg7.MediaLocator)
*/
@SuppressWarnings("unchecked")
public AudioVisual addAudioVisualContent(String id, MediaTime time, MediaLocator locator) {
MultimediaContentImpl<AudioVisual> content = (MultimediaContentImpl<AudioVisual>) getMultimediaContent(MultimediaContent.Type.AudioVisualType);
if (content == null) {
content = new MultimediaContentImpl<AudioVisual>(MultimediaContent.Type.AudioVisualType);
multimediaContent.put(MultimediaContent.Type.AudioVisualType, content);
}
MultimediaContentTypeImpl<AudioVisualSegment> audioVisual = new MultimediaContentTypeImpl<AudioVisualSegment>(MultimediaContentType.Type.AudioVisual, id);
audioVisual.setMediaTime(time);
audioVisual.setMediaLocator(locator);
content.add(audioVisual);
return audioVisual;
}
/**
* @see org.opencastproject.metadata.mpeg7.Mpeg7#removeAudioVisualContent(java.lang.String)
*/
public AudioVisual removeAudioVisualContent(String id) {
MultimediaContentType element = removeContentElement(id, MultimediaContent.Type.AudioVisualType);
if (element != null)
return (AudioVisual) element;
return null;
}
/**
* @see org.opencastproject.metadata.mpeg7.Mpeg7#hasAudioVisualContent()
*/
public boolean hasAudioVisualContent() {
MultimediaContent<?> content = getMultimediaContent(MultimediaContent.Type.AudioVisualType);
return content != null && content.size() > 0;
}
/**
* @see org.opencastproject.metadata.mpeg7.Mpeg7#audiovisualContent()
*/
@SuppressWarnings("unchecked")
public Iterator<AudioVisual> audiovisualContent() {
MultimediaContent<AudioVisual> content = (MultimediaContent<AudioVisual>) getMultimediaContent(MultimediaContent.Type.AudioVisualType);
if (content != null)
return content.elements();
return null;
}
/**
* @see org.opencastproject.metadata.mpeg7.Mpeg7#getAudioById(java.lang.String)
*/
@SuppressWarnings("unchecked")
public Audio getAudioById(String id) {
MultimediaContent<Audio> content = (MultimediaContent<Audio>) getMultimediaContent(MultimediaContent.Type.AudioType);
if (content == null)
return null;
return content.getElementById(id);
}
/**
* @see org.opencastproject.metadata.mpeg7.Mpeg7#getAudioVisualById(java.lang.String)
*/
@SuppressWarnings("unchecked")
public AudioVisual getAudioVisualById(String id) {
MultimediaContent<AudioVisual> content = (MultimediaContent<AudioVisual>) getMultimediaContent(MultimediaContent.Type.AudioVisualType);
if (content == null)
return null;
return content.getElementById(id);
}
/**
* @see org.opencastproject.metadata.mpeg7.Mpeg7#getVideoById(java.lang.String)
*/
@SuppressWarnings("unchecked")
public Video getVideoById(String id) {
MultimediaContent<Video> content = (MultimediaContent<Video>) getMultimediaContent(MultimediaContent.Type.VideoType);
if (content == null)
return null;
return content.getElementById(id);
}
/**
* Removes the content element of the specified type with the given identifier.
*
* @param id
* the content element identifier
* @param type
* the content type
* @return the element or <code>null</code>
*/
private MultimediaContentType removeContentElement(String id, MultimediaContent.Type type) {
MultimediaContentImpl<? extends MultimediaContentType> content = multimediaContent.get(type);
if (content != null)
return content.remove(id);
return null;
}
@SuppressWarnings("unchecked")
@Override
public Mpeg7Catalog clone() {
Mpeg7CatalogImpl clone = new Mpeg7CatalogImpl();
clone.multimediaContent = (HashMap<MultimediaContent.Type, MultimediaContentImpl<? extends MultimediaContentType>>) this.multimediaContent
.clone();
return clone;
}
}