From 1f85699ba6d339211595bf82e0fbb583960fde8c Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Thu, 20 Jul 2017 18:00:12 +0200
Subject: [PATCH] drug, mirna and checmical have common interface

---
 frontend-js/src/main/js/map/data/Chemical.js  | 36 +++--------------
 frontend-js/src/main/js/map/data/Drug.js      | 35 +++-------------
 frontend-js/src/main/js/map/data/MiRna.js     | 35 ++--------------
 .../main/js/map/data/TargettingStructure.js   | 40 +++++++++++++++++++
 .../overlay/AbstractTargettingDbOverlay.js    | 18 ++++++++-
 .../main/js/map/window/AbstractInfoWindow.js  | 38 ++++++------------
 .../test/js/gui/leftPanel/GuiUtils-test.js    |  1 -
 .../js/map/window/AliasInfoWindow-test.js     |  8 ++++
 8 files changed, 92 insertions(+), 119 deletions(-)
 create mode 100644 frontend-js/src/main/js/map/data/TargettingStructure.js

diff --git a/frontend-js/src/main/js/map/data/Chemical.js b/frontend-js/src/main/js/map/data/Chemical.js
index de0fe4ec01..10fb8b1946 100644
--- a/frontend-js/src/main/js/map/data/Chemical.js
+++ b/frontend-js/src/main/js/map/data/Chemical.js
@@ -1,22 +1,25 @@
 "use strict";
 
 var Annotation = require("./Annotation");
+
 var Target = require("./Target");
+var TargettingStructure = require("./TargettingStructure");
 
 function Chemical(javaObject) {
+  TargettingStructure.call(this, javaObject);
   if (javaObject !== undefined) {
-    this.setName(javaObject.name);
     this.setReferences(javaObject.references);
     this.setDescription(javaObject.description);
     this.setSynonyms(javaObject.synonyms);
-    this.setId(javaObject.id);
-    this.setTargets(javaObject.targets);
 
     this.setDirectEvidence(javaObject.directEvidence);
     this.setDirectEvidenceReferences(javaObject.directEvidenceReferences);
   }
 }
 
+Chemical.prototype = Object.create(TargettingStructure.prototype);
+Chemical.prototype.constructor = Chemical;
+
 Chemical.prototype.setDirectEvidence = function(directeEvidence) {
   this._directeEvidence = directeEvidence;
 };
@@ -63,22 +66,6 @@ Chemical.prototype.getSynonyms = function() {
   return this._synonyms;
 };
 
-Chemical.prototype.setName = function(name) {
-  this._name = name;
-};
-
-Chemical.prototype.getName = function() {
-  return this._name;
-};
-
-Chemical.prototype.setId = function(id) {
-  this._id = id;
-};
-
-Chemical.prototype.getId = function() {
-  return this._id;
-};
-
 Chemical.prototype.setDescription = function(description) {
   this._description = description;
 };
@@ -87,17 +74,6 @@ Chemical.prototype.getDescription = function() {
   return this._description;
 };
 
-Chemical.prototype.setTargets = function(targets) {
-  this._targets = [];
-  for (var i = 0; i < targets.length; i++) {
-    this._targets.push(new Target(targets[i]));
-  }
-};
-
-Chemical.prototype.getTargets = function() {
-  return this._targets;
-};
-
 Chemical.prototype.setBloodBrainBarrier = function(bloodBrainBarrier) {
   this._bloodBrainBarrier = bloodBrainBarrier;
 };
diff --git a/frontend-js/src/main/js/map/data/Drug.js b/frontend-js/src/main/js/map/data/Drug.js
index 9391dbc8a3..b737199fd4 100644
--- a/frontend-js/src/main/js/map/data/Drug.js
+++ b/frontend-js/src/main/js/map/data/Drug.js
@@ -2,20 +2,22 @@
 
 var Annotation = require("./Annotation");
 var Target = require("./Target");
+var TargettingStructure = require("./TargettingStructure");
 
 function Drug(javaObject) {
+  TargettingStructure.call(this, javaObject);
   if (javaObject !== undefined) {
     this.setBrandNames(javaObject.brandNames);
     this.setReferences(javaObject.references);
     this.setSynonyms(javaObject.synonyms);
-    this.setName(javaObject.name);
-    this.setId(javaObject.id);
     this.setDescription(javaObject.description);
-    this.setTargets(javaObject.targets);
     this.setBloodBrainBarrier(javaObject.bloodBrainBarrier);
   }
 }
 
+Drug.prototype = Object.create(TargettingStructure.prototype);
+Drug.prototype.constructor = Drug;
+
 Drug.prototype.setBrandNames = function(brandNames) {
   this._brandNames = brandNames;
 };
@@ -43,22 +45,6 @@ Drug.prototype.getSynonyms = function() {
   return this._synonyms;
 };
 
