org.eclipse.recommenders.utils.gson.GsonUtil.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.recommenders.utils.gson.GsonUtil.java

Source

/**
 * 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;
    }
}