LoadController.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  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.Collections;
  8. import java.util.HashMap;
  9. import java.util.Iterator;
  10. import java.util.List;
  11. import java.util.stream.Collector;
  12. import java.util.stream.Collectors;
  13. import org.json.simple.parser.JSONParser;
  14. import org.json.simple.parser.ParseException;
  15. import com.google.gson.Gson;
  16. import com.google.gson.GsonBuilder;
  17. import com.google.gson.JsonElement;
  18. import com.google.gson.JsonObject;
  19. import com.google.gson.JsonParser;
  20. import com.google.gson.stream.JsonReader;
  21. import TypeAdapter.AbstractCpsObjectAdapter;
  22. import TypeAdapter.ColorAdapter;
  23. import TypeAdapter.PositionAdapter;
  24. import classes.Category;
  25. import classes.CpsEdge;
  26. import classes.CpsNode;
  27. import classes.AbstractCpsObject;
  28. import classes.HolonElement;
  29. import classes.HolonObject;
  30. import classes.HolonSwitch;
  31. import classes.HolonTransformer;
  32. import classes.IdCounter;
  33. import classes.Position;
  34. import ui.model.Model;
  35. /**
  36. * Controller for the Loading.
  37. *
  38. * @author Gruppe14
  39. */
  40. public class LoadController {
  41. /**
  42. * enum Mode.
  43. */
  44. public enum MODE {
  45. COMPLETE, PARTIAL
  46. }
  47. public enum TYPE {
  48. CATEGORY, CANVAS
  49. }
  50. public enum EDGETYPE {
  51. CANVAS, CONNECTION, NODE, OLD
  52. }
  53. public enum NUMTYPE {
  54. CATEGORY, OBJECT, ELEMENT, EDGE, CONNECTION, NODEEDGE, OLDEDGE, UNITGRAPH
  55. }
  56. public enum GRAPHTYPE {
  57. SWITCH, ELEMENT
  58. }
  59. private Model model;
  60. private CategoryController cgC;
  61. private CanvasController cvsC;
  62. private ObjectController objC;
  63. private MultiPurposeController mpC;
  64. private Gson gson;
  65. // uninitialized arrays only init when needed
  66. ArrayList<String> jCat, jObj, jEle, jEdge, jConn, jNodeEdge, jOldEdge, jUnitGraph;
  67. /**
  68. * Constructor.
  69. *
  70. * @param model
  71. * Model
  72. * @param cg
  73. * CategoryController
  74. * @param cvs
  75. * CanvasController
  76. * @param obj
  77. * ObjectController
  78. * @param mp
  79. * MultiPurposeController
  80. */
  81. public LoadController(Model model, CategoryController cg, CanvasController cvs, ObjectController obj, MultiPurposeController mp) {
  82. this.model = model;
  83. this.cgC = cg;
  84. this.cvsC = cvs;
  85. this.objC = obj;
  86. this.mpC = mp;
  87. initGson();
  88. }
  89. /**
  90. * Reads the the JSON File and load the state into the Model.
  91. *
  92. * @param path
  93. * the Path
  94. * @throws IOException
  95. * exception
  96. */
  97. public void readJson(String path) throws IOException {
  98. JsonParser parser = new JsonParser();
  99. JsonObject json = (JsonObject) parser.parse(new FileReader(path));
  100. // get all keys via stream
  101. List<String> keys = json.entrySet().stream().map(i -> i.getKey())
  102. .collect(Collectors.toCollection(ArrayList::new));
  103. initialize(keys, json);
  104. distribute(keys, json, parser);
  105. // for (Object key : keys) {
  106. // if (key.equals("CG"))
  107. // readCategory((JSONArray) json.get((String) key));
  108. // else if (key.equals("ID"))
  109. // IdCounter.setCounter(Integer.parseInt(json.get(key.toString()).toString()));
  110. // // else if (key.equals("SIZEX"))
  111. // // global.setCanvasX(Integer.parseInt(json.get(key.toString()).toString()));
  112. // // else if (key.equals("SIZEY"))
  113. // // global.setCanvasY(Integer.parseInt(json.get(key.toString()).toString()));
  114. // else if (key.toString().contains("CGO") || key.toString().contains("CVSO"))
  115. // obj.add(key.toString());
  116. // else if (key.toString().contains("CGE") || key.toString().contains("CVSE"))
  117. // ele.add(key.toString());
  118. // else if (key.toString().contains("EDGE"))
  119. // edge.add(key.toString());
  120. // else if (key.toString().contains("CGGP") || key.toString().contains("CVSGP"))
  121. // gp.add(key.toString());
  122. //
  123. // }
  124. //
  125. // dispatch(obj, json);
  126. // dispatch(ele, json);
  127. // dispatch(edge, json);
  128. // dispatch(gp, json);
  129. }
  130. private void distribute(List<String> keys, JsonObject json, JsonParser parser) {
  131. // TODO Auto-generated method stub
  132. for (String key : keys) {
  133. if(key.contains("CATEGORY"))
  134. loadCategory(json.get(key));
  135. if(key.contains("CGOBJECT"))
  136. loadCategoryObject(TYPE.CATEGORY, json.get(key).getAsJsonObject());
  137. }
  138. }
  139. private void loadCategoryObject(TYPE type, JsonObject jsonElement) {
  140. // TODO Auto-generated method stub
  141. AbstractCpsObject temp = gson.fromJson(jsonElement., AbstractCpsObject.class);
  142. cgC.addObject(mpC.searchCat(temp.getSav()), temp);
  143. }
  144. private void loadCategory(JsonElement jsonElement) {
  145. // TODO Auto-generated method stub
  146. cgC.addCategory(new Category(jsonElement.getAsString()));
  147. }
  148. private void initialize(List<String> keys, JsonObject json) {
  149. switch (MODE.valueOf(json.get("MODE").getAsString())) {
  150. case COMPLETE:
  151. model.setCgIdx(new HashMap<String, Integer>());
  152. model.setCategories(new ArrayList<Category>());
  153. model.setCvsObjIdx(new HashMap<Integer, Integer>());
  154. model.setObjectsOnCanvas(new ArrayList<AbstractCpsObject>());
  155. model.setEdgesOnCanvas(new ArrayList<CpsEdge>());
  156. model.setCanvasX(json.get("CANVAS_SIZE_X").getAsInt());
  157. model.setCanvasX(json.get("CANVAS_SIZE_Y").getAsInt());
  158. break;
  159. case PARTIAL:
  160. model.setCvsObjIdx(new HashMap<Integer, Integer>());
  161. model.setObjectsOnCanvas(new ArrayList<AbstractCpsObject>());
  162. model.setEdgesOnCanvas(new ArrayList<CpsEdge>());
  163. break;
  164. default:
  165. break;
  166. }
  167. IdCounter.setCounter(json.get("IDCOUNTER").getAsInt());
  168. }
  169. /**
  170. * dispatch the Keys into the right processing.
  171. *
  172. * @param input
  173. * input
  174. * @param json
  175. * Json
  176. */
  177. public void dispatch(ArrayList<String> input, JSONObject json) {
  178. for (String str : input) {
  179. if (str.contains("CGO")) {
  180. readCategoryObject((JSONArray) json.get(str));
  181. } else if (str.contains("CVSO")) {
  182. readCanvasObject((JSONArray) json.get(str));
  183. } else if (str.contains("CGE") || str.contains("CVSE")) {
  184. readElement((JSONArray) json.get(str));
  185. } else if (str.contains("EDGE")) {
  186. readEdge((JSONArray) json.get(str));
  187. } else if (str.contains("CGGP") || str.contains("CVSGP")) {
  188. readElementGraph((JSONArray) json.get(str));
  189. }
  190. }
  191. }
  192. /**
  193. * Read all Categories from the JSON file.
  194. *
  195. * @param arr
  196. * JSONArray
  197. */
  198. public void readCategory(JSONArray arr) {
  199. Iterator<Object> i = arr.iterator();
  200. while (i.hasNext()) {
  201. cgC.addNewCategory(next(i));
  202. }
  203. }
  204. /**
  205. * Read all Objects in Category from the JSON File.
  206. *
  207. * @param arr
  208. * JSON Array
  209. */
  210. public void readCategoryObject(JSONArray arr) {
  211. Iterator<Object> i = arr.iterator();
  212. String type = next(i);
  213. if (type.equals("HolonObject")) {
  214. cgC.addNewHolonObject(mpC.searchCat(next(i)), next(i), new ArrayList<HolonElement>(), next(i));
  215. } else if (type.equals("HolonTransformer")) {
  216. cgC.addNewHolonTransformer(mpC.searchCat(next(i)), next(i), next(i));
  217. } else if (type.equals("HolonSwitch")) {
  218. cgC.addNewHolonSwitch(mpC.searchCat(next(i)), next(i), next(i));
  219. }
  220. }
  221. /**
  222. * Read all Objects in Canvas from JSON File.
  223. *
  224. * @param arr
  225. * JSON Array
  226. */
  227. public void readCanvasObject(JSONArray arr) {
  228. Iterator<Object> i = arr.iterator();
  229. AbstractCpsObject cps = null;
  230. String type = next(i);
  231. if (type.equals("HolonObject")) {
  232. cps = new HolonObject(next(i));
  233. } else if (type.equals("HolonTransformer")) {
  234. cps = new HolonTransformer(next(i));
  235. } else if (type.equals("HolonSwitch")) {
  236. cps = new HolonSwitch(next(i));
  237. } else if (type.equals("CpsNode")) {
  238. cps = new CpsNode(next(i));
  239. }
  240. cps.setName(next(i));
  241. cps.setID(Integer.parseInt(next(i)));
  242. cps.setImage(next(i));
  243. cps.setPosition(Integer.parseInt(next(i)), Integer.parseInt(next(i)));
  244. cvsC.addNewObject(cps);
  245. }
  246. /**
  247. * Read all Elements in Category and Canvas from JSON File.
  248. *
  249. * @param arr
  250. * JSON Array
  251. */
  252. public void readElement(JSONArray arr) {
  253. Iterator<Object> i = arr.iterator();
  254. String sav = next(i);
  255. String obj = next(i);
  256. HolonElement ele = new HolonElement(next(i), Integer.parseInt(next(i)), Float.parseFloat(next(i)));
  257. if (sav.equals("CVS")) {
  258. ele.setActive(convert(Integer.parseInt(next(i))));
  259. objC.addElementIntoCanvasObject((HolonObject) mpC.searchByID(Integer.parseInt(obj)), ele);
  260. } else
  261. objC.addElementIntoCategoryObject(sav, obj, ele);
  262. }
  263. /**
  264. * Read.
  265. *
  266. * @param arr
  267. * JSON Array
  268. */
  269. public void readEdge(JSONArray arr) {
  270. Iterator<Object> i = arr.iterator();
  271. CpsEdge edge = new CpsEdge(mpC.searchByID(Integer.parseInt(next(i))),
  272. mpC.searchByID(Integer.parseInt(next(i))));
  273. edge.setCapacity(Float.parseFloat(next(i)));
  274. edge.setFlow(Float.parseFloat(next(i)));
  275. cvsC.addEdgeOnCanvas(edge);
  276. }
  277. /**
  278. * Read the Element Graph.
  279. *
  280. * @param arr
  281. * JSON Array
  282. */
  283. public void readElementGraph(JSONArray arr) {
  284. Iterator<Object> i = arr.iterator();
  285. String sav = next(i);
  286. HolonElement ele;
  287. if (sav.equals("CVS")) {
  288. ele = mpC.searchEle((HolonObject) mpC.searchByID(Integer.parseInt(next(i))), next(i));
  289. while (i.hasNext())
  290. ele.getGraphPoints().add(new Point(Integer.parseInt(next(i)), Integer.parseInt(next(i))));
  291. } else {
  292. ele = mpC.searchEle((HolonObject) mpC.searchCatObj(mpC.searchCat(sav), next(i)), next(i));
  293. while (i.hasNext())
  294. ele.getGraphPoints().add(new Point(Integer.parseInt(next(i)), Integer.parseInt(next(i))));
  295. }
  296. }
  297. /**
  298. * Get the Next Element from an Iterator.
  299. *
  300. * @param i
  301. * Iterator
  302. * @return next Element from the Iterator
  303. */
  304. public String next(Iterator<Object> i) {
  305. return i.next().toString();
  306. }
  307. /**
  308. * converting saved Integers into Booleans.
  309. *
  310. * @param x
  311. * integer
  312. * @return boolean
  313. */
  314. public boolean convert(int x) {
  315. return x == 1 ? true : false;
  316. }
  317. /**
  318. * Initialize the Gson with wanted parameters
  319. */
  320. private void initGson() {
  321. // TODO Auto-generated method stub
  322. GsonBuilder builder = new GsonBuilder();
  323. builder.excludeFieldsWithoutExposeAnnotation().serializeNulls().setPrettyPrinting();
  324. builder.registerTypeAdapter(AbstractCpsObject.class, new AbstractCpsObjectAdapter());
  325. builder.registerTypeAdapter(Position.class, new PositionAdapter());
  326. builder.registerTypeAdapter(Color.class, new ColorAdapter());
  327. // use the builder and make a instance of the Gson
  328. this.gson = builder.create();
  329. }
  330. private void initArrays() {
  331. }
  332. }