From 1410d4b251a15d9350edf0d69b7c18670da1b365 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Wed, 25 Jun 2014 14:13:49 -0400 Subject: [PATCH] made versioning slightly better --- .../saving/DimDataProcessor.java | 61 ++++++++++++++----- 1 file changed, 47 insertions(+), 14 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/saving/DimDataProcessor.java b/src/main/java/StevenDimDoors/mod_pocketDim/saving/DimDataProcessor.java index b6880f62..d42b8efb 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/saving/DimDataProcessor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/saving/DimDataProcessor.java @@ -19,17 +19,22 @@ import com.google.gson.stream.JsonReader; public class DimDataProcessor extends BaseConfigurationProcessor { public final String JSON_VERSION_PROPERTY_NAME = "SAVE_DATA_VERSION_ID_INSTANCE"; - private HashMap SAVE_DATA_DEFINITIONS; + private HashMap SAVE_DATA_SCHEMA; private static final JsonParser jsonParser = new JsonParser(); - public static final String currentSaveVersionPath = "/assets/dimdoors/text/Dim_Data_Schema_v1-0-0.json"; - - + + public static final String BASE_SCHEMA_PATH = "/assets/dimdoors/text/"; + + //TODO dont load the schemas every time public DimDataProcessor() { - SAVE_DATA_DEFINITIONS = new HashMap(); - SAVE_DATA_DEFINITIONS.put(982405775, "/assets/dimdoors/text/Dim_Data_Schema_v982405775.json"); - SAVE_DATA_DEFINITIONS.put(PackedDimData.SAVE_DATA_VERSION_ID, currentSaveVersionPath); + SAVE_DATA_SCHEMA = new HashMap(); + + //Load the old schema/s + SAVE_DATA_SCHEMA.put(982405775, loadSchema(BASE_SCHEMA_PATH+"Dim_Data_Schema_v982405775.json")); + + //load the current schema + SAVE_DATA_SCHEMA.put(PackedDimData.SAVE_DATA_VERSION_ID, loadSchema(BASE_SCHEMA_PATH+"Dim_Data_Schema_v1-0-0.json")); } @Override @@ -59,14 +64,15 @@ public class DimDataProcessor extends BaseConfigurationProcessor { //create a json object from a packedDimData instance GsonBuilder gsonBuilder = new GsonBuilder(); - Gson gson = gsonBuilder.setPrettyPrinting().create(); + gsonBuilder.setPrettyPrinting(); + Gson gson = gsonBuilder.create(); JsonElement ele = gson.toJsonTree(data); - + try { //ensure our json object corresponds to our schema JSONValidator.validate(getSaveDataSchema(ele.getAsJsonObject()), ele); - outputStream.write(ele.toString().getBytes("UTF-8")); + outputStream.write(gson.toJson(ele).getBytes("UTF-8")); outputStream.close(); } catch (Exception e) @@ -77,14 +83,28 @@ public class DimDataProcessor extends BaseConfigurationProcessor } - + /** + * validates the save file against it's current version, then updates and validates it again if it needs it + * then it loads it + * @param reader + * @return + * @throws IOException + */ public PackedDimData readDimDataJson(JsonReader reader) throws IOException { + //read the save file into a Json element JsonElement ele = jsonParser.parse(reader); + + //get the schema that corresponds to the save file's listed version number JsonObject schema = this.getSaveDataSchema(ele.getAsJsonObject()); + + //validate the save file against its schema JSONValidator.validate(schema, ele); + + //handle updating old save data ele = processSaveData(schema, ele.getAsJsonObject()); + //convert the updated and verified json into an instance of PackedDimData GsonBuilder gsonBuilder = new GsonBuilder(); return gsonBuilder.create().fromJson(ele, PackedDimData.class); } @@ -97,13 +117,24 @@ public class DimDataProcessor extends BaseConfigurationProcessor */ public JsonObject getSaveDataSchema(JsonObject obj) { - String schemaPath = this.SAVE_DATA_DEFINITIONS.get(obj.get(JSON_VERSION_PROPERTY_NAME).getAsInt()); + JsonObject schema = this.SAVE_DATA_SCHEMA.get(obj.get(JSON_VERSION_PROPERTY_NAME).getAsInt()); - if(schemaPath == null) + if(schema == null) { throw new IllegalStateException("Invalid save data version"); } - InputStream in = this.getClass().getResourceAsStream(schemaPath); + + return schema; + } + + /** + * Internally load the save data schema so we dont load them every single time we validate save data + * @param path + * @return + */ + private JsonObject loadSchema(String path) + { + InputStream in = this.getClass().getResourceAsStream(path); JsonReader reader = new JsonReader(new InputStreamReader(in)); JsonObject schema = jsonParser.parse(reader).getAsJsonObject(); @@ -118,6 +149,7 @@ public class DimDataProcessor extends BaseConfigurationProcessor e.printStackTrace(); throw new IllegalStateException("Could not load Json Save Data definitions"); } + return schema; } @@ -152,6 +184,7 @@ public class DimDataProcessor extends BaseConfigurationProcessor save.addProperty("DimensionType",type.index); save.remove(this.JSON_VERSION_PROPERTY_NAME); save.addProperty(this.JSON_VERSION_PROPERTY_NAME, PackedDimData.SAVE_DATA_VERSION_ID); + return processSaveData(this.getSaveDataSchema(save), save); } JSONValidator.validate(this.getSaveDataSchema(save), save);