From c28683704ee30641b5fd12b292474f16ff508154 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Mon, 12 Jun 2017 10:45:31 +0200
Subject: [PATCH] when trying to show elements twice without waitng for promise
 resolve exception is thrown

---
 .../src/main/js/map/overlay/UserDbOverlay.js  | 104 +++++++++++-------
 frontend-js/src/test/js/minerva-test.js       |  39 +++++++
 2 files changed, 101 insertions(+), 42 deletions(-)

diff --git a/frontend-js/src/main/js/map/overlay/UserDbOverlay.js b/frontend-js/src/main/js/map/overlay/UserDbOverlay.js
index 776ab7b925..b37f17313d 100644
--- a/frontend-js/src/main/js/map/overlay/UserDbOverlay.js
+++ b/frontend-js/src/main/js/map/overlay/UserDbOverlay.js
@@ -39,6 +39,8 @@ UserDbOverlay.prototype.getDetailDataByIdentifiedElement = function(element) {
 UserDbOverlay.prototype.addMarker = function(params) {
   var self = this;
 
+  self.disableAddRemoveElements();
+
   var elements = [];
   if (params.length === undefined) {
     params = [ params ];
@@ -51,6 +53,7 @@ UserDbOverlay.prototype.addMarker = function(params) {
       element.setIcon(singleElementParam.icon);
     }
     if (self._markerIdentifiedElements[element.getType()][element.getId()] !== undefined) {
+      self.enableAddRemoveElements();
       return Promise.reject(new Error("Element already highlighted: " + element.getId()));
     }
     elements.push(element);
@@ -61,6 +64,7 @@ UserDbOverlay.prototype.addMarker = function(params) {
   }
 
   return self.getIdentifiedElements().then(function(elements) {
+    self.enableAddRemoveElements();
     return self.callListeners("onSearch", {
       fitBounds : false,
       identifiedElements : elements,
@@ -70,6 +74,7 @@ UserDbOverlay.prototype.addMarker = function(params) {
 
 UserDbOverlay.prototype.addSurface = function(params) {
   var self = this;
+  self.disableAddRemoveElements();
 
   var elements = [];
   if (params.length === undefined) {
@@ -84,6 +89,7 @@ UserDbOverlay.prototype.addSurface = function(params) {
       element.setOpacity(singleElementParam.options.opacity);
     }
     if (self._surfaceIdentifiedElements[element.getType()][element.getId()] !== undefined) {
+      self.enableAddRemoveElements();
       return Promise.reject(new Error("Element already highlighted: " + element.getId()));
     }
     elements.push(element);
@@ -94,6 +100,7 @@ UserDbOverlay.prototype.addSurface = function(params) {
   }
 
   return self.getIdentifiedElements().then(function(elements) {
+    self.enableAddRemoveElements();
     return self.callListeners("onSearch", {
       fitBounds : false,
       identifiedElements : elements,
@@ -103,69 +110,82 @@ UserDbOverlay.prototype.addSurface = function(params) {
 
 UserDbOverlay.prototype.removeMarker = function(params) {
   var self = this;
+  self.disableAddRemoveElements();
 
   var elements = [];
   if (params.length === undefined) {
     params = [ params ];
   }
-  if (params.length > 0) {
-    var i, element;
-    for (i = 0; i < params.length; i++) {
-      var singleElementParam = params[i];
-      element = new IdentifiedElement(singleElementParam.element);
-      if (self._markerIdentifiedElements[element.getType()][element.getId()] === undefined) {
-        return Promise.reject(new Error("Element is not highlighted: " + element.getId()));
-      }
-      elements.push(element);
-    }
-    for (i = 0; i < elements.length; i++) {
-      element = elements[i];
-      self._markerIdentifiedElements[element.getType()][element.getId()] = undefined;
-      delete self._markerIdentifiedElements[element.getType()][element.getId()];
+  var i, element;
+  for (i = 0; i < params.length; i++) {
+    var singleElementParam = params[i];
+    element = new IdentifiedElement(singleElementParam.element);
+    if (self._markerIdentifiedElements[element.getType()][element.getId()] === undefined) {
+      self.enableAddRemoveElements();
+      return Promise.reject(new Error("Element is not highlighted: " + element.getId()));
     }
+    elements.push(element);
+  }
+  for (i = 0; i < elements.length; i++) {
+    element = elements[i];
+    self._markerIdentifiedElements[element.getType()][element.getId()] = undefined;
+    delete self._markerIdentifiedElements[element.getType()][element.getId()];
+  }
 
-    return self.getIdentifiedElements().then(function(elements) {
-      return self.callListeners("onSearch", {
-        fitBounds : false,
-        identifiedElements : elements,
-      });
+  return self.getIdentifiedElements().then(function(elements) {
+    self.enableAddRemoveElements();
+    return self.callListeners("onSearch", {
+      fitBounds : false,
+      identifiedElements : elements,
     });
-  } else {
-    return Promise.resolve();
-  }
+  });
 };
 
 UserDbOverlay.prototype.removeSurface = function(params) {
   var self = this;
+  self.disableAddRemoveElements();
 
   var elements = [];
   if (params.length === undefined) {
     params = [ params ];
   }
-  if (params.length > 0) {
-    var i, element;
-    for (i = 0; i < params.length; i++) {
-      var singleElementParam = params[i];
-      element = new IdentifiedElement(singleElementParam.element);
-      if (self._surfaceIdentifiedElements[element.getType()][element.getId()] === undefined) {
-        return Promise.reject(new Error("Element is not highlighted: " + element.getId()));
-      }
-      elements.push(element);
-    }
-    for (i = 0; i < elements.length; i++) {
-      element = elements[i];
-      self._surfaceIdentifiedElements[element.getType()][element.getId()] = undefined;
-      delete self._surfaceIdentifiedElements[element.getType()][element.getId()];
+  var i, element;
+  for (i = 0; i < params.length; i++) {
+    var singleElementParam = params[i];
+    element = new IdentifiedElement(singleElementParam.element);
+    if (self._surfaceIdentifiedElements[element.getType()][element.getId()] === undefined) {
+      self.enableAddRemoveElements();
+      return Promise.reject(new Error("Element is not highlighted: " + element.getId()));
     }
+    elements.push(element);
+  }
+  for (i = 0; i < elements.length; i++) {
+    element = elements[i];
+    self._surfaceIdentifiedElements[element.getType()][element.getId()] = undefined;
+    delete self._surfaceIdentifiedElements[element.getType()][element.getId()];
+  }
 
-    return self.getIdentifiedElements().then(function(elements) {
-      return self.callListeners("onSearch", {
-        fitBounds : false,
-        identifiedElements : elements,
-      });
+  return self.getIdentifiedElements().then(function(elements) {
+    self.enableAddRemoveElements();
+    return self.callListeners("onSearch", {
+      fitBounds : false,
+      identifiedElements : elements,
     });
+  });
+};
+
+UserDbOverlay.prototype.disableAddRemoveElements = function() {
+  if (this._addRemoveElementsDisabled) {
+    throw new Error("wait until previous Promise for showBioEntity/hideBioEntity is resolved");
+  } else {
+    this._addRemoveElementsDisabled = true;
+  }
+};
+UserDbOverlay.prototype.enableAddRemoveElements = function() {
+  if (this._addRemoveElementsDisabled) {
+    this._addRemoveElementsDisabled = false;
   } else {
-    return Promise.resolve();
+    logger.warn("showBioEntity/hideBioEntity is not disabled");
   }
 };
 
diff --git a/frontend-js/src/test/js/minerva-test.js b/frontend-js/src/test/js/minerva-test.js
index 509f4ba3c1..a784b86354 100644
--- a/frontend-js/src/test/js/minerva-test.js
+++ b/frontend-js/src/test/js/minerva-test.js
@@ -333,6 +333,45 @@ describe('minerva global', function() {
     });
   });
 
+  it("showElement twice", function() {
+    var options = {
+      projectId : "sample",
+      element : testDiv
+    };
+    var globalResult;
+    var elementToShow = {
+      element : {
+        id : 329171,
+        modelId : 15781,
+        type : "ALIAS"
+      },
+      type : "ICON",
+    };
+    var elementToShow2 = {
+      element : {
+        id : 329171,
+        modelId : 15781,
+        type : "ALIAS"
+      },
+      type : "SURFACE",
+      options : {
+        color : "#FF0000",
+      }
+    };
+
+    return minerva.create(options).then(function(result) {
+      globalResult = result;
+      globalResult.showBioEntity(elementToShow);
+      return globalResult.showBioEntity(elementToShow2);
+    }).then(function() {
+      globalResult.destroy();
+      assert.ok(false, "Should be rejected due to fact that there is show in progress");
+    }, function(error) {
+      assert.ok(error.message.indexOf("wait until previous Promise for showBioEntity/hideBioEntity is resolved") >= 0);
+      globalResult.destroy();
+    });
+  });
+
   it("setCenter", function() {
     var options = {
       projectId : "sample",
-- 
GitLab