001package com.identityworksllc.iiq.common.vo;
002
003import com.fasterxml.jackson.core.JsonGenerator;
004import com.fasterxml.jackson.databind.SerializerProvider;
005import com.fasterxml.jackson.databind.ser.std.StdSerializer;
006import com.identityworksllc.iiq.common.Utilities;
007import sailpoint.api.SailPointContext;
008import sailpoint.api.SailPointFactory;
009import sailpoint.object.Script;
010import sailpoint.tools.GeneralException;
011import sailpoint.tools.xml.AbstractXmlObject;
012import sailpoint.tools.xml.XMLClass;
013import sailpoint.tools.xml.XMLObjectFactory;
014
015import java.io.IOException;
016import java.nio.charset.Charset;
017import java.util.Base64;
018import java.util.Date;
019import java.util.List;
020import java.util.Map;
021
022public class IIQObjectSerializer extends StdSerializer<Object> {
023    protected IIQObjectSerializer() {
024        this(null);
025    }
026
027    public IIQObjectSerializer(Class<Object> t) {
028        super(t);
029    }
030
031    @Override
032    public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
033        if (value == null || value instanceof AbstractXmlObject || value instanceof Script || value instanceof Map || value instanceof List || value instanceof String || value instanceof Date) {
034            gen.writeStartObject();
035
036            if (value != null) {
037                String xml = XMLObjectFactory.getInstance().toXml(value);
038                gen.writeStringField("xml", xml);
039            } else {
040                gen.writeStringField("xml", null);
041            }
042
043            String xmlClass;
044
045            if (value == null || value instanceof AbstractXmlObject || value instanceof Script) {
046                // Returns string 'null' if the input is null
047                xmlClass = Utilities.safeClassName(value);
048            } else if (value instanceof Map) {
049                xmlClass = "java.util.Map";
050            } else if (value instanceof List) {
051                xmlClass = "java.util.List";
052            } else if (value instanceof Date) {
053                xmlClass = Date.class.getName();
054            } else {
055                xmlClass = String.class.getName();
056            }
057
058            gen.writeStringField("type", xmlClass);
059
060            gen.writeEndObject();
061        } else {
062            throw new IOException("Input type must be serializable by IIQ XMLObjectFactory");
063        }
064    }
065}