package com.atlassian.labs.speakeasy.util;
import com.atlassian.labs.speakeasy.model.JsonManifest;
import com.atlassian.plugins.rest.common.json.JacksonJsonProviderFactory;
import org.apache.commons.io.IOUtils;
import org.apache.poi.hssf.record.formula.functions.T;
import org.codehaus.jackson.jaxrs.JacksonJsonProvider;
import org.json.JSONException;
import org.json.JSONObject;
import javax.ws.rs.core.MediaType;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
import static java.util.Collections.emptyList;
/**
*
*/
public class JsonObjectMapper
{
public static <T>T read(Class<T> objectType, String data) throws IOException
{
return read(objectType, new ByteArrayInputStream(data.getBytes()));
}
/**
* Reads from a stream to create an object. Closes the input stream
*/
public static <T>T read(Class<T> objectType, InputStream in) throws IOException
{
try
{
// this is lame but needed to get it to compile
Class<Object> foo = (Class<Object>) JsonObjectMapper.class.getClassLoader().loadClass(objectType.getName());
return (T) createProvider().readFrom(foo, objectType, null, MediaType.APPLICATION_JSON_TYPE, null, in);
}
catch (ClassNotFoundException e)
{
throw new RuntimeException(e);
}
finally
{
IOUtils.closeQuietly(in);
}
}
private static JacksonJsonProvider createProvider()
{
final JacksonJsonProviderFactory jacksonJsonProviderFactory = new JacksonJsonProviderFactory();
Class<? extends JacksonJsonProviderFactory> factoryClass = jacksonJsonProviderFactory.getClass();
JacksonJsonProvider provider = null;
try
{
try
{
provider = (JacksonJsonProvider) factoryClass.getMethod("create").invoke(jacksonJsonProviderFactory);
}
catch (NoSuchMethodException e)
{
try
{
provider = (JacksonJsonProvider) factoryClass.getMethod("create", Iterable.class).invoke(jacksonJsonProviderFactory, emptyList());
}
catch (NoSuchMethodException ex)
{
throw new IllegalStateException("Unable to find a way to create a jackson json provider");
}
}
}
catch (InvocationTargetException e)
{
throw new RuntimeException(e.getCause());
}
catch (IllegalAccessException e)
{
throw new RuntimeException(e);
}
return provider;
}
public static String write(Object object) throws IOException
{
ByteArrayOutputStream bout = new ByteArrayOutputStream();
write(object, bout);
try
{
JSONObject result = new JSONObject(new String(bout.toByteArray(), "UTF-8"));
return result.toString(2);
}
catch (JSONException e)
{
throw new IOException("Unable to write json");
}
}
public static void write(Object object, OutputStream out) throws IOException
{
createProvider().writeTo(object, object.getClass(), object.getClass(), null, MediaType.APPLICATION_JSON_TYPE, null, out);
}
public static void write(Object object, Writer writer) throws IOException
{
String result = write(object);
writer.write(result);
}
}