From 644918bcd78be377e3801e2f98a8bc5d4776ddde Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Tue, 30 May 2017 13:26:44 +0200
Subject: [PATCH] AliasMarker takes identifiedelement as an argument

---
 frontend-js/src/main/js/map/CustomMap.js      |  7 +--
 .../src/main/js/map/marker/AbstractMarker.js  |  4 +-
 .../src/main/js/map/marker/AliasMarker.js     | 42 ++++++++++-----
 .../src/main/js/map/marker/PointMarker.js     |  2 +-
 .../src/main/js/map/marker/ReactionMarker.js  |  2 +-
 .../src/test/js/map/AbstractCustomMap-test.js | 31 +++++++----
 .../test/js/map/marker/AliasMarker-test.js    | 51 ++++++++++++-------
 7 files changed, 92 insertions(+), 47 deletions(-)

diff --git a/frontend-js/src/main/js/map/CustomMap.js b/frontend-js/src/main/js/map/CustomMap.js
index c28504f7e7..a56def99de 100644
--- a/frontend-js/src/main/js/map/CustomMap.js
+++ b/frontend-js/src/main/js/map/CustomMap.js
@@ -1236,9 +1236,10 @@ CustomMap.prototype.createMarkerForDbOverlay = function(element, dbOverlay) {
 
   var model = self.getSubmapById(element.getModelId());
   if (element.getType() === "ALIAS") {
-    return model.getModel().getAliasById(element.getId()).then(function(aliasData) {
-      return new AliasMarker(element.getId(), element.getIcon(), aliasData, model);
-    });
+    var marker = new AliasMarker(element, self); 
+    return marker.init().then(function(){
+      return marker;
+    })
   } else if (element.getType() === "REACTION") {
     return model.getModel().getReactionById(element.getId()).then(function(reactionData) {
       return new ReactionMarker(element.getId(), element.getIcon(), reactionData, model);
diff --git a/frontend-js/src/main/js/map/marker/AbstractMarker.js b/frontend-js/src/main/js/map/marker/AbstractMarker.js
index d7bb24a666..3305822e93 100644
--- a/frontend-js/src/main/js/map/marker/AbstractMarker.js
+++ b/frontend-js/src/main/js/map/marker/AbstractMarker.js
@@ -109,7 +109,7 @@ AbstractMarker.prototype.setMap = function(map) {
 /**
  * Initializes google.maps.Marker object connected to this object.
  */
-AbstractMarker.prototype.init = function() {
+AbstractMarker.prototype._init = function() {
   var self = this;
   var point = this.getCoordinates();
   var latLng = this.getCustomMap().fromPointToLatLng(point);
@@ -128,7 +128,7 @@ AbstractMarker.prototype.init = function() {
     };
   })();
   google.maps.event.addListener(this.getGoogleMarker(), 'click', onclick);
-
+  return Promise.resolve();
 };
 
 /**
diff --git a/frontend-js/src/main/js/map/marker/AliasMarker.js b/frontend-js/src/main/js/map/marker/AliasMarker.js
index 6ba49483a2..b06f3ae9b3 100644
--- a/frontend-js/src/main/js/map/marker/AliasMarker.js
+++ b/frontend-js/src/main/js/map/marker/AliasMarker.js
@@ -1,24 +1,20 @@
 "use strict";
 
 var AbstractMarker = require('./AbstractMarker');
+var IdentifiedElement = require('../data/IdentifiedElement');
 
 /**
  * This class describes Google maps marker (connected to {@link Alias}) that is
  * visualized on the map.
  */
-function AliasMarker(id, icon, aliasData, map) {
-  AbstractMarker.call(this, icon, map);
-  // id of the alias to which marker is connected
-  this._id = id;
-  // data about the Alias connected to the marker
-  this._aliasData = aliasData;
-  // google.maps.Marker object
-  this._marker = null;
-  if (this._aliasData === null || this._aliasData === undefined) {
-    throw new Error("Alias for marker must be defined");
+function AliasMarker(element, map) {
+  if (!(element instanceof IdentifiedElement)) {
+    throw new Error("First argument must be of IdentifiedElement class");
   }
-  this.init();
-  this.show();
+  AbstractMarker.call(this, element.getIcon(), map);
+  // id of the alias to which marker is connected
+  this.setId(element.getId());
+  this.setIdentifiedElement(element);
 }
 AliasMarker.prototype = Object.create(AbstractMarker.prototype);
 AliasMarker.prototype.constructor = AliasMarker;
@@ -31,6 +27,9 @@ AliasMarker.prototype.constructor = AliasMarker;
 AliasMarker.prototype.getId = function() {
   return this._id;
 };
+AliasMarker.prototype.setId = function(id) {
+  this._id = id;
+};
 
 /**
  * Returns {@link Alias} data for this marker.
@@ -74,4 +73,23 @@ AliasMarker.prototype.getModelId = function() {
   return this.getAliasData().getModelId();
 };
 
+AliasMarker.prototype.init = function() {
+  var self = this;
+  var model = self.getCustomMap().getModel().getSubmodelById(self.getIdentifiedElement().getModelId());
+  return model.getByIdentifiedElement(self.getIdentifiedElement()).then(function(aliasData) {
+    self.setAliasData(aliasData);
+    return self._init();
+  }).then(function() {
+    self.show();
+  });
+};
+
+AliasMarker.prototype.getIdentifiedElement = function() {
+  return this._identifiedElement;
+};
+
+AliasMarker.prototype.setIdentifiedElement = function(identifiedElement) {
+  this._identifiedElement = identifiedElement;
+};
+
 module.exports = AliasMarker;
diff --git a/frontend-js/src/main/js/map/marker/PointMarker.js b/frontend-js/src/main/js/map/marker/PointMarker.js
index 7f24a72767..6c2afb3310 100644
--- a/frontend-js/src/main/js/map/marker/PointMarker.js
+++ b/frontend-js/src/main/js/map/marker/PointMarker.js
@@ -16,7 +16,7 @@ function PointMarker(pointData, icon, map) {
   if (typeof map === "undefined") {
     throw new Error("Map must be passed");
   }
-  this.init();
+  this._init();
   this.show();
 }
 PointMarker.prototype = Object.create(AbstractMarker.prototype);
diff --git a/frontend-js/src/main/js/map/marker/ReactionMarker.js b/frontend-js/src/main/js/map/marker/ReactionMarker.js
index 6199fd525a..789aa8c04d 100644
--- a/frontend-js/src/main/js/map/marker/ReactionMarker.js
+++ b/frontend-js/src/main/js/map/marker/ReactionMarker.js
@@ -15,7 +15,7 @@ function ReactionMarker(id, icon, reactionData, map) {
   // google.maps.Marker object
   this._marker = null;
   if (this._reactionData !== null && this._reactionData !== undefined) {
-    this.init();
+    this._init();
     this.show();
   }
 }
diff --git a/frontend-js/src/test/js/map/AbstractCustomMap-test.js b/frontend-js/src/test/js/map/AbstractCustomMap-test.js
index 82abf3c8f7..2f54aa65b9 100644
--- a/frontend-js/src/test/js/map/AbstractCustomMap-test.js
+++ b/frontend-js/src/test/js/map/AbstractCustomMap-test.js
@@ -8,6 +8,7 @@ var AliasMarker = require('../../../main/js/map/marker/AliasMarker');
 var AbstractCustomMap = require('../../../main/js/map/AbstractCustomMap');
 var PointData = require('../../../main/js/map/data/PointData');
 var PointMarker = require('../../../main/js/map/marker/PointMarker');
+var IdentifiedElement = require('../../../main/js/map/data/IdentifiedElement');
 
 var chai = require('chai');
 var assert = chai.assert;
@@ -288,15 +289,25 @@ describe('AbstractCustomMap', function() {
   });
 
   it("_openInfoWindowForMarker(AliasMarker)", function() {
-    var mockObject = helper.createCustomMap();
-
-    var data = helper.createAlias(mockObject);
-    data.setIsComplete(true);
-    var aliasMarker = new AliasMarker(data.getId(), "empty.png", data, mockObject);
-
-    assert.equal(null, mockObject.getAliasInfoWindowById(data.getId()));
-    return mockObject._openInfoWindowForMarker(aliasMarker).then(function(){
-      assert.ok(mockObject.getAliasInfoWindowById(data.getId()));
+    var map;
+    var alias, marker;
+    return ServerConnector.getProject().then(function(project) {
+      map = helper.createCustomMap(project);
+      return map.getModel().getAliasById(329171);
+    }).then(function(result) {
+      alias = result;
+
+      var identifiedElement = new IdentifiedElement(alias);
+      identifiedElement.setIcon("empty.png");
+
+      marker = new AliasMarker(identifiedElement, map);
+
+      return marker.init();
+    }).then(function(){
+      assert.equal(null, map.getAliasInfoWindowById(alias.getId()));
+      return map._openInfoWindowForMarker(marker).then(function() {
+        assert.ok(map.getAliasInfoWindowById(alias.getId()));
+      });
     });
 
   });
@@ -307,7 +318,7 @@ describe('AbstractCustomMap', function() {
     mockObject.getTopMap = function() {
       return mockObject;
     };
-    mockObject.getOverlayDataForPoint= function() {
+    mockObject.getOverlayDataForPoint = function() {
       return Promise.resolve([]);
     };
 
diff --git a/frontend-js/src/test/js/map/marker/AliasMarker-test.js b/frontend-js/src/test/js/map/marker/AliasMarker-test.js
index f2d1d916c4..5b1311374e 100644
--- a/frontend-js/src/test/js/map/marker/AliasMarker-test.js
+++ b/frontend-js/src/test/js/map/marker/AliasMarker-test.js
@@ -3,6 +3,7 @@
 var Helper = require('../../Helper');
 
 var AliasMarker = require('../../../../main/js/map/marker/AliasMarker');
+var IdentifiedElement = require('../../../../main/js/map/data/IdentifiedElement');
 var assert = require('assert');
 
 describe('AliasMarker', function() {
@@ -12,29 +13,43 @@ describe('AliasMarker', function() {
   });
 
   it("Constructor", function() {
-    var map = helper.createAbstractCustomMap();
-    var alias = helper.createAlias(map);
-
-    var aliasMarker = new AliasMarker(alias.getId(), "empty.png", alias, map);
-
-    assert.equal(alias.getId(), aliasMarker.getId());
-    assert.equal(map, aliasMarker.getCustomMap());
-    assert.equal("empty.png", aliasMarker.getIcon());
-    assert.equal(alias, aliasMarker.getAliasData());
-
-    assert.ok(aliasMarker._marker);
-    assert.ok(aliasMarker.getBounds());
+    var map;
+    var alias, marker;
+    return ServerConnector.getProject().then(function(project) {
+      map = helper.createCustomMap(project);
+      return map.getModel().getAliasById(329171);
+    }).then(function(result) {
+      alias = result;
+
+      var identifiedElement = new IdentifiedElement(alias);
+      identifiedElement.setIcon("empty.png");
+
+      marker = new AliasMarker(identifiedElement, map);
+
+      assert.equal(alias.getId(), marker.getId());
+      assert.equal(map, marker.getCustomMap());
+      assert.equal("empty.png", marker.getIcon());
+      return marker.init();
+    }).then(function() {
+      assert.equal(alias, marker.getAliasData());
+      assert.ok(marker._marker);
+      assert.ok(marker.getBounds());
+    });
   });
 
   it("click on marker", function() {
-    return ServerConnector.getProject().then(function(project){
-      var map = helper.createCustomMap(project);
-      var alias = helper.createAlias(map);
+    var map;
+    return ServerConnector.getProject().then(function(project) {
+      map = helper.createCustomMap(project);
+      return map.getModel().getAliasById(329171);
+    }).then(function(alias) {
+
+      var identifiedElement = new IdentifiedElement(alias);
+
+      var aliasMarker = new AliasMarker(identifiedElement, map);
 
-      var aliasMarker = new AliasMarker(alias.getId(), "empty.png", alias, map);
+      return google.maps.event.trigger(aliasMarker.getGoogleMarker(), "click").then(function() {
 
-      return google.maps.event.trigger(aliasMarker.getGoogleMarker(), "click").then(function(){
-        
       });
     });
   });
-- 
GitLab