Add Gson EMap TypeAdapter

Change-Id: I418f3b64d2b6fc1ad9003251ce7fc4edcf85030e
Signed-off-by: Daniel Haftstein <haftsteind@gmail.com>
diff --git a/bundles/org.eclipse.epp.logging.aeri.ide/src/org/eclipse/epp/internal/logging/aeri/ide/server/json/Json.java b/bundles/org.eclipse.epp.logging.aeri.ide/src/org/eclipse/epp/internal/logging/aeri/ide/server/json/Json.java
index 7ca739e..02d7e61 100644
--- a/bundles/org.eclipse.epp.logging.aeri.ide/src/org/eclipse/epp/internal/logging/aeri/ide/server/json/Json.java
+++ b/bundles/org.eclipse.epp.logging.aeri.ide/src/org/eclipse/epp/internal/logging/aeri/ide/server/json/Json.java
@@ -30,6 +30,7 @@
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
+import org.eclipse.emf.common.util.EMap;
 import org.eclipse.epp.logging.aeri.core.IReport;
 import org.eclipse.jdt.annotation.Nullable;
 
@@ -39,7 +40,10 @@
 import com.google.common.io.InputSupplier;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
+import com.google.gson.TypeAdapter;
 import com.google.gson.reflect.TypeToken;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonWriter;
 
 public class Json {
     public static final Type T_LIST_STRING = new TypeToken<List<String>>() {
@@ -71,6 +75,7 @@
     private static Gson createGson(boolean pretty) {
         GsonBuilder builder = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); //$NON-NLS-1$
         builder.registerTypeAdapter(UUID.class, new UuidTypeAdapter());
+        builder.registerTypeHierarchyAdapter(EMap.class, new EMapTypeAdapter());
         builder.addSerializationExclusionStrategy(new EmfFieldExclusionStrategy());
         if (pretty) {
             builder.setPrettyPrinting();
@@ -156,4 +161,30 @@
         }
         return res;
     }
+
+    private static final class EMapTypeAdapter extends TypeAdapter<EMap> {
+        @Override
+        public void write(JsonWriter out, EMap map) throws IOException {
+            if (map == null) {
+                out.nullValue();
+                return;
+            }
+            out.beginObject();
+            for (Object key : map.keySet()) {
+                out.name(key.toString());
+                Object value = map.get(key);
+                if (value == null) {
+                    out.nullValue();
+                } else {
+                    out.value(value.toString());
+                }
+            }
+            out.endObject();
+        }
+
+        @Override
+        public EMap read(JsonReader in) throws IOException {
+            throw new UnsupportedOperationException();
+        }
+    }
 }