-Drug.prototype.setName = function(name) {
-  this._name = name;
-};
-
-Drug.prototype.getName = function() {
-  return this._name;
-};
-
-Drug.prototype.setId = function(id) {
-  this._id = id;
-};
-
-Drug.prototype.getId = function() {
-  return this._id;
-};
-
 Drug.prototype.setDescription = function(description) {
   this._description = description;
 };
@@ -67,17 +53,6 @@ Drug.prototype.getDescription = function() {
   return this._description;
 };
 
-Drug.prototype.setTargets = function(targets) {
-  this._targets = [];
-  for (var i = 0; i < targets.length; i++) {
-    this._targets.push(new Target(targets[i]));
-  }
-};
-
-Drug.prototype.getTargets = function() {
-  return this._targets;
-};
-
 Drug.prototype.setBloodBrainBarrier = function(bloodBrainBarrier) {
   this._bloodBrainBarrier = bloodBrainBarrier;
 };
diff --git a/frontend-js/src/main/js/map/data/MiRna.js b/frontend-js/src/main/js/map/data/MiRna.js
index 2b8f60c887..6c09ac419b 100644
--- a/frontend-js/src/main/js/map/data/MiRna.js
+++ b/frontend-js/src/main/js/map/data/MiRna.js
@@ -1,40 +1,13 @@
 "use strict";
 
 var Target = require("./Target");
+var TargettingStructure = require("./TargettingStructure");
 
 function MiRna(javaObject) {
-  if (javaObject !== undefined) {
-    this.setName(javaObject.name);
-    this.setId(javaObject.id);
-    this.setTargets(javaObject.targets);
-  }
+  TargettingStructure.call(this, javaObject);
 }
 
-MiRna.prototype.setName = function(name) {
-  this._name = name;
-};
-
-MiRna.prototype.getName = function() {
-  return this._name;
-};
-
-MiRna.prototype.setId = function(id) {
-  this._id = id;
-};
-
-MiRna.prototype.getId = function() {
-  return this._id;
-};
-
-MiRna.prototype.setTargets = function(targets) {
-  this._targets = [];
-  for (var i = 0; i < targets.length; i++) {
-    this._targets.push(new Target(targets[i]));
-  }
-};
-
-MiRna.prototype.getTargets = function() {
-  return this._targets;
-};
+MiRna.prototype = Object.create(TargettingStructure.prototype);
+MiRna.prototype.constructor = MiRna;
 
 module.exports = MiRna;
