From 0feaefcf7f1399a09daf1d6f483f7b74cc737533 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Wed, 10 Apr 2019 14:42:35 +0200
Subject: [PATCH] select provides options for root and mapping types

---
 .../src/main/js/gui/admin/AddProjectDialog.js | 64 ++++++++++++++-----
 frontend-js/src/main/js/gui/admin/ZipEntry.js |  6 +-
 .../api/projects/ProjectRestImpl.java         | 20 +++++-
 .../api/projects/ProjectRestImplTest.java     | 19 ++++++
 4 files changed, 89 insertions(+), 20 deletions(-)

diff --git a/frontend-js/src/main/js/gui/admin/AddProjectDialog.js b/frontend-js/src/main/js/gui/admin/AddProjectDialog.js
index ff8a559935..7b98ba22ae 100644
--- a/frontend-js/src/main/js/gui/admin/AddProjectDialog.js
+++ b/frontend-js/src/main/js/gui/admin/AddProjectDialog.js
@@ -566,12 +566,25 @@ AddProjectDialog.prototype.createSubmapsTabContent = function () {
     var filename = $(input).attr("data");
     var configuration = self.getConfiguration();
     var mapTypes = configuration.getMapTypes();
+
+    var selectedId = $(input).val();
+
+    var data = self.getEntryByFilename(filename).getData();
+    data.type = undefined;
+    data.root = false;
+    data.mapping = false;
     for (var j = 0; j < mapTypes.length; j++) {
       var mapType = mapTypes[j];
-      if (mapType.id === $(input).val()) {
-        self.getEntryByFilename(filename).getData().type = mapType;
+      if (mapType.id === selectedId) {
+        data.type = mapType;
       }
     }
+    if (selectedId === "ROOT") {
+      data.root = true;
+    }
+    if (selectedId === "MAPPING") {
+      data.mapping = true;
+    }
   });
 
   self.addListener("onZipFileUpload", function () {
@@ -582,17 +595,34 @@ AddProjectDialog.prototype.createSubmapsTabContent = function () {
     for (var i = 0; i < entries.length; i++) {
       var entry = entries[i];
       if (entry.getType() === "MAP") {
-        var row = [];
+        var row = [], selected;
         var typeSelect = "<select data='" + entry.getFilename() + "' name='submapType'>";
 
-        typeSelect += "<option value='" + entry.getData().type.id + "' selected>" + entry.getData().type.name + "</option>";
         var mapTypes = configuration.getMapTypes();
         for (var j = 0; j < mapTypes.length; j++) {
           var mapType = mapTypes[j];
-          if (mapType !== entry.getData().type) {
-            typeSelect += "<option value='" + mapType.id + "' >" + mapType.name + "</option>";
+          if (mapType === entry.getData().type) {
+            selected = " selected";
+          } else {
+            selected = "";
           }
+          typeSelect += "<option value='" + mapType.id + "' " + selected + ">" + mapType.name + "</option>";
+        }
+
+        if (entry.getData().root) {
+          selected = " selected";
+        } else {
+          selected = "";
         }
+        typeSelect += "<option value='ROOT' " + selected + ">ROOT</option>";
+
+        if (entry.getData().mapping) {
+          selected = " selected";
+        } else {
+          selected = "";
+        }
+        typeSelect += "<option value='MAPPING' " + selected + ">MAPPING</option>";
+
         typeSelect += "</select>";
 
 
@@ -1200,10 +1230,10 @@ AddProjectDialog.prototype.checkValidity = function () {
   var mappingExist = 0;
   for (i = 0; i < self.getZipEntries().length; i++) {
     if (self.getZipEntries()[i].getData().mapping) {
-      mappingExist ++;
+      mappingExist++;
     }
   }
-  if (mappingExist>1) {
+  if (mappingExist > 1) {
     error += "<li>only one mapping map can be selected</li>";
     isValid = false;
   }
@@ -1360,15 +1390,17 @@ AddProjectDialog.prototype.createZipEntry = function (jsZipEntry, zipObject) {
       }
       data.name = name;
     }).then(function () {
-      var configuration = self.getConfiguration();
-      var mapTypes = configuration.getMapTypes();
-      for (var i = 0; i < mapTypes.length; i++) {
-        if (mapTypes[i].id === "UNKNOWN") {
-          data.type = mapTypes[i];
+      if (!data.root && !data.mapping) {
+        var configuration = self.getConfiguration();
+        var mapTypes = configuration.getMapTypes();
+        for (var i = 0; i < mapTypes.length; i++) {
+          if (mapTypes[i].id === "UNKNOWN") {
+            data.type = mapTypes[i];
+          }
+        }
+        if (data.type === undefined) {
+          data.type = mapTypes[0];
         }
-      }
-      if (data.type === undefined) {
-        data.type = mapTypes[0];
       }
     });
   }
diff --git a/frontend-js/src/main/js/gui/admin/ZipEntry.js b/frontend-js/src/main/js/gui/admin/ZipEntry.js
index 9a4c40d851..92546fd6c9 100644
--- a/frontend-js/src/main/js/gui/admin/ZipEntry.js
+++ b/frontend-js/src/main/js/gui/admin/ZipEntry.js
@@ -7,7 +7,7 @@ var types = ["IMAGE", "OVERLAY", "MAP"];
  * @param {Object} params
  * @param {string} params.type
  * @param {string} params.filename
- * @param {string} params.data
+ * @param {Object} params.data
  * @constructor
  */
 function ZipEntry(params) {
@@ -54,7 +54,7 @@ ZipEntry.prototype.getFilename = function () {
 
 /**
  *
- * @param {string} data
+ * @param {Object} data
  */
 ZipEntry.prototype.setData = function (data) {
   this._data = data;
@@ -62,7 +62,7 @@ ZipEntry.prototype.setData = function (data) {
 
 /**
  *
- * @returns {string}
+ * @returns {{type: MapType, root:boolean, mapping: boolean}}
  */
 ZipEntry.prototype.getData = function () {
   return this._data;
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java
index 43c39d1351..85b4297df0 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java
@@ -440,7 +440,10 @@ public class ProjectRestImpl extends BaseRestImpl {
         String submodelTypeKey = "zip-entries[" + fileIndex + "][_data][type][id]";
         String rootKey = "zip-entries[" + fileIndex + "][_data][root]";
         String mappingKey = "zip-entries[" + fileIndex + "][_data][mapping]";
-        SubmodelType mapType = SubmodelType.valueOf((String) data.get(submodelTypeKey).get(0));
+        
+        String mapTypeString = getStringValue(data.get(submodelTypeKey), SubmodelType.UNKNOWN.name());
+        SubmodelType mapType = SubmodelType.valueOf(mapTypeString);
+        
         String name = (String) data.get("zip-entries[" + fileIndex + "][_data][name]").get(0);
         Boolean root = getBoolValue(data.get(rootKey), false);
         Boolean mapping = getBoolValue(data.get(mappingKey), false);
@@ -474,6 +477,21 @@ public class ProjectRestImpl extends BaseRestImpl {
     }
   }
 
+  private String getStringValue(List<Object> list, String defaultValue) {
+    if (list == null) {
+      return defaultValue;
+    }
+    if (list.size() == 0) {
+      return defaultValue;
+    }
+    Object obj = list.get(0);
+    if (obj instanceof String) {
+      return (String) list.get(0);
+    } else {
+      return obj.toString();
+    }
+  }
+
   /**
    * Method that computes md5 hash for a given {@link String}.
    * 
diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/ProjectRestImplTest.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/ProjectRestImplTest.java
index 202f5047d2..50143516ac 100644
--- a/rest-api/src/test/java/lcsb/mapviewer/api/projects/ProjectRestImplTest.java
+++ b/rest-api/src/test/java/lcsb/mapviewer/api/projects/ProjectRestImplTest.java
@@ -236,6 +236,25 @@ public class ProjectRestImplTest extends RestTestFunctions {
     }
   }
 
+  @Test
+  public void testExtractZipEntriesWithNoMapType() throws Exception {
+    try {
+      MultiValueMap<String, Object> data = new LinkedMultiValueMap<>();
+      data.put("zip-entries[0][_type]", createLinkedList("MAP"));
+      data.put("zip-entries[0][_filename]", createLinkedList("main.xml"));
+      data.put("zip-entries[0][_data][root]", createLinkedList("true"));
+      data.put("zip-entries[0][_data][name]", createLinkedList("main"));
+      List<ZipEntryFile> result = _projectRestImpl.extractZipEntries(data);
+      assertNotNull(result);
+      assertEquals(1, result.size());
+      assertTrue(result.get(0) instanceof ModelZipEntryFile);
+
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+  }
+
   private LinkedList<Object> createLinkedList(Object string) {
     LinkedList<Object> result = new LinkedList<>();
     result.add(string);
-- 
GitLab