LoadController.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  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.IdCounterElem;
  28. import classes.Position;
  29. import ui.model.Model;
  30. /**
  31. * Controller for the Loading.
  32. *
  33. * @author Gruppe14
  34. */
  35. public class LoadController {
  36. /**
  37. * enum Mode.
  38. */
  39. public enum MODE {
  40. COMPLETE, PARTIAL
  41. }
  42. public enum EDGETYPE {
  43. CANVAS, CONNECTION, NODE, OLD
  44. }
  45. public enum GRAPHTYPE {
  46. SWITCH, ELEMENT
  47. }
  48. private Model model;
  49. private CategoryController cgC;
  50. private CanvasController cvsC;
  51. private ObjectController objC;
  52. private NodeController uppC;
  53. private MultiPurposeController mpC;
  54. private Gson gson;
  55. private JsonParser parser;
  56. /**
  57. * Constructor.
  58. *
  59. * @param model
  60. * Model
  61. * @param cg
  62. * CategoryController
  63. * @param cvs
  64. * CanvasController
  65. * @param obj
  66. * ObjectController
  67. * @param mp
  68. * MultiPurposeController
  69. */
  70. public LoadController(Model model, CategoryController cg, CanvasController cvs, ObjectController obj,
  71. NodeController uppC, MultiPurposeController mp) {
  72. this.model = model;
  73. this.cgC = cg;
  74. this.cvsC = cvs;
  75. this.objC = obj;
  76. this.uppC = uppC;
  77. this.mpC = mp;
  78. initGson();
  79. }
  80. /**
  81. * Reads the the JSON File and load the state into the Model.
  82. *
  83. * @param path
  84. * the Path
  85. * @throws IOException
  86. * exception
  87. */
  88. public void readJson(String path) throws IOException {
  89. JsonObject json = (JsonObject) parser.parse(new FileReader(path));
  90. // get all keys via stream
  91. List<String> keys = getKeys(json);
  92. List<String> edges = keys.stream().filter(key -> key.contains("EDGE"))
  93. .collect(Collectors.toCollection(ArrayList::new));
  94. HashMap<Integer, AbstractCpsObject> objDispatch = new HashMap<>();
  95. HashMap<Integer, HolonElement> eleDispatch = new HashMap<>();
  96. initialize(keys, json);
  97. forwardObjects(keys, json, objDispatch, eleDispatch);
  98. forwardEdges(edges, json, objDispatch);
  99. }
  100. /**
  101. * distribute the Edges
  102. *
  103. * @param edges
  104. * @param json
  105. * @param objDispatch
  106. */
  107. private void forwardEdges(List<String> edges, JsonObject json, HashMap<Integer, AbstractCpsObject> objDispatch) {
  108. // TODO Auto-generated method stub
  109. List<String> conn = new ArrayList<>();
  110. for (String edge : edges) {
  111. if (edge.contains("CVSEDGE"))
  112. loadEdge(EDGETYPE.CANVAS, json.get(edge), objDispatch);
  113. if (edge.contains("CONNEDGE"))
  114. conn.add(edge);
  115. if (edge.contains("NODE"))
  116. loadEdge(EDGETYPE.NODE, json.get(edge), objDispatch);
  117. if (edge.contains("OLD"))
  118. loadEdge(EDGETYPE.OLD, json.get(edge), objDispatch);
  119. }
  120. for (String edge : conn) {
  121. loadEdge(EDGETYPE.CONNECTION, json.get(edge), objDispatch);
  122. }
  123. }
  124. /**
  125. * Distribute the given keys for right processing
  126. *
  127. * @param keys
  128. * @param json
  129. * @param objDispatch
  130. * @param eleDispatch
  131. */
  132. private void forwardObjects(List<String> keys, JsonObject json, HashMap<Integer, AbstractCpsObject> objDispatch,
  133. HashMap<Integer, HolonElement> eleDispatch) {
  134. // TODO Auto-generated method stub
  135. for (String key : keys) {
  136. if (key.contains("CATEGORY"))
  137. loadCategory(json.get(key));
  138. if (key.contains("CGOBJECT"))
  139. loadCategoryObject(json.get(key));
  140. if (key.contains("CGELEMENT"))
  141. loadCategoryElements(json.get(key));
  142. if (key.contains("CVSOBJECT"))
  143. loadCanvasObject(json.get(key), objDispatch);
  144. if (key.contains("CVSELEMENT"))
  145. loadCanvasElements(json.get(key), objDispatch, eleDispatch);
  146. if (key.contains("SWUNITGRAPH"))
  147. loadUnitGraph(GRAPHTYPE.SWITCH, json.get(key), objDispatch, null);
  148. if (key.contains("ELEUNITGRAPH"))
  149. loadUnitGraph(GRAPHTYPE.ELEMENT, json.get(key), null, eleDispatch);
  150. }
  151. }
  152. /**
  153. * Init the Global Parameters
  154. *
  155. * @param keys
  156. * @param json
  157. */
  158. private void initialize(List<String> keys, JsonObject json) {
  159. switch (MODE.valueOf(json.get("MODE").getAsString())) {
  160. case COMPLETE:
  161. model.setCgIdx(new HashMap<String, Integer>());
  162. model.setCategories(new ArrayList<Category>());
  163. model.setCvsObjIdx(new HashMap<Integer, Integer>());
  164. model.setObjectsOnCanvas(new ArrayList<AbstractCpsObject>());
  165. model.setEdgesOnCanvas(new ArrayList<CpsEdge>());
  166. model.setCanvasX(json.get("CANVAS_SIZE_X").getAsInt());
  167. model.setCanvasX(json.get("CANVAS_SIZE_Y").getAsInt());
  168. break;
  169. case PARTIAL:
  170. model.setCvsObjIdx(new HashMap<Integer, Integer>());
  171. model.setObjectsOnCanvas(new ArrayList<AbstractCpsObject>());
  172. model.setEdgesOnCanvas(new ArrayList<CpsEdge>());
  173. break;
  174. default:
  175. break;
  176. }
  177. IdCounter.setCounter(json.get("IDCOUNTER").getAsInt());
  178. IdCounterElem.setCounter(json.get("IDCOUNTERELEMENT").getAsInt());
  179. }
  180. /**
  181. * Load a given Category
  182. *
  183. * @param jsonElement
  184. */
  185. private void loadCategory(JsonElement jsonElement) {
  186. // TODO Auto-generated method stub
  187. cgC.addCategory(new Category(jsonElement.getAsString()));
  188. }
  189. /**
  190. * Load a given Object in Category by Deserialization
  191. *
  192. * @param jsonElement
  193. */
  194. private void loadCategoryObject(JsonElement jsonElement) {
  195. // TODO Auto-generated method stub
  196. AbstractCpsObject temp = gson.fromJson(jsonElement.getAsJsonObject(), AbstractCpsObject.class);
  197. initObjects(temp);
  198. cgC.addObject(mpC.searchCat(temp.getSav()), temp);
  199. }
  200. /**
  201. * Load a given Element in Category by Deserialization
  202. *
  203. * @param jsonElement
  204. */
  205. private void loadCategoryElements(JsonElement jsonElement) {
  206. // TODO Auto-generated method stub
  207. HolonElement temp = gson.fromJson(jsonElement.getAsJsonObject().get("properties").getAsJsonObject(),
  208. HolonElement.class);
  209. initElements(temp);
  210. objC.addElementIntoCategoryObject(temp.getSav(), temp.getObj(), temp);
  211. }
  212. /**
  213. * Load a given Object in Canvas by Deserialization
  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 its stored before on the canvas just put it there
  223. if (temp.getSav().equals("CVS")) {
  224. cvsC.addObject(temp);
  225. } else {
  226. // else look up the table and put it into the right Uppernode
  227. CpsUpperNode temp2 = (CpsUpperNode) objDispatch.get(Integer.parseInt(temp.getSav()));
  228. uppC.addObjectInUpperNode(temp, temp2);
  229. }
  230. objDispatch.put(temp.getId(), temp);
  231. }
  232. /**
  233. * Load a given Element in Canvas by Deserialization
  234. *
  235. * @param jsonElement
  236. * @param objDispatch
  237. * @param eleDispatch
  238. */
  239. private void loadCanvasElements(JsonElement jsonElement, HashMap<Integer, AbstractCpsObject> objDispatch,
  240. HashMap<Integer, HolonElement> eleDispatch) {
  241. // TODO Auto-generated method stub
  242. JsonObject object = jsonElement.getAsJsonObject();
  243. HolonElement temp = gson.fromJson(object.get("properties"), HolonElement.class);
  244. initElements(temp);
  245. // id which Object it was stored before
  246. int stored = object.get("ID").getAsInt();
  247. // lookup that object
  248. HolonObject temp2 = (HolonObject) objDispatch.get(stored);
  249. // add it
  250. objC.addElement(temp2, temp);
  251. // store element also inside a table
  252. eleDispatch.put(temp.getId(), temp);
  253. }
  254. /**
  255. * Load a given Edge by Deserialization
  256. *
  257. * @param type
  258. * @param jsonElement
  259. * @param objDispatch
  260. */
  261. private void loadEdge(EDGETYPE type, JsonElement jsonElement, HashMap<Integer, AbstractCpsObject> objDispatch) {
  262. // TODO Auto-generated method stub
  263. JsonObject object = jsonElement.getAsJsonObject();
  264. CpsEdge temp = gson.fromJson(object.get("properties"), CpsEdge.class);
  265. initCpsEdge(temp);
  266. // look for A and B inside the Table
  267. temp.setA(objDispatch.get(object.get("A").getAsInt()));
  268. temp.setB(objDispatch.get(object.get("B").getAsInt()));
  269. int sav = 0;
  270. switch (type) {
  271. case CANVAS:
  272. // if in canvas add it into the canvas but delete connection before
  273. model.getEdgesOnCanvas().add(temp);
  274. break;
  275. case CONNECTION:
  276. // if no duplicates in connection store them into the given A and B
  277. if (!uppC.lookforDuplicates(temp.getA(), temp.getB(), temp.getA().getConnections()))
  278. temp.getA().getConnections().add(temp);
  279. if (!uppC.lookforDuplicates(temp.getA(), temp.getB(), temp.getB().getConnections()))
  280. temp.getB().getConnections().add(temp);
  281. break;
  282. case NODE:
  283. // put it into given nodeofnode
  284. sav = object.get("ID").getAsInt();
  285. ((CpsUpperNode) objDispatch.get(sav)).getNodeEdges().add(temp);
  286. break;
  287. case OLD:
  288. // same as above
  289. sav = object.get("ID").getAsInt();
  290. ((CpsUpperNode) objDispatch.get(sav)).getOldEdges().add(temp);
  291. break;
  292. default:
  293. break;
  294. }
  295. if (object.get("connection").getAsBoolean() && !type.equals(EDGETYPE.CONNECTION)) {
  296. temp.getA().getConnections().add(temp);
  297. temp.getB().getConnections().add(temp);
  298. }
  299. }
  300. /**
  301. * Load a Unitgraph by Deserialization
  302. *
  303. * @param type
  304. * @param jsonElement
  305. * @param objDispatch
  306. * @param eleDispatch
  307. */
  308. private void loadUnitGraph(GRAPHTYPE type, JsonElement jsonElement, HashMap<Integer, AbstractCpsObject> objDispatch,
  309. HashMap<Integer, HolonElement> eleDispatch) {
  310. // TODO Auto-generated method stub
  311. JsonObject object = jsonElement.getAsJsonObject();
  312. List<String> keys = getKeys(object);
  313. String p = null;
  314. int mid, x, y = 0;
  315. LinkedList<Point> graphpoint = new LinkedList<>();
  316. int sav = 0;
  317. // foreach Point in the graph restore it
  318. for (String k : keys) {
  319. if (!k.equals("ID")) {
  320. p = object.get(k).getAsString();
  321. mid = p.indexOf(':');
  322. x = Integer.parseInt(p.substring(0, mid));
  323. y = Integer.parseInt(p.substring(mid + 1, p.length()));
  324. graphpoint.add(new Point(x, y));
  325. } else
  326. // else its an ID
  327. sav = object.get(k).getAsInt();
  328. }
  329. switch (type) {
  330. case SWITCH:
  331. HolonSwitch sw = (HolonSwitch) objDispatch.get(sav);
  332. sw.setGraphPoints(graphpoint);
  333. break;
  334. case ELEMENT:
  335. HolonElement ele = eleDispatch.get(sav);
  336. ele.setGraphPoints(graphpoint);
  337. break;
  338. default:
  339. break;
  340. }
  341. }
  342. /**
  343. * Initialize the Gson with wanted parameters
  344. */
  345. private void initGson() {
  346. // TODO Auto-generated method stub
  347. GsonBuilder builder = new GsonBuilder();
  348. builder.serializeNulls();
  349. builder.registerTypeAdapter(AbstractCpsObject.class, new AbstractCpsObjectAdapter());
  350. builder.registerTypeAdapter(Position.class, new PositionAdapter());
  351. builder.registerTypeAdapter(Color.class, new ColorAdapter());
  352. // use the builder and make a instance of the Gson
  353. this.gson = builder.create();
  354. this.parser = new JsonParser();
  355. }
  356. /**
  357. * Init new Arrays which havent been serialized along the object
  358. *
  359. * @param obj
  360. */
  361. public void initObjects(AbstractCpsObject obj) {
  362. obj.setConnections(new ArrayList<CpsEdge>());
  363. obj.setTags(new ArrayList<Integer>());
  364. obj.setPseudoTags(new ArrayList<Integer>());
  365. if (obj instanceof HolonObject) {
  366. ((HolonObject) obj).setElements(new ArrayList<HolonElement>());
  367. ((HolonObject) obj).setEleIdx(new HashMap<String, Integer>());
  368. ((HolonObject) obj).setTrackingProd(new float[100]);
  369. ((HolonObject) obj).setTrackingCons(new float[100]);
  370. }
  371. if (obj instanceof HolonSwitch) {
  372. ((HolonSwitch) obj).setActiveAt(true);
  373. ((HolonSwitch) obj).setGraphPoints(new LinkedList<Point>());
  374. }
  375. if (obj instanceof CpsUpperNode) {
  376. ((CpsUpperNode) obj).setNodes(new ArrayList<AbstractCpsObject>());
  377. ((CpsUpperNode) obj).setNodeEdges(new ArrayList<CpsEdge>());
  378. ((CpsUpperNode) obj).setOldEdges(new ArrayList<CpsEdge>());
  379. ((CpsUpperNode) obj).setNodesIdx(new HashMap<Integer, Integer>());
  380. }
  381. }
  382. /**
  383. * Init Elements
  384. *
  385. * @param ele
  386. */
  387. public void initElements(HolonElement ele) {
  388. ele.setEnergyAt(ele.getEnergy());
  389. ele.setGraphPoints(new LinkedList<Point>());
  390. }
  391. /**
  392. * Init Edges
  393. *
  394. * @param edge
  395. */
  396. public void initCpsEdge(CpsEdge edge) {
  397. edge.setTags(new ArrayList<Integer>());
  398. edge.setPseudoTag(new ArrayList<Integer>());
  399. edge.setA(null);
  400. edge.setB(null);
  401. }
  402. /**
  403. * Get Set of Keys
  404. *
  405. * @param json
  406. * @return
  407. */
  408. public List<String> getKeys(JsonObject json) {
  409. return json.entrySet().stream().map(i -> i.getKey()).collect(Collectors.toCollection(ArrayList::new));
  410. }
  411. }