/* * Copyright (c) 2015 Institut National de l'Audiovisuel, INA * * This file is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Redistributions of source code and compiled versions * must retain the above copyright notice, this list of conditions and * the following disclaimer. * * Neither the name of the copyright holder nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * You should have received a copy of the GNU Lesser General Public License * along with this file. If not, see <http://www.gnu.org/licenses/> * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. */ package fr.ina.research.amalia.model; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import fr.ina.research.amalia.AmaliaException; import fr.ina.research.amalia.model.MetadataBlock.MetadataType; import fr.ina.research.amalia.model.jaxb.Channels; import fr.ina.research.amalia.model.jaxb.Container; import fr.ina.research.amalia.model.jaxb.Content; import fr.ina.research.amalia.model.jaxb.Contents; import fr.ina.research.amalia.model.jaxb.Editlist; import fr.ina.research.amalia.model.jaxb.Localisation; import fr.ina.research.amalia.model.jaxb.Metadata; import fr.ina.research.amalia.model.jaxb.Metadatas; import fr.ina.research.amalia.model.jaxb.PtType; import fr.ina.research.amalia.model.jaxb.Segment; import fr.ina.research.amalia.model.jaxb.Segments; import fr.ina.research.amalia.model.jaxb.Shape; import fr.ina.research.amalia.model.jaxb.ShapeType; import fr.ina.research.amalia.model.tracking.TrackPosition; import fr.ina.research.amalia.model.tracking.TrackSegment; import fr.ina.research.amalia.model.tracking.TrackedObject; import fr.ina.research.rex.commons.tc.RexTimeCode; import fr.ina.research.rex.model.serialize.ModelDeserializer; import fr.ina.research.rex.model.serialize.ModelException; import fr.ina.research.rex.model.serialize.ModelSerializer; import fr.ina.research.rex.model.serialize.impl.JsonModelDeserializer; import fr.ina.research.rex.model.serialize.impl.JsonModelSerializer; import fr.ina.research.rex.model.serialize.impl.XmlModelSerializer; /** * This is the main class to create, manipulate and serialize metadata blocks. * * @author Nicolas HERVE - nherve@ina.fr */ public class MetadataFactory { public static LocalisationBlock createLocalisationBlock() throws AmaliaException { LocalisationBlock l = new LocalisationBlock(); return l; } public static LocalisationBlock createLocalisationBlock(RexTimeCode tc) throws AmaliaException { return createLocalisationBlock(tc.toString()); } public static LocalisationBlock createLocalisationBlock(RexTimeCode tcin, RexTimeCode tcout) throws AmaliaException { return createLocalisationBlock(tcin.toString(), tcout.toString()); } public static LocalisationBlock createLocalisationBlock(String tc) throws AmaliaException { return createLocalisationBlock().setTc(tc); } public static LocalisationBlock createLocalisationBlock(String tcin, String tcout) throws AmaliaException { return createLocalisationBlock().setTcin(tcin).setTcout(tcout); } public static MetadataBlock createMetadataBlock() throws AmaliaException { MetadataBlock w = new MetadataBlock(); return w.setProcessedNow(); } public static MetadataBlock createMetadataBlock(String id) throws AmaliaException { MetadataBlock w = createMetadataBlock(); return w.setId(id); } public static MetadataBlock createMetadataBlock(String id, MetadataType type) throws AmaliaException { MetadataBlock w = createMetadataBlock(id); return w.setType(type); } public static MetadataBlock createMetadataBlock(String id, MetadataType type, RexTimeCode duration) throws AmaliaException { return createMetadataBlock(id, type, new RexTimeCode(0), duration); } public static MetadataBlock createMetadataBlock(String id, MetadataType type, RexTimeCode tcin, RexTimeCode tcout) throws AmaliaException { MetadataBlock w = createMetadataBlock(id, type); w.setRootLocalisationBlock(MetadataFactory.createLocalisationBlock(tcin, tcout)); return w; } public static MetadataBlock createMetadataBlock(String id, String type) throws AmaliaException { MetadataBlock w = createMetadataBlock(id); return w.setType(type); } public static Shape createShape(Double xc, Double yc, Double rx, Double ry, Double o, ShapeType t) throws AmaliaException { Shape s = new Shape(); s.setT(t); PtType center = new PtType(); center.setX(BigDecimal.valueOf(xc)); center.setY(BigDecimal.valueOf(yc)); s.setC(center); if (rx != null) { s.setRx(BigDecimal.valueOf(rx)); } if (ry != null) { s.setRy(BigDecimal.valueOf(ry)); } if (o != null) { s.setO(BigDecimal.valueOf(o)); } return s; } public static Container createSingleFileContainer(String id, String nativeId, String path) { Container container = new Container(); container.setVersion(container.getVersion()); container.setContents(new Contents()); container.setSegments(new Segments()); Segment segment = new Segment(); segment.setChannels(new Channels()); Content content = new Content(); content.setMetadatas(new Metadatas()); content.setEditlist(new Editlist()); segment.setId(id); segment.setLabel(nativeId); segment.setNativeId(nativeId); segment.setUri(path); container.getSegments().getSegment().add(segment); content.setId(id + "-content"); container.getContents().getContent().add(content); return container; } public static LocalisationBlock createSpatialBlock(RexTimeCode tc, double xc, double yc, double rx, double ry, double o, ShapeType t) throws AmaliaException { Shape s = createShape(xc, yc, rx, ry, o, t); return createLocalisationBlock(tc).setShape(s); } public static LocalisationBlock createSynchronizedTextLocalisationBlock(RexTimeCode tcin, RexTimeCode tcout, String text) throws AmaliaException { return createLocalisationBlock(tcin, tcout).setSynchronizedText(text); } public static LocalisationBlock createSynchronizedTextLocalisationBlock(String tcin, String tcout, String text) throws AmaliaException { return createLocalisationBlock(tcin, tcout).setSynchronizedText(text); } public static MetadataBlock createTrackingMetadataBlock(TrackedObject to, String id) throws AmaliaException { MetadataBlock m = MetadataFactory.createMetadataBlock(id, MetadataType.VISUAL_TRACKING, to.getTcIn(), to.getTcOut()); for (TrackSegment s : to) { LocalisationBlock slb = MetadataFactory.createLocalisationBlock(s.getTcIn(), s.getTcOut()); m.addToRootLocalisationBlock(slb); for (TrackPosition p : s) { LocalisationBlock spatial = MetadataFactory.createSpatialBlock(p.getTc(), p.getXc(), p.getYc(), p.getHw(), p.getHh(), p.getO(), to.getShapeType()); slb.addLocalisationBlock(spatial); } } return m; } public static MetadataBlock deserialize(ModelDeserializer<Metadata> deserializer) throws AmaliaException { try { return wrap(deserializer.deserializeNext()); } catch (ModelException e) { throw new AmaliaException(e); } } public static MetadataBlock deserializeFromJsonString(String json) throws AmaliaException { JsonModelDeserializer<Metadata> jsonReader = new JsonModelDeserializer<Metadata>(Metadata.class); return deserializeFromString(json, jsonReader); } public static MetadataBlock deserializeFromString(String data, ModelDeserializer<Metadata> deserializer) throws AmaliaException { StringReader r = new StringReader(data); deserializer.setReader(r); return deserialize(deserializer); } public static void serialize(MetadataBlock metadata, ModelSerializer<Metadata> serializer) throws AmaliaException { try { serializer.serialize(metadata.getInternal()); } catch (ModelException e) { throw new AmaliaException(e); } } public static void serializeToFile(MetadataBlock metadata, File f, ModelSerializer<Metadata> serializer) throws AmaliaException { try { FileWriter w = new FileWriter(f); serializer.setWriter(w); serialize(metadata, serializer); w.close(); } catch (IOException e) { throw new AmaliaException(e); } } public static void serializeToJsonFile(Collection<MetadataBlock> metadata, File f) throws AmaliaException { ArrayList<Metadata> a = new ArrayList<Metadata>(); for (MetadataBlock m : metadata) { a.add(m.getInternal()); } JsonModelSerializer<ArrayList> jsonWriter = new JsonModelSerializer<ArrayList>(false, ArrayList.class); try { FileWriter w = new FileWriter(f); jsonWriter.setWriter(w); jsonWriter.serialize(a); w.close(); } catch (IOException | ModelException e) { throw new AmaliaException(e); } } public static void serializeToJsonFile(MetadataBlock metadata, File f) throws AmaliaException { JsonModelSerializer<Metadata> jsonWriter = new JsonModelSerializer<Metadata>(false, Metadata.class); serializeToFile(metadata, f, jsonWriter); } public static String serializeToJsonString(Collection<MetadataBlock> listOfMetadata) throws AmaliaException { ArrayList<Metadata> a = new ArrayList<Metadata>(); for (MetadataBlock m : listOfMetadata) { a.add(m.getInternal()); } JsonModelSerializer<ArrayList> jsonWriter = new JsonModelSerializer<ArrayList>(false, ArrayList.class); StringWriter w = new StringWriter(); try { jsonWriter.setWriter(w); jsonWriter.serialize(a); } catch (ModelException e) { throw new AmaliaException(e); } return w.toString(); } public static String serializeToJsonString(MetadataBlock metadata) throws AmaliaException { JsonModelSerializer<Metadata> jsonWriter = new JsonModelSerializer<Metadata>(false, Metadata.class); return serializeToString(metadata, jsonWriter); } public static String serializeToString(MetadataBlock metadata, ModelSerializer<Metadata> serializer) throws AmaliaException { StringWriter w = new StringWriter(); serializer.setWriter(w); serialize(metadata, serializer); return w.toString(); } public static void serializeToXMLFile(MetadataBlock metadata, File f) throws AmaliaException { XmlModelSerializer<Metadata> jsonWriter = new XmlModelSerializer<Metadata>(Metadata.class); serializeToFile(metadata, f, jsonWriter); } public static String serializeToXMLString(MetadataBlock metadata) throws AmaliaException { XmlModelSerializer<Metadata> jsonWriter = new XmlModelSerializer<Metadata>(Metadata.class); return serializeToString(metadata, jsonWriter); } public static LocalisationBlock wrap(Localisation l) throws AmaliaException { return new LocalisationBlock(l); } public static MetadataBlock wrap(Metadata m) throws AmaliaException { return new MetadataBlock(m); } }