001/*
002 * Copyright (c) 2004-2020, Oracle and/or its affiliates.
003 *
004 * Licensed under the 2-clause BSD license.
005 *
006 * Redistribution and use in source and binary forms, with or without
007 * modification, are permitted provided that the following conditions are met:
008 *
009 * 1. Redistributions of source code must retain the above copyright notice,
010 *    this list of conditions and the following disclaimer.
011 *
012 * 2. Redistributions in binary form must reproduce the above copyright notice,
013 *    this list of conditions and the following disclaimer in the documentation
014 *    and/or other materials provided with the distribution.
015 *
016 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
017 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
018 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
019 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
020 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
021 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
022 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
023 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
024 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
025 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
026 * POSSIBILITY OF SUCH DAMAGE.
027 */
028
029package com.oracle.labs.mlrg.olcut.config.json;
030
031import com.fasterxml.jackson.core.JsonGenerator;
032import com.fasterxml.jackson.databind.SerializerProvider;
033import com.fasterxml.jackson.databind.ser.std.StdSerializer;
034import com.oracle.labs.mlrg.olcut.provenance.io.FlatMarshalledProvenance;
035import com.oracle.labs.mlrg.olcut.provenance.io.ListMarshalledProvenance;
036import com.oracle.labs.mlrg.olcut.provenance.io.MapMarshalledProvenance;
037import com.oracle.labs.mlrg.olcut.provenance.io.MarshalledProvenance;
038import com.oracle.labs.mlrg.olcut.provenance.io.ObjectMarshalledProvenance;
039import com.oracle.labs.mlrg.olcut.provenance.io.SimpleMarshalledProvenance;
040import com.oracle.labs.mlrg.olcut.util.Pair;
041
042import java.io.IOException;
043import java.util.Map;
044
045/**
046 * Serialization class to convert {@link MarshalledProvenance} into JSON.
047 */
048public class JsonProvenanceSerializer extends StdSerializer<MarshalledProvenance> {
049
050    public JsonProvenanceSerializer(Class<MarshalledProvenance> provClass) {
051        super(provClass);
052    }
053
054    @Override
055    public void serialize(MarshalledProvenance marshalledProvenance, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
056        Class<?> provClass = marshalledProvenance.getClass();
057        jsonGenerator.writeStartObject();
058        jsonGenerator.writeStringField(JsonProvenanceModule.MARSHALLED_CLASS,provClass.getName());
059        if (marshalledProvenance instanceof ListMarshalledProvenance) {
060            ListMarshalledProvenance lmp = (ListMarshalledProvenance) marshalledProvenance;
061            jsonGenerator.writeArrayFieldStart(JsonProvenanceModule.LIST);
062            for (FlatMarshalledProvenance e : lmp) {
063                jsonGenerator.writeObject(e);
064            }
065            jsonGenerator.writeEndArray();
066        } else if (marshalledProvenance instanceof MapMarshalledProvenance) {
067            MapMarshalledProvenance mmp = (MapMarshalledProvenance) marshalledProvenance;
068            jsonGenerator.writeObjectFieldStart(JsonProvenanceModule.MAP);
069            for (Pair<String, FlatMarshalledProvenance> e : mmp) {
070                jsonGenerator.writeObjectField(e.getA(),e.getB());
071            }
072            jsonGenerator.writeEndObject();
073        } else if (marshalledProvenance instanceof ObjectMarshalledProvenance) {
074            ObjectMarshalledProvenance omp = (ObjectMarshalledProvenance) marshalledProvenance;
075            jsonGenerator.writeStringField(JsonProvenanceModule.OBJECT_NAME,omp.getName());
076            jsonGenerator.writeStringField(JsonProvenanceModule.OBJECT_CLASS_NAME,omp.getObjectClassName());
077            jsonGenerator.writeStringField(JsonProvenanceModule.PROVENANCE_CLASS,omp.getProvenanceClassName());
078            jsonGenerator.writeObjectFieldStart(JsonProvenanceModule.MAP);
079            for (Map.Entry<String, FlatMarshalledProvenance> e : omp.getMap().entrySet()) {
080                jsonGenerator.writeObjectField(e.getKey(),e.getValue());
081            }
082            jsonGenerator.writeEndObject();
083        } else if (marshalledProvenance instanceof SimpleMarshalledProvenance) {
084            SimpleMarshalledProvenance smp = (SimpleMarshalledProvenance) marshalledProvenance;
085            jsonGenerator.writeStringField(JsonProvenanceModule.KEY,smp.getKey());
086            jsonGenerator.writeStringField(JsonProvenanceModule.VALUE,smp.getValue());
087            jsonGenerator.writeStringField(JsonProvenanceModule.PROVENANCE_CLASS,smp.getProvenanceClassName());
088            jsonGenerator.writeStringField(JsonProvenanceModule.ADDITIONAL,smp.getAdditional());
089            jsonGenerator.writeBooleanField(JsonProvenanceModule.IS_REFERENCE,smp.isReference());
090        } else {
091            throw new IOException("Unexpected provenance class, found " + provClass.getName());
092        }
093        jsonGenerator.writeEndObject();
094    }
095}