diff --git a/frontend-js/src/main/js/map/data/TargettingStructure.js b/frontend-js/src/main/js/map/data/TargettingStructure.js
new file mode 100644
index 0000000000..c313ff3985
--- /dev/null
+++ b/frontend-js/src/main/js/map/data/TargettingStructure.js
@@ -0,0 +1,40 @@
+"use strict";
+
+var Target = require("./Target");
+
+function TargettingStructure(javaObject) {
+  if (javaObject !== undefined) {
+    this.setName(javaObject.name);
+    this.setId(javaObject.id);
+    this.setTargets(javaObject.targets);
+  }
+}
+
+TargettingStructure.prototype.setName = function(name) {
+  this._name = name;
+};
+
+TargettingStructure.prototype.getName = function() {
+  return this._name;
+};
+
+TargettingStructure.prototype.setId = function(id) {
+  this._id = id;
+};
+
+TargettingStructure.prototype.getId = function() {
+  return this._id;
+};
+
+TargettingStructure.prototype.setTargets = function(targets) {
+  this._targets = [];
+  for (var i = 0; i < targets.length; i++) {
+    this._targets.push(new Target(targets[i]));
+  }
+};
+
+TargettingStructure.prototype.getTargets = function() {
+  return this._targets;
+};
+
+module.exports = TargettingStructure;
diff --git a/frontend-js/src/main/js/map/overlay/AbstractTargettingDbOverlay.js b/frontend-js/src/main/js/map/overlay/AbstractTargettingDbOverlay.js
index f7b7b1eff6..9d0fa57f97 100644
--- a/frontend-js/src/main/js/map/overlay/AbstractTargettingDbOverlay.js
+++ b/frontend-js/src/main/js/map/overlay/AbstractTargettingDbOverlay.js
@@ -114,7 +114,21 @@ AbstractTargettingDbOverlay.prototype.getIdentifiedElements = function() {
 AbstractTargettingDbOverlay.prototype.getDetailDataByIdentifiedElement = function(element, general) {
   var self = this;
   if (general) {
-    return self.searchNamesByTarget(element);
+    return self.searchNamesByTarget(element).then(function(names) {
+      var promises = [];
+      names.forEach(function(name) {
+        promises.push(self.searchBySingleQuery(name));
+      })
+      return Promise.all(promises);
+    }).then(function(drugs) {
+      var result = [];
+      drugs.forEach(function(drugList) {
+        drugList.forEach(function(drug) {
+          result.push(drug);
+        })
+      });
+      return result;
+    });
   } else {
     return new Promise(function(resolve) {
       var result = [];
@@ -131,7 +145,7 @@ AbstractTargettingDbOverlay.prototype.getDetailDataByIdentifiedElement = functio
             var elements = targets[k].getTargetElements();
             for (var l = 0; l < elements.length; l++) {
               if (element.equals(elements[l])) {
-                result.push(drug.getName());
+                result.push(drug);
               }
             }
           }
diff --git a/frontend-js/src/main/js/map/window/AbstractInfoWindow.js b/frontend-js/src/main/js/map/window/AbstractInfoWindow.js
index d9f2caf8a2..ba14cb62b1 100644
--- a/frontend-js/src/main/js/map/window/AbstractInfoWindow.js
+++ b/frontend-js/src/main/js/map/window/AbstractInfoWindow.js
@@ -442,14 +442,8 @@ AbstractInfoWindow.prototype._createTargetInfoDiv = function(overlay, data, name
 
   count = 0;
   for ( var dataId in data) {
-    if (data.hasOwnProperty(dataId) && data[dataId] !== undefined && data[dataId] !== null) {
-      // if we have empty array, it means that we got data from server and it's
-      // empty
-      if (Object.prototype.toString.call(data[dataId]) === '[object Array]') {
-        continue;
-      } else {
-        count++;
-      }
+    if (data.hasOwnProperty(dataId)) {
+      count++;
     }
   }
 
@@ -458,25 +452,19 @@ AbstractInfoWindow.prototype._createTargetInfoDiv = function(overlay, data, name
     table.appendChild(row);
 
     for ( var searchId in data) {
-      if (data.hasOwnProperty(searchId) && data[searchId] !== undefined && data[searchId] !== null) {
-        // if we have empty array, it means that we got data from server and
-        // it's
-        // empty
-        if (Object.prototype.toString.call(data[searchId]) === '[object Array]') {
-          continue;
+      if (data.hasOwnProperty(searchId)) {
+        row = document.createElement("tr");
+        cell = document.createElement("td");
+        if (typeof data[searchId] === "string") {
+          cell.innerHTML = data[searchId];
+        } else if (typeof data[searchId].getName === "function") {
+          cell.innerHTML = data[searchId].getName();
         } else {
-          row = document.createElement("tr");
-          cell = document.createElement("td");
-          if (typeof data[searchId] === "string") {
-            cell.innerHTML = data[searchId];
-          } else {
-            cell.innerHTML = searchId;
-          }
-
-          row.appendChild(cell);
-          table.appendChild(row);
-          count++;
+          cell.innerHTML = searchId;
         }
+        row.appendChild(cell);
+        table.appendChild(row);
+        count++;
       }
     }
     if (count === 0) {
diff --git a/frontend-js/src/test/js/gui/leftPanel/GuiUtils-test.js b/frontend-js/src/test/js/gui/leftPanel/GuiUtils-test.js
index 6617b629b7..5e0492f2f6 100644
--- a/frontend-js/src/test/js/gui/leftPanel/GuiUtils-test.js
+++ b/frontend-js/src/test/js/gui/leftPanel/GuiUtils-test.js
@@ -101,7 +101,6 @@ describe('GuiUtils', function() {
     var res = utils.createPostTranslationalModifications("label", alias.getOther("modifications"));
     assert.ok(res.innerHTML);
     assert.ok(res.innerHTML.indexOf("phosphorylated") >= 0);
-    logger.debug(res.innerHTML);
   });
 
   describe('createReactionElement', function() {
diff --git a/frontend-js/src/test/js/map/window/AliasInfoWindow-test.js b/frontend-js/src/test/js/map/window/AliasInfoWindow-test.js
index 7010e8351e..158e53b6c3 100644
--- a/frontend-js/src/test/js/map/window/AliasInfoWindow-test.js
+++ b/frontend-js/src/test/js/map/window/AliasInfoWindow-test.js
@@ -7,6 +7,7 @@ var functions = require('../../../../main/js/Functions');
 var Helper = require('../../Helper');
 
 var Alias = require('../../../../main/js/map/data/Alias');
+var Drug = require('../../../../main/js/map/data/Drug');
 var AliasInfoWindow = require('../../../../main/js/map/window/AliasInfoWindow');
 var IdentifiedElement = require('../../../../main/js/map/data/IdentifiedElement');
 var LayoutData = require('../../../../main/js/map/data/LayoutData');
@@ -80,6 +81,13 @@ describe('AliasInfoWindow', function() {
     oc.searchNamesByTarget = function() {
       return Promise.resolve([ "xField" ]);
     };
+    oc.getElementsByQueryFromServer = function() {
+      return Promise.resolve([ new Drug({
+        name : "xField",
+        references : [],
+        targets : [],
+      }) ]);
+    }
 
     return oc.getDetailDataByIdentifiedElement(new IdentifiedElement(alias), true).then(function(data) {
       var overlayDiv = aliasWindow.createOverlayInfoDiv(oc, data);
-- 
GitLab