Преглед изворни кода

Removed unnecessary keys in save file

Lortseam пре 5 година
родитељ
комит
3ff99e5ff3

+ 3 - 1
src/main/java/me/lortseam/completeconfig/ConfigManager.java

@@ -18,6 +18,7 @@ import me.lortseam.completeconfig.exception.IllegalAnnotationParameterException;
 import me.lortseam.completeconfig.exception.IllegalAnnotationTargetException;
 import me.lortseam.completeconfig.exception.IllegalReturnValueException;
 import me.lortseam.completeconfig.listener.Listener;
+import me.lortseam.completeconfig.serialization.CollectionSerializer;
 import me.lortseam.completeconfig.serialization.CollectionsDeserializer;
 import me.lortseam.completeconfig.serialization.EntrySerializer;
 import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
@@ -195,7 +196,7 @@ public class ConfigManager {
         if (configMap.containsKey(categoryID)) {
             throw new IllegalStateException("Duplicate category ID found: " + categoryID);
         }
-        Collection collection = new me.lortseam.completeconfig.collection.Collection();
+        Collection collection = new Collection();
         configMap.put(categoryID, collection);
         registerContainer(collection, category);
         if (collection.getEntries().isEmpty() && collection.getCollections().isEmpty()) {
@@ -307,6 +308,7 @@ public class ConfigManager {
         }
         try(Writer writer = new FileWriter(jsonPath.toString())) {
             new GsonBuilder()
+                    .registerTypeAdapter(CollectionSerializer.TYPE, new CollectionSerializer())
                     .registerTypeAdapter(EntrySerializer.TYPE, new EntrySerializer())
                     .setPrettyPrinting()
                     .create()

+ 8 - 3
src/main/java/me/lortseam/completeconfig/collection/Collection.java

@@ -1,17 +1,22 @@
 package me.lortseam.completeconfig.collection;
 
+import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import me.lortseam.completeconfig.entry.Entry;
 
 import java.util.LinkedHashMap;
 
+@AllArgsConstructor
 public class Collection {
 
-    //TODO: Do not save empty maps in json file or completely remove "entries" and "collections" keys in json file
     @Getter
-    private final LinkedHashMap<String, Entry> entries = new LinkedHashMap<>();
+    private final LinkedHashMap<String, Entry> entries;
     @Getter
-    private final LinkedHashMap<String, Collection> collections = new LinkedHashMap<>();
+    private final LinkedHashMap<String, Collection> collections;
+
+    public Collection() {
+        this(new LinkedHashMap<>(), new LinkedHashMap<>());
+    }
 
 }

+ 30 - 0
src/main/java/me/lortseam/completeconfig/serialization/CollectionDeserializer.java

@@ -0,0 +1,30 @@
+package me.lortseam.completeconfig.serialization;
+
+import com.google.gson.*;
+import com.google.gson.reflect.TypeToken;
+import me.lortseam.completeconfig.collection.Collection;
+import me.lortseam.completeconfig.entry.Entry;
+
+import java.lang.reflect.Type;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+public class CollectionDeserializer implements JsonDeserializer<Collection> {
+
+    public static final Type TYPE = new TypeToken<Collection>() {}.getType();
+
+    @Override
+    public Collection deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+        JsonObject collections = new JsonObject();
+        JsonObject entries = new JsonObject();
+        for (Map.Entry<String, JsonElement> entry : json.getAsJsonObject().entrySet()) {
+            if (entry.getValue().isJsonObject()) {
+                collections.add(entry.getKey(), entry.getValue());
+            } else {
+                entries.add(entry.getKey(), entry.getValue());
+            }
+        }
+        return new Collection(context.deserialize(collections, new TypeToken<LinkedHashMap<String, Collection>>() {}.getType()), context.deserialize(entries, new TypeToken<LinkedHashMap<String, Entry>>() {}.getType()));
+    }
+
+}

+ 21 - 0
src/main/java/me/lortseam/completeconfig/serialization/CollectionSerializer.java

@@ -0,0 +1,21 @@
+package me.lortseam.completeconfig.serialization;
+
+import com.google.gson.*;
+import com.google.gson.reflect.TypeToken;
+import me.lortseam.completeconfig.collection.Collection;
+
+import java.lang.reflect.Type;
+
+public class CollectionSerializer implements JsonSerializer<Collection> {
+
+    public static final Type TYPE = new TypeToken<Collection>() {}.getType();
+
+    @Override
+    public JsonElement serialize(Collection src, Type typeOfSrc, JsonSerializationContext context) {
+        JsonObject jsonObject = new JsonObject();
+        src.getCollections().forEach((key, collection) -> jsonObject.add(key, context.serialize(collection)));
+        src.getEntries().forEach((key, entry) -> jsonObject.add(key, context.serialize(entry)));
+        return jsonObject;
+    }
+
+}

+ 1 - 0
src/main/java/me/lortseam/completeconfig/serialization/CollectionsDeserializer.java

@@ -41,6 +41,7 @@ public class CollectionsDeserializer implements JsonDeserializer<LinkedHashMap<S
         }
         new GsonBuilder()
                 .registerTypeAdapter(CollectionsDeserializer.TYPE, new CollectionsDeserializer(collection.getCollections()))
+                .registerTypeAdapter(CollectionDeserializer.TYPE, new CollectionDeserializer())
                 .registerTypeAdapter(EntriesDeserializer.TYPE, new EntriesDeserializer(collection.getEntries()))
                 .create()
                 .fromJson(element, Collection.class);