Implemented JSON De/serializers, configs can now save/load to file properly

This commit is contained in:
2020-08-23 13:48:15 -05:00
parent b39742d17f
commit 06277911fc
16 changed files with 423 additions and 48 deletions

View File

@@ -4,16 +4,28 @@ import android.util.Log;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import com.google.gson.internal.LinkedTreeMap;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Action;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Configuration; import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Configuration;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Group; import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Group;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Preset; import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Presets;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Variable;
import org.timecrafters.TimeCraftersConfigurationTool.serializers.ActionDeserializer;
import org.timecrafters.TimeCraftersConfigurationTool.serializers.ActionSerializer;
import org.timecrafters.TimeCraftersConfigurationTool.serializers.ConfigDeserializer;
import org.timecrafters.TimeCraftersConfigurationTool.serializers.ConfigSerializer;
import org.timecrafters.TimeCraftersConfigurationTool.serializers.ConfigurationDeserializer;
import org.timecrafters.TimeCraftersConfigurationTool.serializers.ConfigurationSerializer;
import org.timecrafters.TimeCraftersConfigurationTool.serializers.GroupDeserializer;
import org.timecrafters.TimeCraftersConfigurationTool.serializers.GroupSerializer;
import org.timecrafters.TimeCraftersConfigurationTool.serializers.PresetsDeserializer;
import org.timecrafters.TimeCraftersConfigurationTool.serializers.PresetsSerializer;
import org.timecrafters.TimeCraftersConfigurationTool.serializers.SettingsDeserializer; import org.timecrafters.TimeCraftersConfigurationTool.serializers.SettingsDeserializer;
import org.timecrafters.TimeCraftersConfigurationTool.serializers.SettingsSerializer; import org.timecrafters.TimeCraftersConfigurationTool.serializers.SettingsSerializer;
import org.timecrafters.TimeCraftersConfigurationTool.serializers.VariableDeserializer;
import org.timecrafters.TimeCraftersConfigurationTool.serializers.VariableSerializer;
import org.timecrafters.TimeCraftersConfigurationTool.tacnet.Server; import org.timecrafters.TimeCraftersConfigurationTool.tacnet.Server;
import java.io.BufferedInputStream;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
@@ -21,13 +33,8 @@ import java.io.FileReader;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.FilenameFilter; import java.io.FilenameFilter;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
public class Backend { public class Backend {
private static final String TAG = "Backend"; private static final String TAG = "Backend";
@@ -49,8 +56,6 @@ public class Backend {
loadSettings(); loadSettings();
if (!settings.config.isEmpty()) { if (!settings.config.isEmpty()) {
loadConfig(settings.config); loadConfig(settings.config);
} else {
config = new Config("DEBUG DEBUG DEBUG");
} }
tacnet = new TACNET(); tacnet = new TACNET();
@@ -105,6 +110,8 @@ public class Backend {
config.getConfiguration().updatedAt = new Date(); config.getConfiguration().updatedAt = new Date();
config.getConfiguration().revision += 1; config.getConfiguration().revision += 1;
configChanged = true; configChanged = true;
saveConfig();
} }
public boolean isConfigChanged() { return configChanged; } public boolean isConfigChanged() { return configChanged; }
@@ -114,14 +121,18 @@ public class Backend {
File file = new File(path); File file = new File(path);
if (file.exists() && file.isFile()) { if (file.exists() && file.isFile()) {
config = new Config(name, path); config = gsonForConfig().fromJson(readFromFile(path), Config.class);
config.setName(name);
} }
} }
public boolean saveConfig(String name) { public boolean saveConfig() {
// TODO: Implement save config if (config == null) { return false; }
final String path = "" + TAC.CONFIGS_PATH + File.separator + getConfig().getName() + ".json";
configChanged = false; configChanged = false;
return false;
return writeToFile(path, gsonForConfig().toJson(config));
} }
public void uploadConfig() { public void uploadConfig() {
@@ -173,13 +184,26 @@ public class Backend {
return list; return list;
} }
// TODO: Write De/serializers for config
public Gson gsonForConfig() { public Gson gsonForConfig() {
// return new GsonBuilder() return new GsonBuilder()
// .registerTypeAdapter(Config.class, new ConfigSerializer()) .registerTypeAdapter(Config.class, new ConfigSerializer())
// .registerTypeAdapter(COnfig.class, new ConfigDeserializer()) .registerTypeAdapter(Config.class, new ConfigDeserializer())
// .create();
return new GsonBuilder().create(); .registerTypeAdapter(Configuration.class, new ConfigurationSerializer())
.registerTypeAdapter(Configuration.class, new ConfigurationDeserializer())
.registerTypeAdapter(Group.class, new GroupSerializer())
.registerTypeAdapter(Group.class, new GroupDeserializer())
.registerTypeAdapter(Action.class, new ActionSerializer())
.registerTypeAdapter(Action.class, new ActionDeserializer())
.registerTypeAdapter(Variable.class, new VariableSerializer())
.registerTypeAdapter(Variable.class, new VariableDeserializer())
.registerTypeAdapter(Presets.class, new PresetsSerializer())
.registerTypeAdapter(Presets.class, new PresetsDeserializer())
.create();
} }
public void settingsChanged() { public void settingsChanged() {

View File

@@ -1,12 +1,9 @@
package org.timecrafters.TimeCraftersConfigurationTool.backend; package org.timecrafters.TimeCraftersConfigurationTool.backend;
import com.google.gson.Gson; import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Action;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Configuration; import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Configuration;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Group; import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Group;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Action; import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Presets;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Variable;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Preset;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
@@ -15,48 +12,33 @@ public class Config {
private String name; private String name;
private Configuration configuration; private Configuration configuration;
private ArrayList<Group> groups; private ArrayList<Group> groups;
private ArrayList<Preset> presets; private Presets presets;
public Config(String name) { public Config(String name) {
this.name = name; this.name = name;
this.configuration = new Configuration(new Date(), new Date(), TAC.CONFIG_SPEC_VERSION, 32); this.configuration = new Configuration(new Date(), new Date(), TAC.CONFIG_SPEC_VERSION, 0);
groups = new ArrayList<>(); groups = new ArrayList<>();
presets = new ArrayList<>(); presets = new Presets(new ArrayList<Group>(), new ArrayList<Action>());
} }
public Config(Configuration configuration, ArrayList<Group> groups, Presets presets) {
public Config(String name, String path) {
this.name = name;
parse(path);
}
public Config(Configuration configuration, ArrayList<Group> groups, ArrayList<Preset> presets) {
this.configuration = configuration; this.configuration = configuration;
this.groups = groups; this.groups = groups;
this.presets = presets; this.presets = presets;
} }
public String getName() { return name; } public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Configuration getConfiguration() { public Configuration getConfiguration() {
return configuration; return configuration;
} }
public ArrayList<Preset> getPresets() { public Presets getPresets() {
return presets; return presets;
} }
public ArrayList<Group> getGroups() { public ArrayList<Group> getGroups() {
return groups; return groups;
} }
private void parse(String path) {
Gson gson = new Gson();
String json = Backend.instance().readFromFile(path);
Config config = gson.fromJson(json, Config.class);
this.configuration = config.configuration;
this.groups = config.groups;
this.presets = config.presets;
}
} }

View File

@@ -3,6 +3,8 @@ package org.timecrafters.TimeCraftersConfigurationTool.backend.config;
import java.util.Date; import java.util.Date;
public class Configuration { public class Configuration {
public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss Z";
public Date createdAt, updatedAt; public Date createdAt, updatedAt;
private int specVersion; private int specVersion;
public int revision; public int revision;

View File

@@ -3,12 +3,20 @@ package org.timecrafters.TimeCraftersConfigurationTool.backend.config;
import java.util.ArrayList; import java.util.ArrayList;
public class Preset { public class Presets {
private ArrayList<Group> groups; private ArrayList<Group> groups;
private ArrayList<Action> actions; private ArrayList<Action> actions;
public Preset(ArrayList<Group> groups, ArrayList<Action> actions) { public Presets(ArrayList<Group> groups, ArrayList<Action> actions) {
this.groups = groups; this.groups = groups;
this.actions = actions; this.actions = actions;
} }
public ArrayList<Group> getGroups() {
return groups;
}
public ArrayList<Action> getActions() {
return actions;
}
} }

View File

@@ -0,0 +1,33 @@
package org.timecrafters.TimeCraftersConfigurationTool.serializers;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Action;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Group;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Variable;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ActionDeserializer implements JsonDeserializer<Action> {
@Override
public Action deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
final String name = jsonObject.get("name").getAsString();
final String comment = jsonObject.get("comment").getAsString();
final boolean enabled = jsonObject.get("enabled").getAsBoolean();
Variable[] variablesArray = context.deserialize(jsonObject.get("variables"), Variable[].class);
List<Variable> variablesList = Arrays.asList(variablesArray);
ArrayList<Variable> variables = new ArrayList<>(variablesList);
return new Action(name, comment, enabled, variables);
}
}

View File

@@ -0,0 +1,27 @@
package org.timecrafters.TimeCraftersConfigurationTool.serializers;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Action;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Group;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Variable;
import java.lang.reflect.Type;
public class ActionSerializer implements JsonSerializer<Action> {
@Override
public JsonElement serialize(Action action, Type type, JsonSerializationContext context) {
JsonObject container = new JsonObject();
container.add("name", new JsonPrimitive(action.name));
container.add("comment", new JsonPrimitive(action.comment));
container.add("enabled", new JsonPrimitive(action.enabled));
container.add("variables", context.serialize(action.getVariables().toArray(), Variable[].class));
return container;
}
}

View File

@@ -0,0 +1,34 @@
package org.timecrafters.TimeCraftersConfigurationTool.serializers;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Config;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Configuration;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Group;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Presets;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ConfigDeserializer implements JsonDeserializer<Config> {
@Override
public Config deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
JsonObject data = jsonObject.get("data").getAsJsonObject();
Configuration configuration = context.deserialize(jsonObject.get("config"), Configuration.class);
Group[] groupsArray = context.deserialize(data.get("groups"), Group[].class);
List<Group> groupsList = Arrays.asList(groupsArray);
ArrayList<Group> groups = new ArrayList<>(groupsList);
Presets presets = context.deserialize(data.get("presets"), Presets.class);
return new Config(configuration, groups, presets);
}
}

View File

@@ -0,0 +1,32 @@
package org.timecrafters.TimeCraftersConfigurationTool.serializers;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Config;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Action;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Configuration;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Group;
import java.lang.reflect.Type;
public class ConfigSerializer implements JsonSerializer<Config> {
@Override
public JsonElement serialize(Config config, Type type, JsonSerializationContext context) {
JsonObject container = new JsonObject();
JsonObject result = new JsonObject();
JsonObject presets = new JsonObject();
container.add("config", context.serialize(config.getConfiguration(), Configuration.class));
result.add("groups", context.serialize(config.getGroups().toArray(), Group[].class));
presets.add("groups", context.serialize(config.getPresets().getGroups().toArray(), Group[].class));
presets.add("actions", context.serialize(config.getPresets().getActions().toArray(), Action[].class));
result.add("presets", presets);
container.add("data", result);
return container;
}
}

View File

@@ -0,0 +1,36 @@
package org.timecrafters.TimeCraftersConfigurationTool.serializers;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Configuration;
import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ConfigurationDeserializer implements JsonDeserializer<Configuration> {
@Override
public Configuration deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
JsonObject config = json.getAsJsonObject();
SimpleDateFormat dateFormat = new SimpleDateFormat(Configuration.DATE_FORMAT);
Date createdAt = new Date();
Date updatedAt = new Date();
try {
createdAt = dateFormat.parse(config.get("created_at").getAsString());
updatedAt = dateFormat.parse(config.get("updated_at").getAsString());
} catch (ParseException e) {
e.printStackTrace();
}
final int spec_version = config.get("spec_version").getAsInt();
final int revision = config.get("revision").getAsInt();
return new Configuration(createdAt, updatedAt, spec_version, revision);
}
}

View File

@@ -0,0 +1,29 @@
package org.timecrafters.TimeCraftersConfigurationTool.serializers;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Configuration;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Variable;
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
public class ConfigurationSerializer implements JsonSerializer<Configuration> {
@Override
public JsonElement serialize(Configuration configuration, Type type, JsonSerializationContext context) {
JsonObject container = new JsonObject();
SimpleDateFormat dateFormat = new SimpleDateFormat(Configuration.DATE_FORMAT);
container.add("created_at", new JsonPrimitive(dateFormat.format(configuration.createdAt)));
container.add("updated_at", new JsonPrimitive(dateFormat.format(configuration.updatedAt)));
container.add("spec_version", new JsonPrimitive(configuration.getSpecVersion()));
container.add("revision", new JsonPrimitive(configuration.revision));
return container;
}
}

View File

@@ -0,0 +1,33 @@
package org.timecrafters.TimeCraftersConfigurationTool.serializers;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Config;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Action;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Configuration;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Group;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Presets;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class GroupDeserializer implements JsonDeserializer<Group> {
@Override
public Group deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
final String name = jsonObject.get("name").getAsString();
Action[] actionsArray = context.deserialize(jsonObject.get("actions"), Action[].class);
List<Action> actionsList = Arrays.asList(actionsArray);
ArrayList<Action> actions = new ArrayList<>(actionsList);
return new Group(name, actions);
}
}

View File

@@ -0,0 +1,26 @@
package org.timecrafters.TimeCraftersConfigurationTool.serializers;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Config;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Action;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Configuration;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Group;
import java.lang.reflect.Type;
public class GroupSerializer implements JsonSerializer<Group> {
@Override
public JsonElement serialize(Group group, Type type, JsonSerializationContext context) {
JsonObject container = new JsonObject();
container.add("name", new JsonPrimitive(group.name));
container.add("actions", context.serialize(group.getActions().toArray(), Action[].class));
return container;
}
}

View File

@@ -0,0 +1,33 @@
package org.timecrafters.TimeCraftersConfigurationTool.serializers;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Action;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Group;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Presets;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class PresetsDeserializer implements JsonDeserializer<Presets> {
@Override
public Presets deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
Group[] GroupsArray = context.deserialize(jsonObject.get("groups"), Group[].class);
Action[] actionsArray = context.deserialize(jsonObject.get("actions"), Action[].class);
List<Group> groupsList = Arrays.asList(GroupsArray);
ArrayList<Group> groups = new ArrayList<>(groupsList);
List<Action> actionsList = Arrays.asList(actionsArray);
ArrayList<Action> actions = new ArrayList<>(actionsList);
return new Presets(groups, actions);
}
}

