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}