Browse Source

Major Update loading and storing

Teh-Hai Julian Zheng 7 years ago
parent
commit
55dbf42f76

+ 1 - 2
src/ui/controller/Control.java

@@ -59,8 +59,7 @@ public class Control {
 		this.canvasController = new CanvasController(model, multiPurposeController);
 		this.globalController = new GlobalController(model);
 		this.storeController = new StoreController(model);
-		this.loadController = new LoadController(model, categoryController, canvasController, objectController,
-				globalController, multiPurposeController);
+		this.loadController = new LoadController(model, categoryController, canvasController, objectController, multiPurposeController);
 		this.simulationManager = new SimulationManager(model);
 		this.autoSaveController = new AutoSaveController(model);
 		this.consoleController = new ConsoleController(model);

+ 127 - 54
src/ui/controller/LoadController.java

@@ -1,5 +1,6 @@
 package ui.controller;
 
+import java.awt.Color;
 import java.awt.Point;
 import java.io.FileReader;
 import java.io.IOException;
@@ -7,12 +8,23 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collector;
+import java.util.stream.Collectors;
 
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
 
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.stream.JsonReader;
+
+import TypeAdapter.AbstractCpsObjectAdapter;
+import TypeAdapter.ColorAdapter;
+import TypeAdapter.PositionAdapter;
 import classes.Category;
 import classes.CpsEdge;
 import classes.CpsNode;
@@ -22,6 +34,7 @@ import classes.HolonObject;
 import classes.HolonSwitch;
 import classes.HolonTransformer;
 import classes.IdCounter;
+import classes.Position;
 import ui.model.Model;
 
 /**
@@ -33,16 +46,34 @@ public class LoadController {
 	/**
 	 * enum Mode.
 	 */
-	public enum Mode {
-		ALL, CATEGORY, CANVAS
+	public enum MODE {
+		COMPLETE, PARTIAL
+	}
+
+	public enum TYPE {
+		CATEGORY, CANVAS
+	}
+
+	public enum EDGETYPE {
+		CANVAS, CONNECTION, NODE, OLD
+	}
+
+	public enum NUMTYPE {
+		CATEGORY, OBJECT, ELEMENT, EDGE, CONNECTION, NODEEDGE, OLDEDGE, UNITGRAPH
+	}
+
+	public enum GRAPHTYPE {
+		SWITCH, ELEMENT
 	}
 
 	private Model model;
 	private CategoryController cgC;
 	private CanvasController cvsC;
 	private ObjectController objC;
-	private GlobalController global;
 	private MultiPurposeController mpC;
+	private Gson gson;
+	// uninitialized arrays only init when needed
+	ArrayList<String> jCat, jObj, jEle, jEdge, jConn, jNodeEdge, jOldEdge, jUnitGraph;
 
 	/**
 	 * Constructor.
@@ -58,15 +89,13 @@ public class LoadController {
 	 * @param mp
 	 *            MultiPurposeController
 	 */
-	public LoadController(Model model, CategoryController cg, CanvasController cvs, ObjectController obj,
-			GlobalController global, MultiPurposeController mp) {
+	public LoadController(Model model, CategoryController cg, CanvasController cvs, ObjectController obj, MultiPurposeController mp) {
 		this.model = model;
 		this.cgC = cg;
 		this.cvsC = cvs;
 		this.objC = obj;
-		this.global = global;
 		this.mpC = mp;
-
+		initGson();
 	}
 
 	/**
@@ -78,62 +107,88 @@ public class LoadController {
 	 *             exception
 	 */
 	public void readJson(String path) throws IOException {
-		JSONParser parser = new JSONParser();
-		JSONObject json = new JSONObject();
-		try {
-			json = (JSONObject) parser.parse(new FileReader(path));
-		} catch (ParseException ex) {
-			// TODO Auto-generated catch block
-			ex.printStackTrace();
+
+		JsonParser parser = new JsonParser();
+		JsonObject json = (JsonObject) parser.parse(new FileReader(path));
+
+		// get all keys via stream
+		List<String> keys = json.entrySet().stream().map(i -> i.getKey())
+				.collect(Collectors.toCollection(ArrayList::new));
+		initialize(keys, json);
+		distribute(keys, json, parser);
+
+//		for (Object key : keys) {
+//			if (key.equals("CG"))
+//				readCategory((JSONArray) json.get((String) key));
+//			else if (key.equals("ID"))
+//				IdCounter.setCounter(Integer.parseInt(json.get(key.toString()).toString()));
+//			// else if (key.equals("SIZEX"))
+//			// global.setCanvasX(Integer.parseInt(json.get(key.toString()).toString()));
+//			// else if (key.equals("SIZEY"))
+//			// global.setCanvasY(Integer.parseInt(json.get(key.toString()).toString()));
+//			else if (key.toString().contains("CGO") || key.toString().contains("CVSO"))
+//				obj.add(key.toString());
+//			else if (key.toString().contains("CGE") || key.toString().contains("CVSE"))
+//				ele.add(key.toString());
+//			else if (key.toString().contains("EDGE"))
+//				edge.add(key.toString());
+//			else if (key.toString().contains("CGGP") || key.toString().contains("CVSGP"))
+//				gp.add(key.toString());
+//
+//		}
+//
+//		dispatch(obj, json);
+//		dispatch(ele, json);
+//		dispatch(edge, json);
+//		dispatch(gp, json);
+
+	}
+
+	private void distribute(List<String> keys, JsonObject json, JsonParser parser) {
+		// TODO Auto-generated method stub
+		for (String key : keys) {
+			if(key.contains("CATEGORY"))
+				loadCategory(json.get(key));
+			if(key.contains("CGOBJECT"))
+				loadCategoryObject(TYPE.CATEGORY, json.get(key).getAsJsonObject());
 		}
 
-		ArrayList<String> obj = new ArrayList<>();
-		ArrayList<String> ele = new ArrayList<>();
-		ArrayList<String> edge = new ArrayList<>();
-		ArrayList<String> gp = new ArrayList<>();
 
-		Mode mode = Mode.valueOf(json.get("MODE").toString());
+	}
+
+	private void loadCategoryObject(TYPE type, JsonObject jsonElement) {
+		// TODO Auto-generated method stub
+		AbstractCpsObject temp = gson.fromJson(jsonElement., AbstractCpsObject.class);
+		cgC.addObject(mpC.searchCat(temp.getSav()), temp);
+	}
 
-		if (mode.equals(Mode.ALL) || mode.equals(Mode.CATEGORY)) {
+	private void loadCategory(JsonElement jsonElement) {
+		// TODO Auto-generated method stub
+		cgC.addCategory(new Category(jsonElement.getAsString()));
+	}
+
+	private void initialize(List<String> keys, JsonObject json) {
+
+		switch (MODE.valueOf(json.get("MODE").getAsString())) {
+		case COMPLETE:
 			model.setCgIdx(new HashMap<String, Integer>());
 			model.setCategories(new ArrayList<Category>());
-		}
-		if (mode.equals(Mode.ALL) || mode.equals(Mode.CANVAS)) {
 			model.setCvsObjIdx(new HashMap<Integer, Integer>());
 			model.setObjectsOnCanvas(new ArrayList<AbstractCpsObject>());
 			model.setEdgesOnCanvas(new ArrayList<CpsEdge>());
-		}
-
-		for (Object key : json.keySet()) {
-			if (key.equals("CG"))
-				readCategory((JSONArray) json.get(key));
-			else if (key.equals("ID"))
-				IdCounter.setCounter(Integer.parseInt(json.get(key.toString()).toString()));
-//			else if	(key.equals("SIZEX"))
-//				global.setCanvasX(Integer.parseInt(json.get(key.toString()).toString()));
-//			else if (key.equals("SIZEY"))
-//				global.setCanvasY(Integer.parseInt(json.get(key.toString()).toString()));
-			else if (key.toString().contains("CGO") || key.toString().contains("CVSO"))
-				obj.add(key.toString());
-			else if (key.toString().contains("CGE") || key.toString().contains("CVSE"))
-				ele.add(key.toString());
-			else if (key.toString().contains("EDGE"))
-				edge.add(key.toString());
-			else if (key.toString().contains("CGGP") || key.toString().contains("CVSGP"))
-				gp.add(key.toString());
+			model.setCanvasX(json.get("CANVAS_SIZE_X").getAsInt());
+			model.setCanvasX(json.get("CANVAS_SIZE_Y").getAsInt());
+			break;
+		case PARTIAL:
+			model.setCvsObjIdx(new HashMap<Integer, Integer>());
+			model.setObjectsOnCanvas(new ArrayList<AbstractCpsObject>());
+			model.setEdgesOnCanvas(new ArrayList<CpsEdge>());
+			break;
 
+		default:
+			break;
 		}
-
-		Collections.sort(obj);
-		Collections.sort(ele);
-		Collections.sort(edge);
-		Collections.sort(gp);
-
-		dispatch(obj, json);
-		dispatch(ele, json);
-		dispatch(edge, json);
-		dispatch(gp, json);
-
+		IdCounter.setCounter(json.get("IDCOUNTER").getAsInt());
 	}
 
 	/**
@@ -311,5 +366,23 @@ public class LoadController {
 	public boolean convert(int x) {
 		return x == 1 ? true : false;
 	}
+	
+	/**
+	 * Initialize the Gson with wanted parameters
+	 */
+	private void initGson() {
+		// TODO Auto-generated method stub
+		GsonBuilder builder = new GsonBuilder();
+		builder.excludeFieldsWithoutExposeAnnotation().serializeNulls().setPrettyPrinting();
+		builder.registerTypeAdapter(AbstractCpsObject.class, new AbstractCpsObjectAdapter());
+		builder.registerTypeAdapter(Position.class, new PositionAdapter());
+		builder.registerTypeAdapter(Color.class, new ColorAdapter());
+		// use the builder and make a instance of the Gson
+		this.gson = builder.create();
+	}
+	
+	private void initArrays() {
+		
+	}
 
 }

+ 39 - 27
src/ui/controller/StoreController.java

@@ -76,7 +76,6 @@ public class StoreController {
 	 */
 	public StoreController(Model model) {
 		this.model = model;
-		initNumeration();
 		initGson();
 	}
 
@@ -92,19 +91,19 @@ public class StoreController {
 	 */
 	public void writeSaveFile(String path) throws IOException {
 
+		initNumeration();
 		JsonObject file = new JsonObject();
-
 		initialize(MODE.COMPLETE, file);
 		storeCategory(file);
 		storeCanvas(file);
 
 		FileWriter writer = new FileWriter(path);
 		writer.write(gson.toJson(file));
-		
+
 		writer.flush();
 		writer.close();
 	}
-	
+
 	/**
 	 * Writes the Autosave File.
 	 * 
@@ -115,14 +114,14 @@ public class StoreController {
 	 */
 	public void writeAutosaveFile(String path) throws IOException {
 
-		
+		initNumeration();
 		JsonObject file = new JsonObject();
 		initialize(MODE.PARTIAL, file);
 		storeCanvas(file);
-		
+
 		FileWriter writer = new FileWriter(path);
 		writer.write(gson.toJson(file));
-		
+
 		writer.flush();
 		writer.close();
 	}
@@ -139,13 +138,13 @@ public class StoreController {
 		switch (mode) {
 		case COMPLETE:
 			file.add("MODE", new JsonPrimitive(mode.name()));
-			file.add("IDCounter", new JsonPrimitive(IdCounter.getCounter()));
+			file.add("IDCOUNTER", new JsonPrimitive(IdCounter.getCounter()));
 			file.add("CANVAS_SIZE_X", new JsonPrimitive(model.getCanvasX()));
 			file.add("CANVAS_SIZE_Y", new JsonPrimitive(model.getCanvasY()));
 			break;
 		case PARTIAL:
 			file.add("MODE", new JsonPrimitive(mode.name()));
-			file.add("IDCounter", new JsonPrimitive(IdCounter.getCounter()));
+			file.add("IDCOUNTER", new JsonPrimitive(IdCounter.getCounter()));
 			break;
 
 		default:
@@ -162,9 +161,11 @@ public class StoreController {
 		// TODO Auto-generated method stub
 		for (Category cat : model.getCategories()) {
 			String key = "CATEGORY" + getNumerator(NUMTYPE.CATEGORY);
+
 			file.add(key, new JsonPrimitive(cat.getName()));
+
 			for (AbstractCpsObject obj : cat.getObjects()) {
-				file.add("CATEGORY.OBJECT" + getNumerator(NUMTYPE.OBJECT),
+				file.add("CGOBJECT" + getNumerator(NUMTYPE.OBJECT),
 						new JsonPrimitive(gson.toJson(obj, AbstractCpsObject.class)));
 				if (obj instanceof HolonObject)
 					elementsToJson(TYPE.CATEGORY, gson, file, obj);
@@ -174,7 +175,7 @@ public class StoreController {
 
 	/**
 	 * Travers through all Objects via BFS and Stores everything relevant
-
+	 * 
 	 * @param file
 	 */
 	private void storeCanvas(JsonObject file) {
@@ -195,14 +196,15 @@ public class StoreController {
 				// TODO Auto-generated catch block
 				e.printStackTrace();
 			}
-			String key = "CANVAS.OBJECT" + getNumerator(NUMTYPE.OBJECT);
+			String key = "CVSOBJECT" + getNumerator(NUMTYPE.OBJECT);
 			file.add(key, new JsonPrimitive(gson.toJson(u, AbstractCpsObject.class)));
 			edgeToJson(EDGETYPE.CONNECTION, gson, file, u.getID(), u.getConnections());
 
 			if (u instanceof HolonObject)
 				elementsToJson(TYPE.CANVAS, gson, file, u);
 			if (u instanceof HolonSwitch)
-				unitgraphToJson(GRAPHTYPE.SWITCH, gson, file, u.getID(), ((HolonSwitch) u).getGraphPoints());
+				if (((HolonSwitch) u).getGraphPoints().size() != 0)
+					unitgraphToJson(GRAPHTYPE.SWITCH, gson, file, u.getID(), ((HolonSwitch) u).getGraphPoints());
 			if (u instanceof CpsUpperNode) {
 				for (AbstractCpsObject adjacent : ((CpsUpperNode) u).getNodes()) {
 					queue.enqueue(adjacent);
@@ -212,7 +214,7 @@ public class StoreController {
 				edgeToJson(EDGETYPE.OLD, gson, file, u.getID(), ((CpsUpperNode) u).getOldEdges());
 			}
 		}
-		
+
 		datasetToJson(gson, file);
 
 	}
@@ -227,14 +229,24 @@ public class StoreController {
 	private void elementsToJson(TYPE type, Gson gson, JsonObject file, AbstractCpsObject obj) {
 		// TODO Auto-generated method stub
 		JsonObject temp = new JsonObject();
+		String key = null;
 
 		for (HolonElement ele : ((HolonObject) obj).getElements()) {
 			temp.add("properties", new JsonPrimitive(gson.toJson(ele)));
 			temp.add("ID", new JsonPrimitive(obj.getID()));
-			if (ele.getEnergyAt().length != 0)
+			if (ele.getGraphPoints().size() != 0)
 				unitgraphToJson(GRAPHTYPE.ELEMENT, gson, file, ele.getId(), ele.getGraphPoints());
-
-			file.add(type.name() + ".OBJECT.ELEMENT" + getNumerator(NUMTYPE.ELEMENT), gson.toJsonTree(temp));
+			switch (type) {
+			case CANVAS:
+				key = "CVSELEMENT" + getNumerator(NUMTYPE.ELEMENT);
+				break;
+			case CATEGORY:
+				key = "CGELEMENT" + getNumerator(NUMTYPE.ELEMENT);
+				break;
+			default:
+				break;
+			}
+			file.add(key, gson.toJsonTree(temp));
 			temp = new JsonObject();
 		}
 
@@ -255,10 +267,10 @@ public class StoreController {
 
 		switch (type) {
 		case SWITCH:
-			key = "SWITCH.UNIGRAPH" + getNumerator(NUMTYPE.UNITGRAPH);
+			key = "SWUNITGRAPH" + getNumerator(NUMTYPE.UNITGRAPH);
 			break;
 		case ELEMENT:
-			key = "ELEMENT.UNIGRAPH" + getNumerator(NUMTYPE.UNITGRAPH);
+			key = "ELEUNITGRAPH" + getNumerator(NUMTYPE.UNITGRAPH);
 			break;
 		default:
 			break;
@@ -290,17 +302,17 @@ public class StoreController {
 
 			switch (type) {
 			case CANVAS:
-				k = "CANVAS.EDGE" + getNumerator(NUMTYPE.EDGE);
+				k = "CVSEDGE" + getNumerator(NUMTYPE.EDGE);
 				break;
 			case CONNECTION:
-				k = "CANVAS.OBJECT.CONNECTION" + getNumerator(NUMTYPE.CONNECTION);
+				k = "OBJCONNECTION" + getNumerator(NUMTYPE.CONNECTION);
 				break;
 			case NODE:
-				k = "CANVAS.UPPERNODE.EDGE" + getNumerator(NUMTYPE.NODEEDGE);
+				k = "NODEEDGE" + getNumerator(NUMTYPE.NODEEDGE);
 				temp.add("ID", new JsonPrimitive(id));
 				break;
 			case OLD:
-				k = "CANVAS.UPPERNODE.OLD" + getNumerator(NUMTYPE.OLDEDGE);
+				k = "OLDEDGE" + getNumerator(NUMTYPE.OLDEDGE);
 				temp.add("ID", new JsonPrimitive(id));
 				break;
 			default:
@@ -312,10 +324,10 @@ public class StoreController {
 		}
 
 	}
-	
+
 	private void datasetToJson(Gson gson, JsonObject file) {
 		JsonObject temp = new JsonObject();
-		
+
 	}
 
 	/**
@@ -331,14 +343,14 @@ public class StoreController {
 		// use the builder and make a instance of the Gson
 		this.gson = builder.create();
 	}
-	
+
 	/**
 	 * Just initialize the Numerators for the Json Keys. Maybe bad Style..
 	 */
 	private void initNumeration() {
 		this.nCat = this.nObj = this.nEle = this.nEdge = this.nConn = this.nNodeEdge = this.nOldEdge = 0;
 	}
-	
+
 	/**
 	 * Get the wanted numerator and increment it
 	 *