/** * Copyright (c) 2011 Cloudsmith Inc. and other contributors, as listed below. * 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: * Cloudsmith * */ package org.cloudsmith.geppetto.catalog.util; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.Iterator; import org.cloudsmith.geppetto.catalog.Catalog; import org.cloudsmith.geppetto.catalog.CatalogEdge; import org.cloudsmith.geppetto.catalog.CatalogResource; import org.cloudsmith.geppetto.catalog.CatalogResourceParameter; import org.cloudsmith.geppetto.catalog.impl.CatalogEdgeImpl; import org.cloudsmith.geppetto.catalog.impl.CatalogImpl; import org.cloudsmith.geppetto.catalog.impl.CatalogMetadataImpl; import org.cloudsmith.geppetto.catalog.impl.CatalogResourceImpl; import org.cloudsmith.geppetto.catalog.impl.CatalogResourceParameterImpl; import org.cloudsmith.geppetto.common.os.StreamUtil; import org.eclipse.emf.common.util.EList; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import com.google.gson.reflect.TypeToken; public class CatalogJsonSerializer { public static abstract class ContainerDeserializer<T> implements JsonDeserializer<T> { protected static <T> void deserializeInto(JsonElement json, EList<T> result, Class<? extends T> cls, JsonDeserializationContext context) { JsonArray jsonTypes = json.getAsJsonArray(); Iterator<JsonElement> elements = jsonTypes.iterator(); while(elements.hasNext()) { @SuppressWarnings("unchecked") T elem = (T) context.deserialize(elements.next(), cls); result.add(elem); } } } public static class EListSerializer<T> implements JsonSerializer<EList<T>> { @Override public JsonElement serialize(EList<T> src, java.lang.reflect.Type typeOfSrc, JsonSerializationContext context) { JsonArray result = new JsonArray(); for(T elem : src) result.add(context.serialize(elem)); return result; } } private static final GsonBuilder gsonBuilder; static { GsonBuilder bld = new GsonBuilder(); bld.setPrettyPrinting(); bld.excludeFieldsWithoutExposeAnnotation(); // CatalogResource bld.registerTypeAdapter(new TypeToken<EList<CatalogResource>>() { }.getType(), new EListSerializer<CatalogResource>()); bld.registerTypeAdapter(new TypeToken<CatalogResourceImpl>() { }.getType(), new CatalogResourceImpl.JsonAdapter()); // CatalogEdge bld.registerTypeAdapter(new TypeToken<EList<CatalogEdge>>() { }.getType(), new EListSerializer<CatalogEdge>()); bld.registerTypeAdapter(new TypeToken<CatalogEdgeImpl>() { }.getType(), new CatalogEdgeImpl.JsonAdapter()); // List of Strings bld.registerTypeAdapter(new TypeToken<EList<String>>() { }.getType(), new EListSerializer<String>()); // Catalog bld.registerTypeAdapter(new TypeToken<CatalogImpl>() { }.getType(), new CatalogImpl.JsonAdapter()); // CatalogMetadata bld.registerTypeAdapter(new TypeToken<CatalogMetadataImpl>() { }.getType(), new CatalogMetadataImpl.JsonAdapter()); // CatalogResourceParameter bld.registerTypeAdapter(new TypeToken<CatalogResourceParameterImpl>() { }.getType(), new CatalogResourceParameterImpl.JsonAdapter()); bld.registerTypeAdapter(new TypeToken<EList<CatalogResourceParameter>>() { }.getType(), new EListSerializer<CatalogResourceParameter>()); gsonBuilder = bld; } public static Gson getGSon() { return gsonBuilder.create(); } /** * Loads a Catalog model from a catalog JSON file. * */ public static Catalog load(File jsonFile) throws IOException { Reader reader = new BufferedReader(new FileReader(jsonFile)); try { Gson gson = getGSon(); CatalogImpl md = gson.fromJson(reader, CatalogImpl.class); return md; } finally { StreamUtil.close(reader); } } /** * Loads a Catalog model from a catalog JSON input stream. * */ public static Catalog load(InputStream jsonStream) throws IOException { Reader reader = new BufferedReader(new InputStreamReader(jsonStream)); try { Gson gson = getGSon(); CatalogImpl md = gson.fromJson(reader, CatalogImpl.class); return md; } finally { StreamUtil.close(reader); } } /** * Loads a Catalog model from a catalog JSON string. * */ public static Catalog load(String jsonString) throws IOException { Gson gson = getGSon(); CatalogImpl md = gson.fromJson(jsonString, CatalogImpl.class); return md; } }