/** * 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.impl; import org.opencastproject.smil.api.SmilException; import org.opencastproject.smil.api.SmilResponse; import org.opencastproject.smil.entity.SmilImpl; import org.opencastproject.smil.entity.SmilObjectImpl; import org.opencastproject.smil.entity.api.Smil; import org.opencastproject.smil.entity.api.SmilObject; import org.apache.commons.io.IOUtils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.StringWriter; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlRootElement; /** * {@link SmilResponse} implementation. */ @XmlAccessorType(XmlAccessType.NONE) @XmlRootElement(name = "smil-response", namespace = "http://smil.opencastproject.org") public class SmilResponseImpl implements SmilResponse { /** * Smil */ private Smil smil; /** * Entities */ private SmilObject[] entities; /** * Empty constructor (needed for JAXB). */ private SmilResponseImpl() { smil = null; entities = null; } /** * Constructor * * @param smil to set */ public SmilResponseImpl(Smil smil) { this(smil, new SmilObject[]{}); } /** * Constructor. * * @param smil to set * @param entity to set */ public SmilResponseImpl(Smil smil, SmilObject entity) { this(smil, new SmilObject[]{entity}); } /** * Constructor. * * @param smil to set * @param entities to set */ public SmilResponseImpl(Smil smil, SmilObject[] entities) { this.smil = smil; this.entities = entities; } /** * {@inheritDoc } */ @XmlElement(type = SmilImpl.class, required = true) @Override public Smil getSmil() { return smil; } /** * Set {@link Smil}. * * @param smil to set */ private void setSmil(Smil smil) { this.smil = smil; } /** * {@inheritDoc } */ @Override public int getEntitiesCount() { if (entities == null) { return 0; } else { return entities.length; } } /** * {@inheritDoc } */ @Override public SmilObject getEntity() throws SmilException { if (entities.length == 0) { throw new SmilException("There is no entity."); } if (entities.length > 1) { throw new SmilException("There is more than one entity."); } return entities[0]; } /** * {@inheritDoc } */ @Override public SmilObject[] getEntities() throws SmilException { if (entities.length == 0) { throw new SmilException("There are no entities."); } return entities; } /** * {@inheritDoc } */ @Override public String toXml() throws JAXBException { StringWriter writer = new StringWriter(); JAXBContext ctx = JAXBContext.newInstance(SmilResponseImpl.class); Marshaller marshaller = ctx.createMarshaller(); // marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshaller.marshal(this, writer); return writer.toString(); } /** * Deserialize {@link SmilResponse} from XML. * * @param smilResponseXml {@link SmilResponse} as XML * @return {@link SmilResponse} object * @throws JAXBException if deserialization fail */ public static SmilResponse fromXml(String smilResponseXml) throws JAXBException { InputStream smilStream = IOUtils.toInputStream(smilResponseXml); try { return fromXml(smilStream); } finally { IOUtils.closeQuietly(smilStream); } } /** * Deserialize {@link SmilResponse} from XML. * * @param smilResponseXmlFile {@link SmilResponse} as XML {@link File} * @return {@link SmilResponse} object * @throws JAXBException if deserialization fail */ public static SmilResponse fromXml(File smilResponseXmlFile) throws JAXBException, FileNotFoundException { FileInputStream smilStream = new FileInputStream(smilResponseXmlFile); try { return fromXml(smilStream); } finally { IOUtils.closeQuietly(smilStream); } } /** * Deserialize {@link SmilResponse} from XML. * * @param smilResponseXml {@link SmilResponse} as XML {@link InputStream} * @return {@link SmilResponse} object * @throws JAXBException if deserialization fail */ protected static SmilResponse fromXml(InputStream smilResponseXml) throws JAXBException { StringWriter writer = new StringWriter(); JAXBContext ctx = JAXBContext.newInstance(SmilResponseImpl.class); Unmarshaller unmarshaller = ctx.createUnmarshaller(); return (SmilResponse) unmarshaller.unmarshal(smilResponseXml); } /** * JAXB helper method. * * @return */ @XmlElementRef private SmilResponseEntity<SmilObject>[] getResponseEntities() { SmilResponseEntity[] entitiesWrapped = new SmilResponseEntity[entities.length]; for (int i = 0; i < entities.length; i++) { entitiesWrapped[i] = new SmilResponseEntity(entities[i]); } return entitiesWrapped; } /** * JAXB helper method. * * @param entities */ private void setResponseEntities(SmilResponseEntity<SmilObject>[] entities) { this.entities = new SmilObject[entities.length]; for (int e = 0; e < entities.length; e++) { this.entities[e] = entities[e].getEntity(); } } /** * {@link SmilObject} wrapper class for serialization. * * @param <SmilObject> */ @XmlRootElement(name = "entity", namespace = "http://smil.opencastproject.org") private static class SmilResponseEntity<SmilObject> { private SmilObject entity; SmilResponseEntity() { } SmilResponseEntity(SmilObject entity) { this.entity = entity; } @XmlElementRef(type = SmilObjectImpl.class) public SmilObject getEntity() { return entity; } private void setEntity(SmilObject entity) { this.entity = entity; } } }