LoadController.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. package ui.controller;
  2. import java.awt.Color;
  3. import java.awt.Point;
  4. import java.io.FileReader;
  5. import java.io.IOException;
  6. import java.util.ArrayList;
  7. import java.util.HashMap;
  8. import java.util.LinkedList;
  9. import java.util.List;
  10. import java.util.stream.Collectors;
  11. import com.google.gson.Gson;
  12. import com.google.gson.GsonBuilder;
  13. import com.google.gson.JsonElement;
  14. import com.google.gson.JsonObject;
  15. import com.google.gson.JsonParser;
  16. import TypeAdapter.AbstractCpsObjectAdapter;
  17. import TypeAdapter.ColorAdapter;
  18. import TypeAdapter.PositionAdapter;
  19. import classes.Category;
  20. import classes.CpsEdge;
  21. import classes.CpsUpperNode;
  22. import classes.AbstractCpsObject;
  23. import classes.HolonElement;
  24. import classes.HolonObject;
  25. import classes.HolonSwitch;
  26. import classes.IdCounter;
  27. import classes.Position;
  28. import ui.model.Model;
  29. /**
  30. * Controller for the Loading.
  31. *
  32. * @author Gruppe14
  33. */
  34. public class LoadController {
  35. /**
  36. * enum Mode.
  37. */
  38. public enum MODE {
  39. COMPLETE, PARTIAL
  40. }
  41. public enum EDGETYPE {
  42. CANVAS, CONNECTION, NODE, OLD
  43. }
  44. public enum GRAPHTYPE {
  45. SWITCH, ELEMENT
  46. }
  47. private Model model;
  48. private CategoryController cgC;
  49. private CanvasController cvsC;
  50. private ObjectController objC;
  51. private NodeController uppC;
  52. private MultiPurposeController mpC;
  53. private Gson gson;
  54. private JsonParser parser;
  55. /**
  56. * Constructor.
  57. *
  58. * @param model
  59. * Model
  60. * @param cg
  61. * CategoryController
  62. * @param cvs
  63. * CanvasController
  64. * @param obj
  65. * ObjectController
  66. * @param mp
  67. * MultiPurposeController
  68. */
  69. public LoadController(Model model, CategoryController cg, CanvasController cvs, ObjectController obj,
  70. NodeController uppC, MultiPurposeController mp) {
  71. this.model = model;
  72. this.cgC = cg;
  73. this.cvsC = cvs;
  74. this.objC = obj;
  75. this.uppC = uppC;
  76. this.mpC = mp;
  77. initGson();
  78. }
  79. /**
  80. * Reads the the JSON File and load the state into the Model.
  81. *
  82. * @param path
  83. * the Path
  84. * @throws IOException
  85. * exception
  86. */
  87. public void readJson(String path) throws IOException {
  88. JsonObject json = (JsonObject) parser.parse(new FileReader(path));
  89. // get all keys via stream
  90. List<String> keys = getKeys(json);
  91. List<String> edges = keys.stream().filter(key -> key.contains("EDGE"))
  92. .collect(Collectors.toCollection(ArrayList::new));
  93. HashMap<Integer, AbstractCpsObject> objDispatch = new HashMap<>();
  94. HashMap<Integer, HolonElement> eleDispatch = new HashMap<>();
  95. initialize(keys, json);
  96. distribute(keys, json, objDispatch, eleDispatch);
  97. distEdges(edges, json, objDispatch);
  98. }
  99. private void distEdges(List<String> edges, JsonObject json, HashMap<Integer, AbstractCpsObject> objDispatch) {
  100. // TODO Auto-generated method stub
  101. for (String edge : edges) {
  102. if (edge.contains("CVSEDGE"))
  103. loadEdge(EDGETYPE.CANVAS, json.get(edge), objDispatch);
  104. if (edge.contains("CONNEDGE"))
  105. loadEdge(EDGETYPE.CONNECTION, json.get(edge), objDispatch);
  106. if (edge.contains("NODE"))
  107. loadEdge(EDGETYPE.NODE, json.get(edge), objDispatch);
  108. if (edge.contains("OLD"))
  109. loadEdge(EDGETYPE.OLD, json.get(edge), objDispatch);
  110. }
  111. }
  112. private void distribute(List<String> keys, JsonObject json, HashMap<Integer, AbstractCpsObject> objDispatch,
  113. HashMap<Integer, HolonElement> eleDispatch) {
  114. // TODO Auto-generated method stub
  115. for (String key : keys) {
  116. if (key.contains("CATEGORY"))
  117. loadCategory(json.get(key));
  118. if (key.contains("CGOBJECT"))
  119. loadCategoryObject(json.get(key));
  120. if (key.contains("CGELEMENT"))
  121. loadCategoryElements(json.get(key));
  122. if (key.contains("CVSOBJECT"))
  123. loadCanvasObject(json.get(key), objDispatch);
  124. if (key.contains("CVSELEMENT"))
  125. loadCanvasElements(json.get(key), objDispatch, eleDispatch);
  126. if (key.contains("SWUNITGRAPH"))
  127. loadUnitGraph(GRAPHTYPE.SWITCH, json.get(key), objDispatch, null);
  128. if (key.contains("ELEUNITGRAPH"))
  129. loadUnitGraph(GRAPHTYPE.ELEMENT, json.get(key), null, eleDispatch);
  130. }
  131. }
  132. private void loadUnitGraph(GRAPHTYPE type, JsonElement jsonElement, HashMap<Integer, AbstractCpsObject> objDispatch,
  133. HashMap<Integer, HolonElement> eleDispatch) {
  134. // TODO Auto-generated method stub
  135. JsonObject object = jsonElement.getAsJsonObject();
  136. List<String> keys = getKeys(object);
  137. String p = null;
  138. int mid, x, y = 0;
  139. LinkedList<Point> graphpoint = new LinkedList<>();
  140. int sav = 0;
  141. for (String k : keys) {
  142. if (!k.equals("ID")) {
  143. p = object.get(k).getAsString();
  144. mid = p.indexOf(':');
  145. x = Integer.parseInt(p.substring(0, mid));
  146. y = Integer.parseInt(p.substring(mid + 1, p.length()));
  147. graphpoint.add(new Point(x, y));
  148. } else
  149. sav = object.get(k).getAsInt();
  150. }
  151. switch (type) {
  152. case SWITCH:
  153. HolonSwitch sw = (HolonSwitch) objDispatch.get(sav);
  154. sw.setGraphPoints(graphpoint);
  155. break;
  156. case ELEMENT:
  157. HolonElement ele = eleDispatch.get(sav);
  158. ele.setGraphPoints(graphpoint);
  159. break;
  160. default:
  161. break;
  162. }
  163. }
  164. private void loadEdge(EDGETYPE type, JsonElement jsonElement, HashMap<Integer, AbstractCpsObject> objDispatch) {
  165. // TODO Auto-generated method stub
  166. JsonObject object = jsonElement.getAsJsonObject();
  167. CpsEdge temp = gson.fromJson(object.get("properties"), CpsEdge.class);
  168. initCpsEdge(temp);
  169. temp.setA(objDispatch.get(object.get("A").getAsInt()));
  170. temp.setB(objDispatch.get(object.get("B").getAsInt()));
  171. int sav = 0;
  172. switch (type) {
  173. case CANVAS:
  174. model.getEdgesOnCanvas().add(temp);
  175. temp.getA().getConnections().remove(temp);
  176. temp.getB().getConnections().remove(temp);
  177. break;
  178. case CONNECTION:
  179. if (!uppC.lookforDuplicates(temp.getA(), temp.getB(), temp.getA().getConnections()))
  180. temp.getA().getConnections().add(temp);
  181. if (!uppC.lookforDuplicates(temp.getA(), temp.getB(), temp.getB().getConnections()))
  182. temp.getB().getConnections().add(temp);
  183. break;
  184. case NODE:
  185. sav = object.get("ID").getAsInt();
  186. ((CpsUpperNode) objDispatch.get(sav)).getNodeEdges().add(temp);
  187. break;
  188. case OLD:
  189. sav = object.get("ID").getAsInt();
  190. ((CpsUpperNode) objDispatch.get(sav)).getOldEdges().add(temp);
  191. break;
  192. default:
  193. break;
  194. }
  195. }
  196. /**
  197. *
  198. * @param jsonElement
  199. * @param objDispatch
  200. * @param eleDispatch
  201. */
  202. private void loadCanvasElements(JsonElement jsonElement, HashMap<Integer, AbstractCpsObject> objDispatch,
  203. HashMap<Integer, HolonElement> eleDispatch) {
  204. // TODO Auto-generated method stub
  205. JsonObject object = jsonElement.getAsJsonObject();
  206. HolonElement temp = gson.fromJson(object.get("properties"), HolonElement.class);
  207. initElements(temp);
  208. int stored = object.get("ID").getAsInt();
  209. HolonObject temp2 = (HolonObject) objDispatch.get(stored);
  210. objC.addElement(temp2, temp);
  211. eleDispatch.put(temp.getId(), temp);
  212. }
  213. /**
  214. *
  215. * @param jsonElement
  216. * @param objDispatch
  217. */
  218. private void loadCanvasObject(JsonElement jsonElement, HashMap<Integer, AbstractCpsObject> objDispatch) {
  219. // TODO Auto-generated method stub
  220. AbstractCpsObject temp = gson.fromJson(jsonElement.getAsJsonObject(), AbstractCpsObject.class);
  221. initObjects(temp);
  222. if (temp.getSav().equals("CVS")) {
  223. cvsC.addObject(temp);
  224. } else {
  225. CpsUpperNode temp2 = (CpsUpperNode) objDispatch.get(Integer.parseInt(temp.getSav()));
  226. uppC.addObjectInUpperNode(temp, temp2);
  227. }
  228. objDispatch.put(temp.getID(), temp);
  229. }
  230. /**
  231. *
  232. * @param jsonElement
  233. */
  234. private void loadCategoryElements(JsonElement jsonElement) {
  235. // TODO Auto-generated method stub
  236. HolonElement temp = gson.fromJson(jsonElement.getAsJsonObject().get("properties").getAsJsonObject(),
  237. HolonElement.class);
  238. initElements(temp);
  239. objC.addElementIntoCategoryObject(temp.getSav(), temp.getObj(), temp);
  240. }
  241. /**
  242. *
  243. * @param jsonElement
  244. */
  245. private void loadCategoryObject(JsonElement jsonElement) {
  246. // TODO Auto-generated method stub
  247. AbstractCpsObject temp = gson.fromJson(jsonElement.getAsJsonObject(), AbstractCpsObject.class);
  248. initObjects(temp);
  249. cgC.addObject(mpC.searchCat(temp.getSav()), temp);
  250. }
  251. private void loadCategory(JsonElement jsonElement) {
  252. // TODO Auto-generated method stub
  253. cgC.addCategory(new Category(jsonElement.getAsString()));
  254. }
  255. /**
  256. *
  257. * @param keys
  258. * @param json
  259. */
  260. private void initialize(List<String> keys, JsonObject json) {
  261. switch (MODE.valueOf(json.get("MODE").getAsString())) {
  262. case COMPLETE:
  263. model.setCgIdx(new HashMap<String, Integer>());
  264. model.setCategories(new ArrayList<Category>());
  265. model.setCvsObjIdx(new HashMap<Integer, Integer>());
  266. model.setObjectsOnCanvas(new ArrayList<AbstractCpsObject>());
  267. model.setEdgesOnCanvas(new ArrayList<CpsEdge>());
  268. model.setCanvasX(json.get("CANVAS_SIZE_X").getAsInt());
  269. model.setCanvasX(json.get("CANVAS_SIZE_Y").getAsInt());
  270. break;
  271. case PARTIAL:
  272. model.setCvsObjIdx(new HashMap<Integer, Integer>());
  273. model.setObjectsOnCanvas(new ArrayList<AbstractCpsObject>());
  274. model.setEdgesOnCanvas(new ArrayList<CpsEdge>());
  275. break;
  276. default:
  277. break;
  278. }
  279. IdCounter.setCounter(json.get("IDCOUNTER").getAsInt());
  280. }
  281. /**
  282. * Initialize the Gson with wanted parameters
  283. */
  284. private void initGson() {
  285. // TODO Auto-generated method stub
  286. GsonBuilder builder = new GsonBuilder();
  287. builder.serializeNulls();
  288. builder.registerTypeAdapter(AbstractCpsObject.class, new AbstractCpsObjectAdapter());
  289. builder.registerTypeAdapter(Position.class, new PositionAdapter());
  290. builder.registerTypeAdapter(Color.class, new ColorAdapter());
  291. // use the builder and make a instance of the Gson
  292. this.gson = builder.create();
  293. this.parser = new JsonParser();
  294. }
  295. /**
  296. * Init new Arrays which havent been serialized along the object
  297. *
  298. * @param obj
  299. */
  300. private void initObjects(AbstractCpsObject obj) {
  301. obj.setConnections(new ArrayList<>());
  302. obj.setTags(new ArrayList<>());
  303. obj.setPseudoTags(new ArrayList<>());
  304. if (obj instanceof HolonObject) {
  305. ((HolonObject) obj).setElements(new ArrayList<HolonElement>());
  306. ((HolonObject) obj).setEleIdx(new HashMap<String, Integer>());
  307. ((HolonObject) obj).setTrackingProd(new float[100]);
  308. ((HolonObject) obj).setTrackingCons(new float[100]);
  309. }
  310. if (obj instanceof HolonSwitch) {
  311. ((HolonSwitch) obj).setActiveAt(true);
  312. ((HolonSwitch) obj).setGraphPoints(new LinkedList<>());
  313. }
  314. if (obj instanceof CpsUpperNode) {
  315. ((CpsUpperNode) obj).setNodes(new ArrayList<AbstractCpsObject>());
  316. ((CpsUpperNode) obj).setNodeEdges(new ArrayList<CpsEdge>());
  317. ((CpsUpperNode) obj).setOldEdges(new ArrayList<CpsEdge>());
  318. ((CpsUpperNode) obj).setNodesIdx(new HashMap<Integer, Integer>());
  319. }
  320. }
  321. /**
  322. *
  323. * @param ele
  324. */
  325. private void initElements(HolonElement ele) {
  326. ele.setEnergyAt(ele.getEnergy());
  327. ele.setGraphPoints(new LinkedList<>());
  328. }
  329. private void initCpsEdge(CpsEdge edge) {
  330. edge.setTags(new ArrayList<>());
  331. edge.setPseudoTag(new ArrayList<>());
  332. edge.setA(null);
  333. edge.setB(null);
  334. }
  335. private List<String> getKeys(JsonObject json) {
  336. return json.entrySet().stream().map(i -> i.getKey()).collect(Collectors.toCollection(ArrayList::new));
  337. }
  338. }