diff --git a/frontend-js/src/main/js/InvalidArgumentError.js b/frontend-js/src/main/js/InvalidArgumentError.js new file mode 100644 index 0000000000000000000000000000000000000000..3833bbf547eca95a26c8a28ad6301fc60c207a72 --- /dev/null +++ b/frontend-js/src/main/js/InvalidArgumentError.js @@ -0,0 +1,13 @@ +"use strict"; + +/* exported logger */ + +var logger = require('./logger'); + +function InvalidArgumentError(message) { + this.name = "InvalidArgumentError"; + this.message = message; + this.stack = (new Error()).stack; +} + +module.exports = InvalidArgumentError; diff --git a/frontend-js/src/main/js/map/overlay/UserDbOverlay.js b/frontend-js/src/main/js/map/overlay/UserDbOverlay.js index 47b59846d0f5dd063d302b2082e1362bac02c42a..0e6713ec37f420d1e9e0caebbb9345e1f0bae2fa 100644 --- a/frontend-js/src/main/js/map/overlay/UserDbOverlay.js +++ b/frontend-js/src/main/js/map/overlay/UserDbOverlay.js @@ -7,6 +7,7 @@ var logger = require('../../logger'); var AbstractDbOverlay = require('./AbstractDbOverlay'); var IdentifiedElement = require('../data/IdentifiedElement'); +var InvalidArgumentError = require('../../InvalidArgumentError'); var Promise = require("bluebird"); @@ -36,37 +37,59 @@ UserDbOverlay.prototype.getDetailDataByIdentifiedElement = function(element) { return model.getByIdentifiedElement(element, true); }; -UserDbOverlay.prototype.addMarker = function(params) { +UserDbOverlay.prototype._createIdentifiedElements = function(params, sourceArray) { var self = this; + var result = []; + var promises = []; + for (var i = 0; i < params.length; i++) { + var singleElementParam = params[i]; + var element = new IdentifiedElement(singleElementParam.element); + element.setIcon(singleElementParam.icon); + if (singleElementParam.options !== undefined) { + element.setColor(singleElementParam.options.color); + element.setOpacity(singleElementParam.options.opacity); + element.setLineColor(singleElementParam.options.lineColor); + element.setLineWeight(singleElementParam.options.lineWeight); + element.setLineOpacity(singleElementParam.options.lineOpacity); + } + if (sourceArray[element.getType()][element.getId()] !== undefined) { + return Promise.reject(new Error("Element already highlighted: " + element.getId())); + } + result.push(element); + promises.push(self.getMap().getSubmapById(element.getModelId()).getModel().getByIdentifiedElement(element)); + } + return Promise.all(promises).then(function(elementsFromModel) { + for (var i = 0; i < elementsFromModel.length; i++) { + if (elementsFromModel[i] === undefined || elementsFromModel[i] === null) { + return Promise.reject(new InvalidArgumentError("Element doesn't exist: " + result[i].getId())); + } + } + return result; + }) +}; +UserDbOverlay.prototype.addMarker = function(params) { + var self = this; self.disableAddRemoveElements(); - var elements = []; if (params.length === undefined) { params = [ params ]; } - var i, element; - for (i = 0; i < params.length; i++) { - var singleElementParam = params[i]; - element = new IdentifiedElement(singleElementParam.element); - element.setIcon(singleElementParam.icon); - if (self._markerIdentifiedElements[element.getType()][element.getId()] !== undefined) { - self.enableAddRemoveElements(); - return Promise.reject(new Error("Element already highlighted: " + element.getId())); + return self._createIdentifiedElements(params, self._markerIdentifiedElements).then(function(elements) { + for (var i = 0; i < elements.length; i++) { + var element = elements[i]; + self._markerIdentifiedElements[element.getType()][element.getId()] = element; } - elements.push(element); - } - for (i = 0; i < elements.length; i++) { - element = elements[i]; - self._markerIdentifiedElements[element.getType()][element.getId()] = element; - } - - return self.getIdentifiedElements().then(function(elements) { + return self.getIdentifiedElements(); + }).then(function(elements) { self.enableAddRemoveElements(); return self.callListeners("onSearch", { fitBounds : false, identifiedElements : elements, }); + }).then(null, function(error) { + self.enableAddRemoveElements(); + return Promise.reject(error); }); }; @@ -74,38 +97,25 @@ UserDbOverlay.prototype.addSurface = function(params) { var self = this; self.disableAddRemoveElements(); - var elements = []; if (params.length === undefined) { params = [ params ]; } - var i, element; - for (i = 0; i < params.length; i++) { - var singleElementParam = params[i]; - element = new IdentifiedElement(singleElementParam.element); - if (singleElementParam.options !== undefined) { - element.setColor(singleElementParam.options.color); - element.setOpacity(singleElementParam.options.opacity); - element.setLineColor(singleElementParam.options.lineColor); - element.setLineWeight(singleElementParam.options.lineWeight); - element.setLineOpacity(singleElementParam.options.lineOpacity); - } - if (self._surfaceIdentifiedElements[element.getType()][element.getId()] !== undefined) { - self.enableAddRemoveElements(); - return Promise.reject(new Error("Element already highlighted: " + element.getId())); - } - elements.push(element); - } - for (i = 0; i < elements.length; i++) { - element = elements[i]; - self._surfaceIdentifiedElements[element.getType()][element.getId()] = element; - } - return self.getIdentifiedElements().then(function(elements) { + return self._createIdentifiedElements(params, self._surfaceIdentifiedElements).then(function(elements) { + for (var i = 0; i < elements.length; i++) { + var element = elements[i]; + self._surfaceIdentifiedElements[element.getType()][element.getId()] = element; + } + return self.getIdentifiedElements(); + }).then(function(elements) { self.enableAddRemoveElements(); return self.callListeners("onSearch", { fitBounds : false, identifiedElements : elements, }); + }).then(null, function(error) { + self.enableAddRemoveElements(); + return Promise.reject(error); }); }; diff --git a/frontend-js/src/test/js/map/overlay/UserDbOverlay-test.js b/frontend-js/src/test/js/map/overlay/UserDbOverlay-test.js index 1ab3853a466d08d061a948215d26e58ee311cfbf..6ee50e21e1dea5c39b6f18960dc634db98cfea1f 100644 --- a/frontend-js/src/test/js/map/overlay/UserDbOverlay-test.js +++ b/frontend-js/src/test/js/map/overlay/UserDbOverlay-test.js @@ -4,6 +4,8 @@ var Helper = require('../../Helper'); var logger = require('../../logger'); +var CustomMap = require('../../../../main/js/map//CustomMap'); +var InvalidArgumentError = require('../../../../main/js/InvalidArgumentError'); var UserDbOverlay = require('../../../../main/js/map/overlay/UserDbOverlay'); var assert = require('assert'); @@ -27,30 +29,60 @@ describe('UserDbOverlay', function() { }); it("clear", function() { - var map = helper.createCustomMap(); - var oc = new UserDbOverlay({ - map : map, - name : 'user' - }); - return oc.addMarker({ - element : { - id : 329171, - modelId : 15781, - type : "ALIAS" - }, - options : { - type : "SURFACE" - } + var overlay; + return ServerConnector.getProject().then(function(project) { + var options = helper.createCustomMapOptions(project); + var map = new CustomMap(options); + overlay = new UserDbOverlay({ + map : map, + name : 'user' + }); + return overlay.addMarker({ + element : { + id : 329171, + modelId : 15781, + type : "ALIAS" + }, + options : { + type : "SURFACE" + } + }); }).then(function() { - return oc.getIdentifiedElements(); + return overlay.getIdentifiedElements(); }).then(function(elements) { assert.equal(elements.length, 1); - return oc.clear(); + return overlay.clear(); }).then(function() { - return oc.getIdentifiedElements(); + return overlay.getIdentifiedElements(); }).then(function(elements) { assert.equal(elements.length, 0); }); }); + it("add unexisting object", function() { + var overlay; + return ServerConnector.getProject().then(function(project) { + var options = helper.createCustomMapOptions(project); + var map = new CustomMap(options); + overlay = new UserDbOverlay({ + map : map, + name : 'user' + }); + return overlay.addMarker({ + element : { + id : -1, + modelId : 15781, + type : "ALIAS" + }, + options : { + type : "SURFACE" + } + }); + }).then(function() { + assert.ok(false, "Exception expected"); + }, function(error) { + assert.ok(error instanceof InvalidArgumentError) + }); + }); + }); diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/columns=id,bounds,modelId&id=-1&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/columns=id,bounds,modelId&id=-1&token=MOCK_TOKEN_ID& new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/columns=id,bounds,modelId&id=-1&token=MOCK_TOKEN_ID& @@ -0,0 +1 @@ +[] \ No newline at end of file