View File

@@ -0,0 +1,25 @@
package org.timecrafters.TimeCraftersConfigurationTool.serializers;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Action;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Group;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Presets;
import java.lang.reflect.Type;
public class PresetsSerializer implements JsonSerializer<Presets> {
@Override
public JsonElement serialize(Presets presets, Type type, JsonSerializationContext context) {
JsonObject container = new JsonObject();
container.add("groups", context.serialize(presets.getGroups().toArray(), Group[].class));
container.add("actions", context.serialize(presets.getActions().toArray(), Action[].class));
return container;
}
}

View File

@@ -0,0 +1,28 @@
package org.timecrafters.TimeCraftersConfigurationTool.serializers;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Action;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Group;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Variable;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class VariableDeserializer implements JsonDeserializer<Variable> {
@Override
public Variable deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
final String name = jsonObject.get("name").getAsString();
final String value = jsonObject.get("value").getAsString();
return new Variable(name, value);
}
}

View File

@@ -0,0 +1,23 @@
package org.timecrafters.TimeCraftersConfigurationTool.serializers;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Variable;
import java.lang.reflect.Type;
public class VariableSerializer implements JsonSerializer<Variable> {
@Override
public JsonElement serialize(Variable variable, Type type, JsonSerializationContext context) {
JsonObject container = new JsonObject();
container.add("name", new JsonPrimitive(variable.name));
container.add("value", new JsonPrimitive(variable.rawValue()));
return container;
}
}