/**
* 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.smil.entity;
import org.opencastproject.smil.entity.api.SmilHead;
import org.opencastproject.smil.entity.api.SmilMeta;
import org.opencastproject.smil.entity.api.SmilObject;
import org.opencastproject.smil.entity.media.param.SmilMediaParamGroupImpl;
import org.opencastproject.smil.entity.media.param.api.SmilMediaParam;
import org.opencastproject.smil.entity.media.param.api.SmilMediaParamGroup;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRootElement;
/**
* {@link SmilHead} implementation.
*/
@XmlRootElement(name = "head")
public class SmilHeadImpl extends SmilObjectImpl implements SmilHead {
/**
* Meta data elements.
*/
private List<SmilMeta> metas = new LinkedList<SmilMeta>();
/**
* Param group elements.
*/
private List<SmilMediaParamGroup> paramGroups = new LinkedList<SmilMediaParamGroup>();
/**
* {@inheritDoc}
*/
@Override
public List<SmilMeta> getMetas() {
return Collections.unmodifiableList(metas);
}
/**
* Returns {@link List} of {@link SmilMeta} objects.
*
* @return the meta data elements
*/
@XmlElementRef(type = SmilMetaImpl.class)
protected List<SmilMeta> getMetasList() {
return metas;
}
/**
* Set {@link List} with {@link SmilMeta} objects.
*
* @param metas the meta data elements to set
*/
protected void setMetasList(List<SmilMeta> metas) {
this.metas = metas;
}
/**
* {@inheritDoc}
*/
@Override
public List<SmilMediaParamGroup> getParamGroups() {
return Collections.unmodifiableList(paramGroups);
}
/**
* Returns {@link List} of {@link SmilMediaParamGroup} objects.
*
* @return the param groups
*/
@XmlElementRef(type = SmilMediaParamGroupImpl.class)
protected List<SmilMediaParamGroup> getParamGroupsList() {
return paramGroups;
}
/**
* Set {@link List} of {@link SmilMediaParamGroup} objects.
*
* @param paramGroups the param groups to set
*/
protected void setParamGroupsList(List<SmilMediaParamGroup> paramGroups) {
this.paramGroups = paramGroups;
}
/**
* {@inheritDoc}
*/
@Override
protected String getIdPrefix() {
return "h";
}
/**
* {@inheritDoc}
*/
@Override
public SmilObject removeElement(String elementId) {
SmilObject child = null;
for (SmilObject meta : metas) {
if (meta.getId().equals(elementId)) {
child = meta;
break;
}
}
if (child != null) {
metas.remove(child);
return child;
}
for (SmilObject paramGroup : paramGroups) {
if (paramGroup.getId().equals(elementId)) {
child = paramGroup;
break;
} else {
SmilObject removedElement = ((SmilMediaParamGroupImpl) paramGroup).removeElement(elementId);
if (removedElement != null) {
return removedElement;
}
}
}
if (child != null) {
paramGroups.remove(child);
return child;
}
return null;
}
/**
* Remove all elements inside.
*/
public void clear() {
metas.clear();
paramGroups.clear();
}
/**
* Returns {@link SmilMeta} element with given name.
*
* @param name {@link SmilMeta} element name
* @return{@link SmilMeta} element or null
*/
public SmilMeta getMetaByName(String name) {
for (SmilMeta m : metas) {
if (m.getName().equals(name)) {
return m;
}
}
return null;
}
/**
* Add new {@link SmilMeta} with given values.
*
* @param name {@link SmilMeta} name
* @param content {@link SmilMeta} content
* @return the new {@link SmilMeta}
*/
public SmilMeta addMeta(String name, String content) {
SmilMeta meta = getMetaByName(name);
if (meta != null) {
((SmilMetaImpl) meta).setName(name);
((SmilMetaImpl) meta).setContent(content);
} else {
meta = new SmilMetaImpl(name, content);
metas.add(meta);
}
return meta;
}
/**
* Add given {@link SmilMeta} element.
*
* @param meta {@link SmilMeta} to add
*/
public void addMeta(SmilMeta meta) {
SmilObject m = getElementOrNull(meta.getId());
if (m != null && m instanceof SmilMeta) {
((SmilMetaImpl) m).setName(meta.getName());
((SmilMetaImpl) m).setContent(meta.getContent());
} else {
metas.add(meta);
}
}
/**
* Remove {@link SmilMeta} element with given name.
*
* @param name {@link SmilMeta} name
*/
public void removeMetaByName(String name) {
SmilMeta metaFound = getMetaByName(name);
if (metaFound != null) {
metas.remove(metaFound);
}
}
/**
* Add param group and its content if not exists.
*
* @param group param group
*/
public void addParamGroup(SmilMediaParamGroup group) {
if (group == null) {
return;
}
SmilObject g = getElementOrNull(group.getId());
if (g != null && g instanceof SmilMediaParamGroup) {
for (SmilMediaParam p : group.getParams()) {
((SmilMediaParamGroupImpl) g).addParam(p);
}
} else {
paramGroups.add(group);
}
}
/**
* Remove given param group.
*
* @param group param group to remove
*/
public void removeParamGroup(SmilMediaParamGroup group) {
SmilObject g = getElementOrNull(group.getId());
if (g != null && g instanceof SmilMediaParamGroup) {
paramGroups.remove(g);
}
}
/**
* {@inheritDoc}
*/
@Override
public SmilObject getElementOrNull(String elementId) {
if (getId().equals(elementId)) {
return this;
}
SmilObject element = null;
for (SmilMeta meta : metas) {
element = ((SmilMetaImpl) meta).getElementOrNull(elementId);
if (element != null) {
return element;
}
}
for (SmilMediaParamGroup paramGroup : paramGroups) {
element = ((SmilMediaParamGroupImpl) paramGroup).getElementOrNull(elementId);
if (element != null) {
return element;
}
}
return null;
}
/**
* {@inheritDoc}
*/
@Override
public void putAllChilds(List<SmilObject> elements) {
for (SmilObject meta : getMetas()) {
elements.add(meta);
((SmilObjectImpl) meta).putAllChilds(elements);
}
for (SmilObject paramGroup : getParamGroups()) {
elements.add(paramGroup);
((SmilObjectImpl) paramGroup).putAllChilds(elements);
}
}
}