/** * Copyright (c) 2010 Darmstadt University of Technology. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Marcel Bruch - initial API and implementation. */ package org.eclipse.recommenders.utils.gson; import static java.util.Objects.requireNonNull; import static org.eclipse.recommenders.utils.Throws.throwUnhandledException; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.Writer; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.util.Date; import java.util.LinkedList; import java.util.List; import java.util.UUID; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import org.eclipse.recommenders.utils.IOUtils; import org.eclipse.recommenders.utils.names.IFieldName; import org.eclipse.recommenders.utils.names.IMethodName; import org.eclipse.recommenders.utils.names.IPackageName; import org.eclipse.recommenders.utils.names.ITypeName; import org.eclipse.recommenders.utils.names.VmFieldName; import org.eclipse.recommenders.utils.names.VmMethodName; import org.eclipse.recommenders.utils.names.VmPackageName; import org.eclipse.recommenders.utils.names.VmTypeName; import com.google.common.collect.Multimap; import com.google.common.io.Closeables; import com.google.common.io.Files; import com.google.common.io.InputSupplier; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; public class GsonUtil { public static final Type T_LIST_STRING = new TypeToken<List<String>>() { }.getType(); private static Gson gson; public static synchronized Gson getInstance() { if (gson == null) { final GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(VmMethodName.class, new MethodNameTypeAdapter()); builder.registerTypeAdapter(IMethodName.class, new MethodNameTypeAdapter()); builder.registerTypeAdapter(VmTypeName.class, new TypeNameTypeAdapter()); builder.registerTypeAdapter(ITypeName.class, new TypeNameTypeAdapter()); builder.registerTypeAdapter(VmFieldName.class, new FieldNameTypeAdapter()); builder.registerTypeAdapter(IFieldName.class, new FieldNameTypeAdapter()); builder.registerTypeAdapter(VmPackageName.class, new PackageNameTypeAdapter()); builder.registerTypeAdapter(IPackageName.class, new PackageNameTypeAdapter()); builder.registerTypeAdapter(File.class, new FileTypeAdapter()); builder.registerTypeAdapter(UUID.class, new UuidTypeAdapter()); builder.registerTypeAdapter(Date.class, new ISO8601DateParser()); builder.registerTypeAdapter(Multimap.class, new MultimapTypeAdapter()); builder.registerTypeAdapterFactory(new MultisetTypeAdapterFactory()); builder.enableComplexMapKeySerialization(); builder.setPrettyPrinting(); gson = builder.create(); } return gson; } public static <T> T deserialize(final CharSequence json, final Type classOfT) { return deserialize(json.toString(), classOfT); } public static <T> T deserialize(final String json, final Type classOfT) { requireNonNull(json); requireNonNull(classOfT); try { return getInstance().fromJson(json, classOfT); } catch (final Exception e) { throw throwUnhandledException(e); } } public static <T> T deserialize(final File jsonFile, final Type classOfT) { requireNonNull(jsonFile); requireNonNull(classOfT); InputStream in = null; try { in = new BufferedInputStream(new FileInputStream(jsonFile)); return deserialize(in, classOfT); } catch (final Exception e) { throw throwUnhandledException(e); } finally { IOUtils.closeQuietly(in); } } public static <T> T deserialize(final InputStream jsonStream, final Type classOfT) { requireNonNull(jsonStream); requireNonNull(classOfT); Reader reader = null; try { reader = new InputStreamReader(jsonStream, StandardCharsets.UTF_8); return getInstance().fromJson(reader, classOfT); } catch (final Exception e) { throw throwUnhandledException(e); } finally { IOUtils.closeQuietly(reader); } } public static String serialize(final Object obj) { requireNonNull(obj); final StringBuilder sb = new StringBuilder(); serialize(obj, sb); return sb.toString(); } public static void serialize(final Object obj, final Appendable writer) { requireNonNull(obj); requireNonNull(writer); try { getInstance().toJson(obj, writer); } catch (final Exception e) { throw throwUnhandledException(e); } } public static void serialize(final Object obj, final File jsonFile) { requireNonNull(obj); requireNonNull(jsonFile); OutputStream out = null; try { out = new BufferedOutputStream(new FileOutputStream(jsonFile)); serialize(obj, out); } catch (final Exception e) { throw throwUnhandledException(e); } finally { IOUtils.closeQuietly(out); } } public static void serialize(final Object obj, final OutputStream out) { requireNonNull(obj); requireNonNull(out); Writer writer = null; try { writer = new OutputStreamWriter(out, StandardCharsets.UTF_8); getInstance().toJson(obj, writer); } catch (final Exception e) { throw throwUnhandledException(e); } finally { IOUtils.closeQuietly(writer); } } public static <T> List<T> deserializeZip(File zip, Class<T> classOfT) throws IOException { List<T> res = new LinkedList<>(); ZipInputStream zis = null; try { InputSupplier<FileInputStream> fis = Files.newInputStreamSupplier(zip); zis = new ZipInputStream(fis.getInput()); ZipEntry entry; while ((entry = zis.getNextEntry()) != null) { if (!entry.isDirectory()) { res.add(GsonUtil.<T>deserialize(zis, classOfT)); } } } finally { Closeables.close(zis, true); } return res; } }