diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js index c01ccad5710d1ecaec25bec91788d6568ff630c7..3458d7ee8ac5ad75805bcccac9ab09e9a5d85844 100644 --- a/frontend-js/src/main/js/ServerConnector.js +++ b/frontend-js/src/main/js/ServerConnector.js @@ -436,18 +436,20 @@ ServerConnector.columnsToString = function(columns) { return columns; }; -ServerConnector.getReactionsUrl = function(reactionIds, projectId, token, columns) { - var id = this.idsToString(reactionIds); - columns = this.columnsToString(columns); +ServerConnector.getReactionsUrl = function(params) { + var id = this.idsToString(params.ids); + var columns = this.columnsToString(params.columns); + var participantId = this.idsToString(params.participantId); return this.getApiUrl({ type : "project", method : "getReactions", params : { - projectId : projectId, - token : token, + projectId : params.projectId, + token : params.token, columns : columns, id : id, + participantId : participantId, }, }); }; @@ -930,13 +932,14 @@ ServerConnector.getOverlayById = function(layoutId, projectId) { }); }; -ServerConnector.getReactions = function(reactionIds, projectId, columns) { +ServerConnector.getReactions = function(params) { var self = this; - return self.getProjectId(projectId).then(function(result) { - projectId = result; + return self.getProjectId(params.projectId).then(function(result) { + params.projectId = result; return self.getToken(); }).then(function(token) { - return self.readFile(self.getReactionsUrl(reactionIds, projectId, token, columns)); + params.token = token; + return self.readFile(self.getReactionsUrl(params)); }).then(function(content) { var array = JSON.parse(content); var result = []; diff --git a/frontend-js/src/main/js/map/data/MapModel.js b/frontend-js/src/main/js/map/data/MapModel.js index f129a987b668116a03ed6cee7cd9729bfa74d46e..ae53829cbe057e16b6f3de3e1a4fc4febeda79dc 100644 --- a/frontend-js/src/main/js/map/data/MapModel.js +++ b/frontend-js/src/main/js/map/data/MapModel.js @@ -26,6 +26,7 @@ function MapModel(configuration) { // list of reactions is empty (it will be filled dynamically - when necessary) this._reactions = []; + this._reactionsByParticipantElementId = []; // list of aliases that should be updated from server side during the next // connection @@ -193,7 +194,9 @@ MapModel.prototype.getCompleteReactionById = function(id) { return Promise.resolve(self._reactions[id]); } else { var result; - return ServerConnector.getReactions([ id ]).then( + return ServerConnector.getReactions({ + ids : [ id ] + }).then( function(reactions) { if (self._reactions[id] === undefined) { self._reactions[id] = reactions[0]; @@ -300,7 +303,9 @@ MapModel.prototype.getMissingElements = function(elements) { } var reactionPromise = null; if (reactionIds.length > 0) { - reactionPromise = ServerConnector.getReactions(reactionIds); + reactionPromise = ServerConnector.getReactions({ + ids : reactionIds + }); } var aliasPromise = null; @@ -694,4 +699,36 @@ MapModel.prototype.isAvailable = function(ie, complete) { } }; +MapModel.prototype.getReactionsForElement = function(element, complete) { + var self = this; + if (this._reactionsByParticipantElementId[element.getId()]) { + var reactions = self._reactionsByParticipantElementId[element.getId()] + if (!complete) { + return Promise.resolve(reactions); + } else { + var promises = []; + for (var i = 0; i < reactions.length; i++) { + promises.push(self.getCompleteReactionById(reactions[i].getId())); + } + return Promise.all(promises); + } + } + return ServerConnector.getReactions({ + participantId : [ element.getId() ], + }).then(function(reactions) { + var promises = [] + for (var i = 0; i < reactions.length; i++) { + var reaction = reactions[i]; + var id = reaction.getId(); + if (self._reactions[id] === undefined) { + self._reactions[id] = reaction; + } else { + self._reactions[id].update(reaction); + } + promises.push(self.getReactionById(id, complete)); + } + return Promise.all(promises); + }) +}; + module.exports = MapModel; diff --git a/frontend-js/src/test/js/map/data/MapModel-test.js b/frontend-js/src/test/js/map/data/MapModel-test.js index 66930c9a4026ac625558afe025ac1ab329f6df6f..736b64b52437fe92fcbd8cd11c7bcca8c1e194ce 100644 --- a/frontend-js/src/test/js/map/data/MapModel-test.js +++ b/frontend-js/src/test/js/map/data/MapModel-test.js @@ -2,6 +2,7 @@ var Helper = require('../../Helper'); +var IdentifiedElement = require('../../../../main/js/map/data/IdentifiedElement'); var LayoutData = require('../../../../main/js/map/data/LayoutData'); var MapModel = require('../../../../main/js/map/data/MapModel'); var assert = require('chai').assert; @@ -30,8 +31,8 @@ describe('MapModel', function() { var layout = helper.createLayout(); model.getLayoutDataById(layout.getId()).then(function() { - throw new Error('expected rejection'); - }).catch(function(exception){ + assert.ok(false, 'expected rejection'); + }, function(exception) { assert.ok(exception); model.addLayout(layout); @@ -41,7 +42,7 @@ describe('MapModel', function() { assert.ok(layoutData instanceof LayoutData); done(); }); - }) ; + }); }); it("init invalid layout data", function() { @@ -58,24 +59,24 @@ describe('MapModel', function() { var model = helper.createModel(); var aliasObj = { - idObject : 32, - modelId : model.id, + idObject : 32, + modelId : model.id, }; model.addAlias(aliasObj); - model.getAliasById(32).then(function (alias){ + model.getAliasById(32).then(function(alias) { assert.equal(alias.getName(), undefined); var aliasObj2 = { - idObject : 32, - modelId : model.id, - name : "testName", + idObject : 32, + modelId : model.id, + name : "testName", }; model.addAlias(aliasObj2); - model.getAliasById(32).then(function(alias){ + model.getAliasById(32).then(function(alias) { assert.equal(alias.getName(), "testName"); done(); }); @@ -111,37 +112,36 @@ describe('MapModel', function() { var alias = helper.createAlias(); - return model.getAliasById(alias.getId()).then(function(result){ + return model.getAliasById(alias.getId()).then(function(result) { assert.equal(null, result); - }).catch(function(exception) { + }, function(exception) { assert.ok(exception.message.indexOf("no such file")); // check if this is exception about not finding file model.addAlias(alias); return model.getAliasById(alias.getId()); - }).then(function(result){ + }).then(function(result) { assert.deepEqual(alias, result); }); }); - it("getReactionById 1", function() { var model = helper.createModel(); var reaction = helper.createReaction(); - return model.getReactionById(reaction.getId()).then(function(result){ + return model.getReactionById(reaction.getId()).then(function(result) { assert.equal(null, result); - }).catch(function(exception) { + }, function(exception) { assert.ok(exception.path); // check if this is exception about not finding file model.addReaction(reaction); return model.getReactionById(reaction.getId()); - }).then(function(result){ + }).then(function(result) { assert.equal(reaction, result); }); }); - it("getReactionById 2", function() { + it("addReaction 2", function() { var model = helper.createModel(); var reaction = helper.createReaction(); @@ -153,9 +153,29 @@ describe('MapModel', function() { it("getMissingElements when everything is up to date", function() { var model = helper.createModel(); - - return model.getMissingElements({}).then(function(result){ - assert.equal(result.length,0); + + return model.getMissingElements({}).then(function(result) { + assert.equal(result.length, 0); + }); + }); + + it("getReactionByParticipantId", function() { + var model; + return ServerConnector.getProject().then(function(project) { + + model = project.getModel(); + var ie = new IdentifiedElement({ + modelId : 15781, + type : "ALIAS", + id : 329167 + }); + + return model.getByIdentifiedElement(ie); + }).then(function(element) { + + return model.getReactionsForElement(element); + }).then(function(reactions) { + assert.equal(reactions.length, 5); }); }); diff --git a/frontend-js/testFiles/apiCalls/project/getElements/columns=id,bounds,modelId&id=329167&projectId=sample&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/project/getElements/columns=id,bounds,modelId&id=329167&projectId=sample&token=MOCK_TOKEN_ID& new file mode 100644 index 0000000000000000000000000000000000000000..502896f668b31af12360dadaa61ac4ed7e77dc01 --- /dev/null +++ b/frontend-js/testFiles/apiCalls/project/getElements/columns=id,bounds,modelId&id=329167&projectId=sample&token=MOCK_TOKEN_ID& @@ -0,0 +1 @@ +[{"modelId":15781,"bounds":{"x":101.0,"y":129.5,"width":90.0,"height":25.0},"id":329167}] \ No newline at end of file diff --git a/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=&projectId=sample&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=&participantId=&projectId=sample&token=MOCK_TOKEN_ID& similarity index 100% rename from frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=&projectId=sample&token=MOCK_TOKEN_ID& rename to frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=&participantId=&projectId=sample&token=MOCK_TOKEN_ID& diff --git a/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=&participantId=329167&projectId=sample&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=&participantId=329167&projectId=sample&token=MOCK_TOKEN_ID& new file mode 100644 index 0000000000000000000000000000000000000000..c83882f5a9cf78e97016eacefb773c7aea70e7dc --- /dev/null +++ b/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=&participantId=329167&projectId=sample&token=MOCK_TOKEN_ID& @@ -0,0 +1 @@ +[{"modelId":15781,"reactants":"329167","reactionId":"re3","id":153504,"type":"State transition","lines":[{"start":{"x":155.9662162162162,"y":129.5},"end":{"x":169.67962640764847,"y":112.300129590407},"type":"START"},{"start":{"x":174.6668714987086,"y":106.04494083212823},"end":{"x":188.38028169014086,"y":88.84507042253522},"type":"END"}],"modifiers":"","centerPoint":{"x":172.17324895317853,"y":109.17253521126761},"products":"329179","hierarchyVisibilityLevel":0},{"modelId":15781,"reactants":"329173","reactionId":"re5","id":153510,"type":"State transition","lines":[{"start":{"x":92.0,"y":36.98039215686274},"end":{"x":124.64269540833152,"y":45.94113207287532},"type":"START"},{"start":{"x":132.35730459166848,"y":48.05886792712468},"end":{"x":165.0,"y":57.01960784313726},"type":"END"},{"start":{"x":144.03021943732247,"y":129.5},"end":{"x":131.99804583067973,"y":53.145215648491444},"type":"MIDDLE"}],"modifiers":"329167","centerPoint":{"x":128.5,"y":47.0},"products":"329179","hierarchyVisibilityLevel":0},{"modelId":15781,"reactants":"329167","reactionId":"re10","id":153499,"type":"State transition","lines":[{"start":{"x":180.0362865221489,"y":142.31809613572102},"end":{"x":192.68309645382215,"y":142.43629062106376},"type":"START"},{"start":{"x":200.68274710121602,"y":142.5110537112263},"end":{"x":213.32955703288923,"y":142.62924819656908},"type":"END"}],"modifiers":"","centerPoint":{"x":196.68292177751908,"y":142.47367216614504},"products":"329172","hierarchyVisibilityLevel":0},{"modelId":15781,"reactants":"329169","reactionId":"re8","id":153518,"type":"State transition","lines":[{"start":{"x":141.01308884552796,"y":203.5052375718217},"end":{"x":142.676524190943,"y":182.98953497836953},"type":"START"},{"start":{"x":143.32305114107143,"y":175.01570259345215},"end":{"x":144.98648648648648,"y":154.5},"type":"END"}],"modifiers":"","centerPoint":{"x":142.99978766600722,"y":179.00261878591084},"products":"329167","hierarchyVisibilityLevel":0},{"modelId":15781,"reactants":"329168","reactionId":"re4","id":153512,"type":"State transition","lines":[{"start":{"x":75.73715058611361,"y":134.3476104598738},"end":{"x":88.18325303297577,"y":135.7031265679479},"type":"START"},{"start":{"x":96.13622466620043,"y":136.56929179532878},"end":{"x":108.58232711306259,"y":137.92480790340286},"type":"END"}],"modifiers":"","centerPoint":{"x":92.15973884958811,"y":136.13620918163832},"products":"329167","hierarchyVisibilityLevel":0}] \ No newline at end of file diff --git a/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153508&projectId=sample&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153508&participantId=&projectId=sample&token=MOCK_TOKEN_ID& similarity index 100% rename from frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153508&projectId=sample&token=MOCK_TOKEN_ID& rename to frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153508&participantId=&projectId=sample&token=MOCK_TOKEN_ID& diff --git a/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153510&projectId=sample&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153510&participantId=&projectId=sample&token=MOCK_TOKEN_ID& similarity index 100% rename from frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153510&projectId=sample&token=MOCK_TOKEN_ID& rename to frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153510&participantId=&projectId=sample&token=MOCK_TOKEN_ID& diff --git a/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153511&projectId=sample&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153511&participantId=&projectId=sample&token=MOCK_TOKEN_ID& similarity index 100% rename from frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153511&projectId=sample&token=MOCK_TOKEN_ID& rename to frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153511&participantId=&projectId=sample&token=MOCK_TOKEN_ID& diff --git a/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153515&projectId=sample&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153515&participantId=&projectId=sample&token=MOCK_TOKEN_ID& similarity index 100% rename from frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153515&projectId=sample&token=MOCK_TOKEN_ID& rename to frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153515&participantId=&projectId=sample&token=MOCK_TOKEN_ID& diff --git a/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153519&projectId=sample&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153519&participantId=&projectId=sample&token=MOCK_TOKEN_ID& similarity index 100% rename from frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153519&projectId=sample&token=MOCK_TOKEN_ID& rename to frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153519&participantId=&projectId=sample&token=MOCK_TOKEN_ID& diff --git a/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153521&projectId=sample&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153521&participantId=&projectId=sample&token=MOCK_TOKEN_ID& similarity index 100% rename from frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153521&projectId=sample&token=MOCK_TOKEN_ID& rename to frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153521&participantId=&projectId=sample&token=MOCK_TOKEN_ID&