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}