diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/ImageGenerators.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/ImageGenerators.java index def4fbc887b886ef0abcce359c77e7b2ea308ba3..96bc681dfb4643be61cea44c3d3128d5eff44e00 100644 --- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/ImageGenerators.java +++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/ImageGenerators.java @@ -54,7 +54,7 @@ public class ImageGenerators { generatorInstances = new ArrayList<>(); generatorInstances.add(new PngImageGenerator(params)); generatorInstances.add(new PdfImageGenerator(params)); - // generatorInstances.add(new SvgImageGenerator(params)); + generatorInstances.add(new SvgImageGenerator(params)); // generatorInstances.add(new JpgImageGenerator(params)); for (AbstractImageGenerator abstractImageGenerator : generatorInstances) { availableGenerators diff --git a/frontend-js/.idea/codeStyleSettings.xml b/frontend-js/.idea/codeStyleSettings.xml new file mode 100644 index 0000000000000000000000000000000000000000..5555dd266682059e1b1fed89915c4ef70b2bba45 --- /dev/null +++ b/frontend-js/.idea/codeStyleSettings.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectCodeStyleSettingsManager"> + <option name="PER_PROJECT_SETTINGS"> + <value /> + </option> + <option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" /> + </component> +</project> \ No newline at end of file diff --git a/frontend-js/.idea/frontend-js.iml b/frontend-js/.idea/frontend-js.iml index 69ef67a424b4d72230aac1a2e4ddc77c7a75b52b..b6d6506e8893d7574cd478c3f94f16a0d3a0f679 100644 --- a/frontend-js/.idea/frontend-js.iml +++ b/frontend-js/.idea/frontend-js.iml @@ -3,8 +3,8 @@ <component name="NewModuleRootManager"> <content url="file://$MODULE_DIR$"> <excludeFolder url="file://$MODULE_DIR$/.tmp" /> - <excludeFolder url="file://$MODULE_DIR$/dist" /> <excludeFolder url="file://$MODULE_DIR$/temp" /> + <excludeFolder url="file://$MODULE_DIR$/dist" /> <excludeFolder url="file://$MODULE_DIR$/tmp" /> </content> <orderEntry type="inheritedJdk" /> diff --git a/frontend-js/package.json b/frontend-js/package.json index ebd32bd7c0666d3ad14e5bffc79a73d4123df629..f6835c3aa6fbc7e47cdfce0cc8f261720d330d01 100644 --- a/frontend-js/package.json +++ b/frontend-js/package.json @@ -37,7 +37,8 @@ }, "dependencies": { "del": "^3.0.0", - "dual-listbox": "^1.0.3", + "dual-listbox": "^1.0.7", + "file-saver": "^1.3.3", "http-status-codes": "^1.1.6", "js-cookie": "^2.1.3", "log4js": "0.6.38", diff --git a/frontend-js/src/main/js/Export.js b/frontend-js/src/main/js/Export.js index e425dbb06dd9c436840e07ad3b93aa501c9d48d9..d2233fc56f90e66111ccfa589b2337d247e69ff5 100644 --- a/frontend-js/src/main/js/Export.js +++ b/frontend-js/src/main/js/Export.js @@ -24,6 +24,7 @@ var Functions = require('./Functions'); function Export(options) { var self = this; self._panels = []; + self._tabIdCount = 0; if (!(options instanceof CustomMapOptions)) { options = new CustomMapOptions(options); } @@ -90,7 +91,7 @@ Export.prototype.addTab = function(params, navElement, contentElement) { var name = params.name; - var tabId = "left_panel_ab_" + this._tabIdCount; + var tabId = "export_panel_tab_" + this._tabIdCount; self._tabIdCount++; var navClass = ''; @@ -130,7 +131,7 @@ Export.prototype.addTab = function(params, navElement, contentElement) { this._panels.push(new params.panelClass({ element : contentDiv, project : self.getProject(), - configuration: self.getConfiguration(), + configuration : self.getConfiguration(), })); }; diff --git a/frontend-js/src/main/js/GuiConnector.js b/frontend-js/src/main/js/GuiConnector.js index f89dd7c10d0586264413dd6af7eb1b8bb62be362..1e05d57715704904ae833534af9e89bb1f08c29a 100644 --- a/frontend-js/src/main/js/GuiConnector.js +++ b/frontend-js/src/main/js/GuiConnector.js @@ -4,6 +4,7 @@ var logger = require('./logger'); var Functions = require('./Functions'); var SecurityError = require('./SecurityError'); +var GuiMessageError = require('./gui/GuiMessageError'); var NetworkError = require('./NetworkError'); /** @@ -177,6 +178,8 @@ GuiConnector.alert = function (error) { } var message = error; if (message instanceof SecurityError) { + message = error.message + "<p>Please <a href=\"login.xhtml\">login</a> to access this resuorce</p>"; + } else if (message instanceof GuiMessageError) { message = error.message + "<p>Please <a href=\"login.xhtml\">login</a> to access this resource</p>"; } else if (message instanceof NetworkError && (error.message === "XHR error" || error.message === "Failed to fetch")) { message = "File to big.<br>Please reduce file size or contact administrators."; diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js index 36f7e29957cdaee875e669cf414dff08611abd30..b7454ef5074a92c0c1c33437a43a4ab95854b3e1 100644 --- a/frontend-js/src/main/js/ServerConnector.js +++ b/frontend-js/src/main/js/ServerConnector.js @@ -838,6 +838,12 @@ ServerConnector.getOverlayById = function (overlayId, projectId) { ServerConnector.getReactions = function (params) { var self = this; var queryParams = {}; + if (params.ids === undefined) { + params.ids = []; + } + if (params.participantId === undefined) { + params.participantId = []; + } var filterParams = { id: params.ids, columns: params.columns, @@ -845,7 +851,12 @@ ServerConnector.getReactions = function (params) { }; return self.getProjectId(params.projectId).then(function (result) { queryParams.projectId = result; - return self.readFile(self.getReactionsUrl(queryParams, filterParams)); + if (filterParams.id.length > 100 || filterParams.participantId.length > 100) { + return self.sendPostRequest(self.getReactionsUrl(queryParams), filterParams); + } else { + return self.readFile(self.getReactionsUrl(queryParams, filterParams)); + } + }).then(function (content) { var array = JSON.parse(content); var result = []; @@ -864,10 +875,19 @@ ServerConnector.getAliases = function (params) { if (params.ids === undefined) { params.ids = []; } + if (params.includedCompartmentIds === undefined) { + params.includedCompartmentIds = []; + } + if (params.excludedCompartmentIds === undefined) { + params.excludedCompartmentIds = []; + } var filterParams = { id: params.ids, columns: params.columns, type: params.type, + excludedCompartmentIds: params.excludedCompartmentIds, + includedCompartmentIds: params.includedCompartmentIds, + }; return self.getProjectId(params.projectId).then(function (result) { queryParams.projectId = result; diff --git a/frontend-js/src/main/js/gui/GuiMessageError.js b/frontend-js/src/main/js/gui/GuiMessageError.js new file mode 100644 index 0000000000000000000000000000000000000000..52ccf03be23abafbcad02be87411e6aeea94734d --- /dev/null +++ b/frontend-js/src/main/js/gui/GuiMessageError.js @@ -0,0 +1,15 @@ +"use strict"; + +/* exported logger */ + +var logger = require('../logger'); + +function GuiMessageError(message) { + this.message = message; + this.stack = (new Error()).stack; +} + +GuiMessageError.prototype = Object.create(Error.prototype); +GuiMessageError.prototype.constructor = GuiMessageError; + +module.exports = GuiMessageError; diff --git a/frontend-js/src/main/js/gui/export/AbstractExportPanel.js b/frontend-js/src/main/js/gui/export/AbstractExportPanel.js new file mode 100644 index 0000000000000000000000000000000000000000..c55f8063bcd6e589b72962ebd8e3cb77c07a7680 --- /dev/null +++ b/frontend-js/src/main/js/gui/export/AbstractExportPanel.js @@ -0,0 +1,445 @@ +"use strict"; + +/* exported logger */ + +var Panel = require('../Panel'); + +var GuiConnector = require('../../GuiConnector'); +var logger = require('../../logger'); +var Functions = require('../../Functions'); +var DualListbox = require('dual-listbox').DualListbox; +var Promise = require("bluebird"); + +function AbstractExportPanel(params) { + params.scrollable = true; + Panel.call(this, params); + +} + +AbstractExportPanel.prototype = Object.create(Panel.prototype); +AbstractExportPanel.prototype.constructor = AbstractExportPanel; + +AbstractExportPanel.prototype.init = function() { + +}; + +function compareSimple(val1, val2) { + if (val1 < val2) { + return -1; + } else if (val1 > val2) { + return 1; + } else { + return 0; + } +} + +AbstractExportPanel.prototype._createMiriamTypeDiv = function(annotations) { + var self = this; + var typeDiv = Functions.createElement({ + type : "div", + name : "miriamSelectDiv", + className : "minerva-export-dual-listbox-container", + }); + typeDiv.appendChild(Functions.createElement({ + type : "h4", + content : " Annotations:", + })); + + var selectElement = Functions.createElement({ + type : "select", + className : "minerva-multi-select", + }); + typeDiv.appendChild(selectElement); + + function compare(entry1, entry2) { + if ((entry1.count === 0 && entry2.count === 0) || (entry1.count !== 0 && entry2.count !== 0)) { + return compareSimple(entry1.miriamType.getCommonName(), entry2.miriamType.getCommonName()); + } else { + return compareSimple(-entry1.count, -entry2.count); + } + } + annotations.sort(compare); + + for (var i = 0; i < annotations.length; i++) { + var miriamType = annotations[i].miriamType; + var count = annotations[i].count; + + var option = new Option(); + option.value = miriamType.getName(); + if (count > 0) { + option.innerHTML = "<div class='minerva-multi-select-special'>" + miriamType.getCommonName() + " (" + count + + ")</div>"; + } else { + option.innerHTML = "<div >" + miriamType.getCommonName() + "</div>"; + } + selectElement.appendChild(option); + } + + self.setMiriamTypesDualListbox(self.createDualListbox(selectElement)); + return typeDiv; +}; + +AbstractExportPanel.prototype.createDualListbox = function(selectElement) { + return new DualListbox(selectElement, { + availableTitle : 'Available', + selectedTitle : 'Used', + addButtonText : '>', + removeButtonText : '<', + addAllButtonText : '>>', + removeAllButtonText : '<<' + }); +}; + +AbstractExportPanel.prototype._createSelectTypeDiv = function(elementTypes) { + var typeDiv = Functions.createElement({ + type : "div", + name : "typeSelectDiv", + }); + typeDiv.appendChild(Functions.createElement({ + type : "h4", + content : " TYPE:", + })); + var choicesContainer = Functions.createElement({ + type : "ul", + className : "minerva-checkbox-grid" + }); + typeDiv.appendChild(choicesContainer); + for (var i = 0; i < elementTypes.length; i++) { + var elementType = elementTypes[i]; + var row = Functions.createElement({ + type : "li", + content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"" + elementType + "\" value=\"" + + elementType + "\" />" + elementType + "</label></div>" + }); + choicesContainer.appendChild(row); + } + choicesContainer.appendChild(Functions.createElement({ + type : "li", + content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"ALL\" value=\"ALL\" />ALL</label></div>" + })); + return typeDiv; +}; + +AbstractExportPanel.prototype.getSelectedTypes = function() { + var self = this; + + var div = $("div[name='typeSelectDiv']", $(self.getElement()))[0]; + var result = []; + var selectedAll = false; + $(":checked", $(div)).each(function(index, element) { + if (element.value === "ALL") { + selectedAll = true; + } + result.push(element.value); + }); + if (selectedAll) { + return ServerConnector.getConfiguration().then(function(configuration) { + return configuration.getElementTypes(); + }); + } + + return Promise.resolve(result); +}; + +AbstractExportPanel.prototype.setMiriamTypesDualListbox = function(dualListbox) { + this._miriamTypesDualListbox = dualListbox; +}; +AbstractExportPanel.prototype.getMiriamTypesDualListbox = function() { + return this._miriamTypesDualListbox; +}; + +AbstractExportPanel.prototype._createSelectColumnDiv = function(columnTypes) { + var columnDiv = Functions.createElement({ + type : "div", + name : "columnSelectDiv", + }); + columnDiv.appendChild(Functions.createElement({ + type : "h4", + content : " COLUMN:", + })); + var choicesContainer = Functions.createElement({ + type : "ul", + className : "minerva-checkbox-grid" + }); + + columnDiv.appendChild(choicesContainer); + for (var i = 0; i < columnTypes.length; i++) { + var columnType = columnTypes[i]; + var row = Functions.createElement({ + type : "li", + content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"column_" + columnType.columnName + + "\" value=\"" + columnType.columnName + "\" />" + columnType.name + "</label></div>" + }); + choicesContainer.appendChild(row); + } + choicesContainer.appendChild(Functions.createElement({ + type : "li", + content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"ALL\" value=\"ALL\" />ALL</label></div>" + })); + return columnDiv; +}; + +AbstractExportPanel.prototype.getSelectedMiriamTypes = function() { + var self = this; + return ServerConnector.getConfiguration().then(function(configuration) { + var selected = self.getMiriamTypesDualListbox().selected; + var result = []; + for (var i = 0; i < selected.length; i++) { + var miriamType = configuration.getMiriamTypeByName(selected[i].dataset.id); + result.push(miriamType); + } + return result; + }); +}; + +AbstractExportPanel.prototype.getSelectedColumns = function() { + var self = this; + + var div = $("div[name='columnSelectDiv']", $(self.getElement()))[0]; + var selectedColumnMap = []; + var selectedAll = false; + $(":checked", $(div)).each(function(index, element) { + if (element.value === "ALL") { + selectedAll = true; + } + selectedColumnMap[element.value] = true; + }); + var columnTypes = self.getAllColumns(); + + if (selectedAll) { + return Promise.resolve(columnTypes); + } + + var result = []; + + for (var i = 0; i < columnTypes.length; i++) { + var columnType = columnTypes[i]; + if (selectedColumnMap[columnType.columnName] === true) { + result.push(columnType); + } + } + return Promise.resolve(result); +}; + +AbstractExportPanel.prototype._getCompartmentNames = function() { + var self = this; + var compartments = []; + return self._getAllCompartments().then(function(result) { + + var addedNames = []; + for (var i = 0; i < result.length; i++) { + if (addedNames[result[i].getName()] === undefined) { + compartments.push(result[i].getName()); + addedNames[result[i].getName()] = true; + } + } + compartments.sort(compareSimple); + return compartments; + }); +}; + +AbstractExportPanel.prototype.getModels = function() { + var self = this; + var models = [ self.getProject().getModel() ]; + for (var i = 0; i < self.getProject().getModel().getSubmodels().length; i++) { + models.push(self.getProject().getModel().getSubmodels()[i]); + } + return models; +}; + +AbstractExportPanel.prototype._getAllCompartments = function() { + var self = this; + var compartments = []; + + var models = self.getModels(); + + var promises = []; + for (var i = 0; i < models.length; i++) { + promises.push(models[i].getCompartments()); + } + + return Promise.all(promises).then(function(result) { + for (var i = 0; i < result.length; i++) { + var modelCompartments = result[i]; + for (var j = 0; j < modelCompartments.length; j++) { + compartments.push(modelCompartments[j]); + } + } + return compartments; + }); +}; + +AbstractExportPanel.prototype._createDownloadButton = function() { + var self = this; + var downloadDiv = Functions.createElement({ + type : "div", + name : "downloadDiv", + style : "clear:both; padding: 10px;", + }); + var button = Functions.createElement({ + type : "button", + name : "downloadButton", + content : " Download", + onclick : function() { + GuiConnector.showProcessing(); + return self.createResponseString().then(function(result) { + var blob = new Blob([ result ], { + type : "text/plain;charset=utf-8" + }); + var FileSaver = require("file-saver"); + return FileSaver.saveAs(blob, self.getSaveFilename()); + }).then(function() { + GuiConnector.hideProcessing(); + }, function(error) { + GuiConnector.hideProcessing(); + GuiConnector.alert(error); + }); + }, + }); + downloadDiv.appendChild(button); + + return downloadDiv; +}; + +AbstractExportPanel.prototype.getSaveFilename = function() { + var self = this; + return self.getProject().getProjectId() + "-" + self.getPanelName() + ".txt"; +}; + +AbstractExportPanel.prototype._createSelectIncludedCompartmentDiv = function() { + var self = this; + var typeDiv = Functions.createElement({ + type : "div", + name : "includedCompartmentSelectDiv", + className : "minerva-export-dual-listbox-container", + }); + typeDiv.appendChild(Functions.createElement({ + type : "h4", + content : " Included compartment/pathways:", + })); + + return self._getCompartmentNames().then(function(compartmentNames) { + + var selectElement = Functions.createElement({ + type : "select", + className : "minerva-multi-select", + }); + typeDiv.appendChild(selectElement); + + for (var i = 0; i < compartmentNames.length; i++) { + var name = compartmentNames[i]; + + var option = new Option(); + option.value = name; + option.innerHTML = "<div >" + name + "</div>"; + selectElement.appendChild(option); + } + self.setIncludedCompartmentsDualListbox(self.createDualListbox(selectElement)); + return typeDiv; + }); +}; + +AbstractExportPanel.prototype._createSelectExcludedCompartmentDiv = function() { + var self = this; + var typeDiv = Functions.createElement({ + type : "div", + name : "excludedCompartmentSelectDiv", + className : "minerva-export-dual-listbox-container", + }); + typeDiv.appendChild(Functions.createElement({ + type : "h4", + content : " Excluded compartment/pathways:", + })); + + return self._getCompartmentNames().then(function(compartmentNames) { + + var selectElement = Functions.createElement({ + type : "select", + className : "minerva-multi-select", + }); + typeDiv.appendChild(selectElement); + + for (var i = 0; i < compartmentNames.length; i++) { + var name = compartmentNames[i]; + + var option = new Option(); + option.value = name; + option.innerHTML = "<div >" + name + "</div>"; + selectElement.appendChild(option); + } + self.setExcludedCompartmentsDualListbox(self.createDualListbox(selectElement)); + return typeDiv; + }); +}; + +AbstractExportPanel.prototype.setIncludedCompartmentsDualListbox = function(dualListbox) { + this._includedCompartmentsDualListbox = dualListbox; +}; +AbstractExportPanel.prototype.getIncludedCompartmentsDualListbox = function() { + return this._includedCompartmentsDualListbox; +}; + +AbstractExportPanel.prototype.getSelectedIncludedCompartments = function() { + var self = this; + var list = self.getIncludedCompartmentsDualListbox().selected; + var names = []; + var result = []; + for (var i = 0; i < list.length; i++) { + var element = list[i]; + names[element.dataset.id] = true; + } + return self._getAllCompartments().then(function(compartments) { + for (var i = 0; i < compartments.length; i++) { + var compartment = compartments[i]; + if (names[compartment.getName()]) { + result.push(compartment); + } + } + return result; + }); +}; + +AbstractExportPanel.prototype.setExcludedCompartmentsDualListbox = function(dualListbox) { + this._excludedCompartmentsDualListbox = dualListbox; +}; +AbstractExportPanel.prototype.getExcludedCompartmentsDualListbox = function() { + return this._excludedCompartmentsDualListbox; +}; + +AbstractExportPanel.prototype.getSelectedExcludedCompartments = function() { + var self = this; + var list = self.getExcludedCompartmentsDualListbox().selected; + var names = []; + var result = []; + for (var i = 0; i < list.length; i++) { + var element = list[i]; + names[element.dataset.id] = true; + } + return self._getAllCompartments().then(function(compartments) { + for (var i = 0; i < compartments.length; i++) { + var compartment = compartments[i]; + if (names[compartment.getName()]) { + result.push(compartment); + } + } + return result; + }); +}; + +AbstractExportPanel.prototype.createResponseHeader = function(columns, miriamTypes) { + var stringBuilder = []; + var i; + for (i = 0; i < columns.length; i++) { + var column = columns[i]; + stringBuilder.push(column.name); + } + for (i = 0; i < miriamTypes.length; i++) { + var miriamType = miriamTypes[i]; + stringBuilder.push(miriamType.getCommonName()); + } + var result = stringBuilder.join("\t"); + return result; + +}; + +module.exports = AbstractExportPanel; diff --git a/frontend-js/src/main/js/gui/export/ElementExportPanel.js b/frontend-js/src/main/js/gui/export/ElementExportPanel.js index c38301e725da2fb0b0c9198502dcf3afd031cc4f..59868a6b1ba66ad71ef3c8ae2247ff815f027c4b 100644 --- a/frontend-js/src/main/js/gui/export/ElementExportPanel.js +++ b/frontend-js/src/main/js/gui/export/ElementExportPanel.js @@ -2,40 +2,21 @@ /* exported logger */ -var Panel = require('../Panel'); +var AbstractExportPanel = require('./AbstractExportPanel'); +var GuiMessageError = require('../GuiMessageError'); -var DualListbox = require('dual-listbox').DualListbox; var logger = require('../../logger'); -var Functions = require('../../Functions'); var Promise = require("bluebird"); function ElementExportPanel(params) { params.panelName = "elementExport"; - params.scrollable = true; - Panel.call(this, params); - - var self = this; - self._createGui(); + AbstractExportPanel.call(this, params); } -ElementExportPanel.prototype = Object.create(Panel.prototype); +ElementExportPanel.prototype = Object.create(AbstractExportPanel.prototype); ElementExportPanel.prototype.constructor = ElementExportPanel; -function compareSimple(val1, val2) { - if (val1 < val2) { - return -1; - } else if (val1 > val2) { - return 1; - } else { - return 0; - } -} - -ElementExportPanel.prototype._createGui = function() { - -}; - ElementExportPanel.prototype.init = function() { var self = this; var element = self.getElement(); @@ -44,148 +25,29 @@ ElementExportPanel.prototype.init = function() { configuration = result; var typeDiv = self._createSelectTypeDiv(configuration.getElementTypes()); element.appendChild(typeDiv); - element.appendChild(self._createSelectColumnDiv()); + element.appendChild(self._createSelectColumnDiv(self.getAllColumns())); return ServerConnector.getProjectStatistics(self.getProject().getProjectId()); }).then(function(statistics) { - var miriamDiv = self._createMiriamTypeDiv(statistics); - element.appendChild(miriamDiv); - self.setMiriamTypesDualListbox(new DualListbox("#miriamTypeSelect", { - availableTitle : 'Available', - selectedTitle : 'Used', - addButtonText : '>', - removeButtonText : '<', - addAllButtonText : '>>', - removeAllButtonText : '<<' - })); - }).then(function() { + return self._createMiriamTypeDiv(statistics.getElementAnnotations()); + }).then(function(div) { + element.appendChild(div); return self._createSelectIncludedCompartmentDiv(); - }).then(function(selectIncludedCompartmentDiv) { - element.appendChild(selectIncludedCompartmentDiv); - self.setIncludedCompartmentsDualListbox(new DualListbox("#includedCompartmentsSelect", { - availableTitle : 'Available', - selectedTitle : 'Used', - addButtonText : '>', - removeButtonText : '<', - addAllButtonText : '>>', - removeAllButtonText : '<<' - })); + }).then(function(div) { + element.appendChild(div); return self._createSelectExcludedCompartmentDiv(); - }).then(function(selectExcludedCompartmentDiv) { - element.appendChild(selectExcludedCompartmentDiv); - self.setExcludedCompartmentsDualListbox(new DualListbox("#excludedCompartmentsSelect", { - availableTitle : 'Available', - selectedTitle : 'Used', - addButtonText : '>', - removeButtonText : '<', - addAllButtonText : '>>', - removeAllButtonText : '<<' - })); + }).then(function(div) { + element.appendChild(div); element.appendChild(self._createDownloadButton()); }).then(function() { $(window).trigger('resize'); }); }; -ElementExportPanel.prototype._createSelectTypeDiv = function(elementTypes) { - var typeDiv = Functions.createElement({ - type : "div", - name : "typeSelectDiv", - }); - typeDiv.appendChild(Functions.createElement({ - type : "h4", - content : " TYPE:", - })); - var choicesContainer = Functions.createElement({ - type : "ul", - className : "minerva-checkbox-grid" - }); - typeDiv.appendChild(choicesContainer); - for (var i = 0; i < elementTypes.length; i++) { - var elementType = elementTypes[i]; - var row = Functions.createElement({ - type : "li", - content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"" + elementType + "\" value=\"" - + elementType + "\" />" + elementType + "</label></div>" - }); - choicesContainer.appendChild(row); - } - choicesContainer.appendChild(Functions.createElement({ - type : "li", - content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"ALL\" value=\"ALL\" />ALL</label></div>" - })); - return typeDiv; -}; - -ElementExportPanel.prototype._createMiriamTypeDiv = function(statistics) { - var typeDiv = Functions.createElement({ - type : "div", - name : "miriamSelectDiv", - className : "minerva-export-dual-listbox-container", - }); - typeDiv.appendChild(Functions.createElement({ - type : "h4", - content : " Annotations:", - })); - - var annotations = statistics.getElementAnnotations(); - - var selectElement = Functions.createElement({ - type : "select", - className : "minerva-multi-select", - id : "miriamTypeSelect", - }); - typeDiv.appendChild(selectElement); - - function compare(entry1, entry2) { - if ((entry1.count === 0 && entry2.count === 0) || (entry1.count !== 0 && entry2.count !== 0)) { - return compareSimple(entry1.miriamType.getCommonName(), entry2.miriamType.getCommonName()); - } else { - return compareSimple(-entry1.count, -entry2.count); - } - } - annotations.sort(compare); - - for (var i = 0; i < annotations.length; i++) { - var miriamType = annotations[i].miriamType; - var count = annotations[i].count; - - var option = new Option(); - option.value = miriamType.getName(); - if (count > 0) { - option.innerHTML = "<div class='minerva-multi-select-special'>" + miriamType.getCommonName() + " (" + count - + ")</div>"; - } else { - option.innerHTML = "<div >" + miriamType.getCommonName() + "</div>"; - } - selectElement.appendChild(option); - } - return typeDiv; -}; - -ElementExportPanel.prototype._createDownloadButton = function() { - var self = this; - var downloadDiv = Functions.createElement({ - type : "div", - name : "downloadDiv", - style : "clear:both; padding: 10px;", - }); - var button = Functions.createElement({ - type : "button", - content : " Download", - onclick : function() { - return self.createResponseString().then(function(result) { - logger.info(result); - }); - }, - }); - downloadDiv.appendChild(button); - - return downloadDiv; -}; - ElementExportPanel.prototype.createResponseString = function() { var self = this; - var types; + var types, miriamTypes; + var includedCompartmentIds = []; + var excludedCompartmentIds = []; var models = [ self.getProject().getModel() ]; for (var i = 0; i < self.getProject().getModel().getSubmodels().length; i++) { models.push(self.getProject().getModel().getSubmodels()[i]); @@ -193,12 +55,28 @@ ElementExportPanel.prototype.createResponseString = function() { var elements = []; return self.getSelectedTypes().then(function(result) { + if (result.length === 0) { + return Promise.reject(new GuiMessageError("You must select at least one type")); + } types = result; + return self.getSelectedIncludedCompartments(); + }).then(function(result) { + result.forEach(function(compartment) { + includedCompartmentIds.push(compartment.getId()); + }); + return self.getSelectedExcludedCompartments(); + }).then(function(result) { + result.forEach(function(compartment) { + excludedCompartmentIds.push(compartment.getId()); + }); + var promises = []; for (var i = 0; i < models.length; i++) { promises.push(models[i].getAliases({ type : types, complete : true, + includedCompartmentIds : includedCompartmentIds, + excludedCompartmentIds : excludedCompartmentIds, })); } return Promise.all(promises); @@ -208,183 +86,53 @@ ElementExportPanel.prototype.createResponseString = function() { elements.push(aliasesByModel[i][j]); } } + + return self.getSelectedMiriamTypes(); + }).then(function(result) { + miriamTypes = result; return self.getSelectedColumns(); }).then(function(selectedColumns) { + if (selectedColumns.length === 0) { + return Promise.reject(new GuiMessageError("You must select at least one column")); + } var rows = []; - rows.push(self.createResponseHeader(selectedColumns)); + rows.push(self.createResponseHeader(selectedColumns, miriamTypes)); for (var i = 0; i < elements.length; i++) { - rows.push(self.createResponseRow(elements[i], selectedColumns)); + rows.push(self.createResponseRow(elements[i], selectedColumns, miriamTypes)); } return rows.join("\n"); }); }; -ElementExportPanel.prototype.createResponseHeader = function(columns) { +ElementExportPanel.prototype.createResponseRow = function(alias, columns, miriamTypes) { var stringBuilder = []; - for (var i = 0; i < columns.length; i++) { + var i, value; + for (i = 0; i < columns.length; i++) { var column = columns[i]; - stringBuilder.push(column.name); - } - var result = stringBuilder.join("\t"); - return result; - -}; - -ElementExportPanel.prototype.createResponseRow = function(alias, columns) { - var stringBuilder = []; - for (var i = 0; i < columns.length; i++) { - var column = columns[i]; - var value = alias[column.method](); + value = alias[column.method](); if (column.formatFunction !== undefined) { value = column.formatFunction(value); } - stringBuilder.push(value); - - } - var result = stringBuilder.join("\t"); - return result; -}; - -ElementExportPanel.prototype._createSelectIncludedCompartmentDiv = function() { - var self = this; - var typeDiv = Functions.createElement({ - type : "div", - name : "includedCompartmentSelectDiv", - className : "minerva-export-dual-listbox-container", - }); - typeDiv.appendChild(Functions.createElement({ - type : "h4", - content : " Included compartment/pathways:", - })); - - return self._getCompartmentNames().then(function(compartmentNames) { - - var selectElement = Functions.createElement({ - type : "select", - className : "minerva-multi-select", - id : "includedCompartmentsSelect", - }); - typeDiv.appendChild(selectElement); - - for (var i = 0; i < compartmentNames.length; i++) { - var name = compartmentNames[i]; - - var option = new Option(); - option.value = name; - option.innerHTML = "<div >" + name + "</div>"; - selectElement.appendChild(option); - } - return typeDiv; - }); -}; - -ElementExportPanel.prototype._createSelectExcludedCompartmentDiv = function() { - var self = this; - var typeDiv = Functions.createElement({ - type : "div", - name : "excludedCompartmentSelectDiv", - className : "minerva-export-dual-listbox-container", - }); - typeDiv.appendChild(Functions.createElement({ - type : "h4", - content : " Excluded compartment/pathways:", - })); - - return self._getCompartmentNames().then(function(compartmentNames) { - - var selectElement = Functions.createElement({ - type : "select", - className : "minerva-multi-select", - id : "excludedCompartmentsSelect", - }); - typeDiv.appendChild(selectElement); - - for (var i = 0; i < compartmentNames.length; i++) { - var name = compartmentNames[i]; - - var option = new Option(); - option.value = name; - option.innerHTML = "<div >" + name + "</div>"; - selectElement.appendChild(option); + if (value instanceof String || typeof value === "string") { + value = value.replace(/[\n\r]/g, ' '); } - return typeDiv; - }); -}; - -ElementExportPanel.prototype._getAllCompartments = function() { - var self = this; - var compartments = []; - var i; - - var models = [ self.getProject().getModel() ]; - for (i = 0; i < self.getProject().getModel().getSubmodels().length; i++) { - models.push(self.getProject().getModel().getSubmodels()[i]); - } - - var promises = []; - for (i = 0; i < models.length; i++) { - promises.push(models[i].getCompartments()); + stringBuilder.push(value); } - - return Promise.all(promises).then(function(result) { - for (var i = 0; i < result.length; i++) { - var modelCompartments = result[i]; - for (var j = 0; j < modelCompartments.length; j++) { - compartments.push(modelCompartments[j]); + for (i = 0; i < miriamTypes.length; i++) { + value = ""; + var miriamType = miriamTypes[i]; + var references = alias.getReferences(); + for (var j = 0; j < references.length; j++) { + var reference = references[j]; + if (reference.getType() === miriamType.getName()) { + value += reference.getResource() + ","; } } - return compartments; - }); -}; -ElementExportPanel.prototype._getCompartmentNames = function() { - var self = this; - var compartments = []; - return self._getAllCompartments().then(function(result) { - - var addedNames = []; - for (var i = 0; i < result.length; i++) { - if (addedNames[result[i].getName()] === undefined) { - compartments.push(result[i].getName()); - addedNames[result[i].getName()] = true; - } - } - compartments.sort(compareSimple); - return compartments; - }); -}; - -ElementExportPanel.prototype._createSelectColumnDiv = function() { - var self = this; - var columnDiv = Functions.createElement({ - type : "div", - name : "columnSelectDiv", - }); - columnDiv.appendChild(Functions.createElement({ - type : "h4", - content : " COLUMN:", - })); - var choicesContainer = Functions.createElement({ - type : "ul", - className : "minerva-checkbox-grid" - }); - var columnTypes = self.getAllColumns(); - - columnDiv.appendChild(choicesContainer); - for (var i = 0; i < columnTypes.length; i++) { - var columnType = columnTypes[i]; - var row = Functions.createElement({ - type : "li", - content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"column_" + columnType.columnName - + "\" value=\"" + columnType.columnName + "\" />" + columnType.name + "</label></div>" - }); - choicesContainer.appendChild(row); + stringBuilder.push(value); } - choicesContainer.appendChild(Functions.createElement({ - type : "li", - content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"ALL\" value=\"ALL\" />ALL</label></div>" - })); - return columnDiv; + var result = stringBuilder.join("\t"); + return result; }; ElementExportPanel.prototype.getAllColumns = function() { @@ -467,128 +215,5 @@ ElementExportPanel.prototype.getAllColumns = function() { }, ]; }; -ElementExportPanel.prototype.getSelectedTypes = function() { - var self = this; - - var div = $("div[name='typeSelectDiv']", $(self.getElement()))[0]; - var result = []; - var selectedAll = false; - $(":checked", $(div)).each(function(index, element) { - if (element.value === "ALL") { - selectedAll = true; - } - result.push(element.value); - }); - if (selectedAll) { - return ServerConnector.getConfiguration().then(function(configuration) { - return configuration.getElementTypes(); - }); - } - - return Promise.resolve(result); -}; - -ElementExportPanel.prototype.setMiriamTypesDualListbox = function(dualListbox) { - this._miriamTypesDualListbox = dualListbox; -}; -ElementExportPanel.prototype.getMiriamTypesDualListbox = function() { - return this._miriamTypesDualListbox; -}; - -ElementExportPanel.prototype.setIncludedCompartmentsDualListbox = function(dualListbox) { - this._includedCompartmentsDualListbox = dualListbox; -}; -ElementExportPanel.prototype.getIncludedCompartmentsDualListbox = function() { - return this._includedCompartmentsDualListbox; -}; - -ElementExportPanel.prototype.getSelectedIncludedCompartments = function() { - var self = this; - var list = self.getIncludedCompartmentsDualListbox().selected; - var names = []; - var result = []; - for (var i = 0; i < list.length; i++) { - var element = list[i]; - names[element.dataset.id] = true; - } - return self._getAllCompartments().then(function(compartments) { - for (var i = 0; i < compartments.length; i++) { - var compartment = compartments[i]; - if (names[compartment.getName()]) { - result.push(compartment); - } - } - return result; - }); -}; - -ElementExportPanel.prototype.setExcludedCompartmentsDualListbox = function(dualListbox) { - this._excludedCompartmentsDualListbox = dualListbox; -}; -ElementExportPanel.prototype.getExcludedCompartmentsDualListbox = function() { - return this._excludedCompartmentsDualListbox; -}; - -ElementExportPanel.prototype.getSelectedExcludedCompartments = function() { - var self = this; - var list = self.getExcludedCompartmentsDualListbox().selected; - var names = []; - var result = []; - for (var i = 0; i < list.length; i++) { - var element = list[i]; - names[element.dataset.id] = true; - } - return self._getAllCompartments().then(function(compartments) { - for (var i = 0; i < compartments.length; i++) { - var compartment = compartments[i]; - if (names[compartment.getName()]) { - result.push(compartment); - } - } - return result; - }); -}; - -ElementExportPanel.prototype.getSelectedMiriamTypes = function() { - var self = this; - return ServerConnector.getConfiguration().then(function(configuration) { - var selected = self.getMiriamTypesDualListbox().selected; - var result = []; - for (var i = 0; i < selected.length; i++) { - var miriamType = configuration.getMiriamTypeByName(selected[i].dataset.id); - result.push(miriamType); - } - return result; - }); -}; - -ElementExportPanel.prototype.getSelectedColumns = function() { - var self = this; - - var div = $("div[name='columnSelectDiv']", $(self.getElement()))[0]; - var selectedColumnMap = []; - var selectedAll = false; - $(":checked", $(div)).each(function(index, element) { - if (element.value === "ALL") { - selectedAll = true; - } - selectedColumnMap[element.value] = true; - }); - var columnTypes = self.getAllColumns(); - - if (selectedAll) { - return Promise.resolve(columnTypes); - } - - var result = []; - - for (var i = 0; i < columnTypes.length; i++) { - var columnType = columnTypes[i]; - if (selectedColumnMap[columnType.columnName] === true) { - result.push(columnType); - } - } - return Promise.resolve(result); -}; module.exports = ElementExportPanel; diff --git a/frontend-js/src/main/js/gui/export/GraphicsExportPanel.js b/frontend-js/src/main/js/gui/export/GraphicsExportPanel.js index 6bf41a4246b1695a8bedde1007e23741acf6ad4c..4e2f7103a850a8a55e62ec42efbb08da47c9ba5c 100644 --- a/frontend-js/src/main/js/gui/export/GraphicsExportPanel.js +++ b/frontend-js/src/main/js/gui/export/GraphicsExportPanel.js @@ -2,21 +2,156 @@ /* exported logger */ -var Panel = require('../Panel'); +var AbstractExportPanel = require('./AbstractExportPanel'); +var Functions = require('../../Functions'); var logger = require('../../logger'); function GraphicsExportPanel(params) { - params.panelName = "elementExport"; - params.scrollable = true; - Panel.call(this, params); + params.panelName = "graphicsExport"; + AbstractExportPanel.call(this, params); } -GraphicsExportPanel.prototype = Object.create(Panel.prototype); +GraphicsExportPanel.prototype = Object.create(AbstractExportPanel.prototype); GraphicsExportPanel.prototype.constructor = GraphicsExportPanel; GraphicsExportPanel.prototype.init = function() { + var self = this; + var element = self.getElement(); + var configuration; + element.appendChild(self._createSelectProjectDiv()); + var configuration; + return ServerConnector.getConfiguration().then(function(result) { + configuration = result; + element.appendChild(self._createSelectGraphicsFormatDiv(configuration.getImageConverters())); + element.appendChild(self._createDownloadButton()); + }).then(function() { + $(window).trigger('resize'); + }); +}; + +GraphicsExportPanel.prototype._createSelectProjectDiv = function(annotations) { + var self = this; + var project = self.getProject(); + var typeDiv = Functions.createElement({ + type : "div", + name : "modelSelectDiv", + }); + typeDiv.appendChild(Functions.createElement({ + type : "h4", + content : "(Sub)map:", + })); + + var choicesContainer = Functions.createElement({ + type : "ul", + }); + typeDiv.appendChild(choicesContainer); + + var models = self.getModels(); + + for (var i = 0; i < models.length; i++) { + var model = models[i]; + var checkedString = ""; + if (i === 0) { + checkedString = ' checked="checked" '; + } + var row = Functions.createElement({ + type : "li", + content : '<div><label> <input type="radio" name="model" value="' + model.getId() + '"' + checkedString + '/>' + + model.getName() + '</label></div>', + }); + choicesContainer.appendChild(row); + } + + return typeDiv; +}; + +GraphicsExportPanel.prototype._createSelectGraphicsFormatDiv = function(formats) { + var self = this; + var project = self.getProject(); + var typeDiv = Functions.createElement({ + type : "div", + name : "formatSelectDiv", + }); + typeDiv.appendChild(Functions.createElement({ + type : "h4", + content : "Format:", + })); + + var choicesContainer = Functions.createElement({ + type : "ul", + }); + typeDiv.appendChild(choicesContainer); + + for (var i = 0; i < formats.length; i++) { + var format = formats[i]; + var checkedString = ""; + if (i === 0) { + checkedString = ' checked="checked" '; + } + var row = Functions.createElement({ + type : "li", + content : '<div><label> <input type="radio" name="format" value="' + format.handler + '"' + checkedString + '/>' + + format.name + '</label></div>', + }); + choicesContainer.appendChild(row); + } + + return typeDiv; +}; + +GraphicsExportPanel.prototype.getSubmapId = function() { + var self = this; + var div = $("div[name='modelSelectDiv']", $(self.getElement()))[0]; + var id = null; + $(":checked", $(div)).each(function(index, element) { + id = element.value; + }); + return id; +}; +GraphicsExportPanel.prototype.getFormatHandler = function() { + var self = this; + var div = $("div[name='formatSelectDiv']", $(self.getElement()))[0]; + var format = null; + $(":checked", $(div)).each(function(index, element) { + format = element.value; + }); + return format; +}; + +GraphicsExportPanel.prototype._createDownloadButton = function() { + var self = this; + var downloadDiv = Functions.createElement({ + type : "div", + name : "downloadDiv", + style : "clear:both; padding: 10px;", + }); + var button = Functions.createElement({ + type : "button", + name : "downloadButton", + content : " Download", + onclick : function() { + var identifier = null; + var defaultOverlayName = "Network"; + for (var i = 0; i < self.getProject().getModel().getLayouts().length; i++) { + var layout = self.getProject().getModel().getLayouts()[i]; + if (identifier === null || layout.getName() === defaultOverlayName) { + identifier = layout.getId(); + } + } + + return ServerConnector.getImageDownloadUrl({ + modelId : self.getSubmapId(), + backgroundOverlayId : identifier, + handlerClass : self.getFormatHandler(), + }).then(function(url) { + return self.downloadFile(url); + }).then(null, GuiConnector.alert); + }, + }); + downloadDiv.appendChild(button); + return downloadDiv; }; module.exports = GraphicsExportPanel; diff --git a/frontend-js/src/main/js/gui/export/NetworkExportPanel.js b/frontend-js/src/main/js/gui/export/NetworkExportPanel.js index 6f770c99ff870a433843a68a6208d5d8c7031689..d93fdebae2f51ca83c232a5cd181b5d0f5b342ad 100644 --- a/frontend-js/src/main/js/gui/export/NetworkExportPanel.js +++ b/frontend-js/src/main/js/gui/export/NetworkExportPanel.js @@ -2,22 +2,254 @@ /* exported logger */ -var Panel = require('../Panel'); +var AbstractExportPanel = require('./AbstractExportPanel'); +var Promise = require("bluebird"); var logger = require('../../logger'); +var GuiMessageError = require('../GuiMessageError'); -function NetworkExportPanel(params) { - params.panelName = "elementExport"; - params.scrollable = true; - Panel.call(this, params); +function NetworkExportPanel(params) { + params.panelName = "networkExport"; + AbstractExportPanel.call(this, params); } -NetworkExportPanel.prototype = Object.create(Panel.prototype); +NetworkExportPanel.prototype = Object.create(AbstractExportPanel.prototype); NetworkExportPanel.prototype.constructor = NetworkExportPanel; NetworkExportPanel.prototype.init = function() { + var self = this; + var element = self.getElement(); + var configuration; + return ServerConnector.getConfiguration().then(function(result) { + configuration = result; + var typeDiv = self._createSelectTypeDiv(configuration.getElementTypes()); + element.appendChild(typeDiv); + element.appendChild(self._createSelectColumnDiv(self.getAllColumns())); + return ServerConnector.getProjectStatistics(self.getProject().getProjectId()); + }).then(function(statistics) { + return self._createMiriamTypeDiv(statistics.getReactionAnnotations()); + }).then(function(div) { + element.appendChild(div); + return self._createSelectIncludedCompartmentDiv(); + }).then(function(div) { + element.appendChild(div); + return self._createSelectExcludedCompartmentDiv(); + }).then(function(div) { + element.appendChild(div); + element.appendChild(self._createDownloadButton()); + }).then(function() { + $(window).trigger('resize'); + }); + +}; + +NetworkExportPanel.prototype.getAllColumns = function() { + return [ { + "columnName" : "elements", + "method" : "getElements", + "name" : "Elements", + "formatFunction" : function(elements, reaction, elementIds) { + var stringBuilder = []; + var type; + var elementFormat = function(element) { + if (elementIds[element.getId()]) { + stringBuilder.push(type + ":" + element.getId()); + } + }; + type = "REACTANT"; + reaction.getReactants().forEach(elementFormat); + type = "PRODUCT"; + reaction.getProducts().forEach(elementFormat); + type = "MODIFIER"; + reaction.getModifiers().forEach(elementFormat); + + return stringBuilder.join(","); + }, + }, { + "columnName" : "id", + "method" : "getId", + "name" : "Id", + }, { + "columnName" : "description", + "method" : "getDescription", + "name" : "Description", + }, { + "columnName" : "modelId", + "method" : "getModelId", + "name" : "Model", + }, { + "columnName" : "type", + "method" : "getType", + "name" : "Type", + }, { + "columnName" : "symbol", + "method" : "getSymbol", + "name" : "Symbol", + }, { + "columnName" : "abbreviation", + "method" : "getAbbreviation", + "name" : "Abbreviation", + }, { + "columnName" : "formula", + "method" : "getFormula", + "name" : "Formula", + }, { + "columnName" : "synonyms", + "method" : "getSynonyms", + "name" : "Synonyms", + }, { + "columnName" : "references", + "method" : "getReferences", + "name" : "References", + "formatFunction" : function(references) { + var stringBuilder = []; + for (var i = 0; i < references.length; i++) { + var reference = references[i]; + stringBuilder.push(reference.getType() + ":" + reference.getResource()); + } + return stringBuilder.join(","); + }, + }, { + "columnName" : "reactionId", + "method" : "getReactionId", + "name" : "Element external id", + }, { + "columnName" : "mechanicalConfidenceScore", + "method" : "getMechanicalConfidenceScore", + "name" : "Mechanical Confidence Score", + }, { + "columnName" : "lowerBound", + "method" : "getLowerBound", + "name" : "Lower Bound", + }, { + "columnName" : "upperBound", + "method" : "getUpperBound", + "name" : "Upper Bound", + }, { + "columnName" : "geneProteinReaction", + "method" : "getGeneProteinReaction", + "name" : "Gene Protein Reaction", + }, { + "columnName" : "subsystem", + "method" : "getSubsystem", + "name" : "Subsystem", + }, ]; +}; + +function matchReaction(reaction, elementIds) { + var count = 0; + reaction.getElements().forEach(function(element) { + if (elementIds[element.getId()]) { + count++; + } + }); + return count > 1; +} + +NetworkExportPanel.prototype.createResponseString = function() { + var self = this; + var types, miriamTypes; + var includedCompartmentIds = []; + var excludedCompartmentIds = []; + var models = [ self.getProject().getModel() ]; + for (var i = 0; i < self.getProject().getModel().getSubmodels().length; i++) { + models.push(self.getProject().getModel().getSubmodels()[i]); + } + + var elementIds = []; + var reactions = []; + return self.getSelectedTypes().then(function(result) { + if (result.length === 0) { + return Promise.reject(new GuiMessageError("You must select at least one type")); + } + types = result; + return self.getSelectedIncludedCompartments(); + }).then(function(result) { + result.forEach(function(compartment) { + includedCompartmentIds.push(compartment.getId()); + }); + return self.getSelectedExcludedCompartments(); + }).then(function(result) { + result.forEach(function(compartment) { + excludedCompartmentIds.push(compartment.getId()); + }); + + var promises = []; + for (var i = 0; i < models.length; i++) { + promises.push(models[i].getAliases({ + type : types, + complete : true, + includedCompartmentIds : includedCompartmentIds, + excludedCompartmentIds : excludedCompartmentIds, + })); + } + return Promise.all(promises); + }).then(function(aliasesByModel) { + var promises = []; + for (var i = 0; i < models.length; i++) { + promises.push(models[i].getReactionsForElements(aliasesByModel[i], true)); + for (var j = 0; j < aliasesByModel[i].length; j++) { + elementIds[aliasesByModel[i][j].getId()] = true; + } + } + return Promise.all(promises); + }).then(function(reactionsByModel) { + for (var i = 0; i < models.length; i++) { + for (var j = 0; j < reactionsByModel[i].length; j++) { + var reaction = reactionsByModel[i][j]; + if (matchReaction(reaction, elementIds)) { + reactions.push(reaction); + } + } + } + return self.getSelectedMiriamTypes(); + }).then(function(result) { + miriamTypes = result; + return self.getSelectedColumns(); + }).then(function(selectedColumns) { + if (selectedColumns.length === 0) { + return Promise.reject(new GuiMessageError("You must select at least one column")); + } + + var rows = []; + rows.push(self.createResponseHeader(selectedColumns, miriamTypes)); + for (var i = 0; i < reactions.length; i++) { + rows.push(self.createResponseRow(reactions[i], selectedColumns, miriamTypes, elementIds)); + } + return rows.join("\n"); + }); +}; + +NetworkExportPanel.prototype.createResponseRow = function(reaction, columns, miriamTypes, elementIds) { + var stringBuilder = []; + var i, value; + for (i = 0; i < columns.length; i++) { + var column = columns[i]; + value = reaction[column.method](); + if (column.formatFunction !== undefined) { + value = column.formatFunction(value, reaction, elementIds); + } + if (value instanceof String || typeof value === "string") { + value = value.replace(/[\n\r]/g, ' '); + } + stringBuilder.push(value); + } + for (i = 0; i < miriamTypes.length; i++) { + value = ""; + var miriamType = miriamTypes[i]; + var references = reaction.getReferences(); + for (var j = 0; j < references.length; j++) { + var reference = references[j]; + if (reference.getType() === miriamType.getName()) { + value += reference.getResource() + ","; + } + } + stringBuilder.push(value); + } + var result = stringBuilder.join("\t"); + return result; }; module.exports = NetworkExportPanel; diff --git a/frontend-js/src/main/js/map/data/MapModel.js b/frontend-js/src/main/js/map/data/MapModel.js index fe059bcad1102b1473ec065ed0961fdd9d406226..2d921edb045e3224891e0b539096dec2c8102733 100644 --- a/frontend-js/src/main/js/map/data/MapModel.js +++ b/frontend-js/src/main/js/map/data/MapModel.js @@ -103,12 +103,15 @@ MapModel.prototype.getLayouts = function() { MapModel.prototype.getAliases = function(params) { var self = this; return ServerConnector.getAliases({ - columns : "id,bounds,modelId", + columns : "id,modelId", type : params.type, modelId : self.getId(), - }).then(function(lightAliases){ + includedCompartmentIds : params.includedCompartmentIds, + excludedCompartmentIds : params.excludedCompartmentIds, + + }).then(function(lightAliases) { var identifiedElements = []; - for (var i=0;i<lightAliases.length;i++) { + for (var i = 0; i < lightAliases.length; i++) { self.addAlias(lightAliases[i]); identifiedElements.push(new IdentifiedElement(lightAliases[i])); } @@ -180,45 +183,41 @@ MapModel.prototype.getReactionById = function(id, complete) { } }; +MapModel.prototype._getMissingReactionsElementIds = function(reactions) { + var self = this; + var result = []; + var ids = []; + for (var i = 0; i < reactions.length; i++) { + var reaction = reactions[i]; + var elements = reaction.getElements(); + for (var j = 0; j < elements.length; j++) { + var element = elements[j]; + if (!(element instanceof Alias)) { + if (self._aliases[element] === undefined || !self._aliases[element].isComplete()) { + if (!ids[element]) { + ids[element] = true; + result.push(element); + } + } + } + } + } + return result; +}; + MapModel.prototype.getCompleteReactionById = function(id) { var self = this; if (self._reactions[id] instanceof Reaction && self._reactions[id].isComplete()) { return Promise.resolve(self._reactions[id]); } else { var result; - return self.getReactionById(id).then( - function(result) { - var ids = []; - var i; - for (i = 0; i < result.getReactants().length; i++) { - if (!(result.getReactants()[i] instanceof Alias)) { - if (self._aliases[result.getReactants()[i]] === undefined - || !self._aliases[result.getReactants()[i]].isComplete()) { - ids.push(result.getReactants()[i]); - } - } - } - for (i = 0; i < result.getProducts().length; i++) { - if (!(result.getProducts()[i] instanceof Alias)) { - if (self._aliases[result.getProducts()[i]] === undefined - || !self._aliases[result.getProducts()[i]].isComplete()) { - ids.push(result.getProducts()[i]); - } - } - } - for (i = 0; i < result.getModifiers().length; i++) { - if (!(result.getModifiers()[i] instanceof Alias)) { - if (self._aliases[result.getModifiers()[i]] === undefined - || !self._aliases[result.getModifiers()[i]].isComplete()) { - ids.push(result.getModifiers()[i]); - } - } - } - return self.getMissingElements({ - aliasIds : ids, - complete : true - }); - }).then(function() { + return self.getReactionById(id).then(function(result) { + var ids = self._getMissingReactionsElementIds([ result ]); + return self.getMissingElements({ + aliasIds : ids, + complete : true + }); + }).then(function() { var i; result = self._reactions[id]; for (i = 0; i < result.getReactants().length; i++) { @@ -308,16 +307,20 @@ MapModel.prototype.getMissingElements = function(elements) { } } + var result = []; return Promise.all([ reactionPromise, aliasPromise ]).then(function(values) { - var result = [], i; + var i; var reactions = values[0]; var aliases = values[1]; + var ids = []; + if (reactions !== null) { for (i = 0; i < reactions.length; i++) { var reaction = reactions[i]; self.addReaction(reaction); result.push(reaction); } + ids = self._getMissingReactionsElementIds(reactions); } if (aliases !== null) { for (i = 0; i < aliases.length; i++) { @@ -326,6 +329,15 @@ MapModel.prototype.getMissingElements = function(elements) { result.push(alias); } } + if (ids.length > 0) { + return self.getMissingElements({ + aliasIds : ids, + complete : true + }); + } else { + return Promise.resolve([]); + } + }).then(function() { return result; }); }; @@ -731,9 +743,13 @@ MapModel.prototype.getReactionsForElements = function(elements, complete) { return Promise.all(promises); } } + + var result = []; return ServerConnector.getReactions({ participantId : ids, }).then(function(reactions) { + result = reactions; + var promises = []; for (var i = 0; i < reactions.length; i++) { var reaction = reactions[i]; @@ -743,7 +759,16 @@ MapModel.prototype.getReactionsForElements = function(elements, complete) { } else { self._reactions[id].update(reaction); } - promises.push(self.getReactionById(id, complete)); + } + var ids = self._getMissingReactionsElementIds(reactions); + return self.getMissingElements({ + aliasIds : ids, + complete : true + }); + }).then(function() { + var promises = []; + for (var i=0;i<result.length;i++) { + promises.push(self.getCompleteReactionById(result[i].getId())); } return Promise.all(promises); }); diff --git a/frontend-js/src/main/js/map/data/ProjectStatistics.js b/frontend-js/src/main/js/map/data/ProjectStatistics.js index e30fe8b0cbb34f7021b6e3fabec5dd60cc5bda45..0e5cd484641a1a04e88b51e38391628854617a04 100644 --- a/frontend-js/src/main/js/map/data/ProjectStatistics.js +++ b/frontend-js/src/main/js/map/data/ProjectStatistics.js @@ -49,6 +49,9 @@ ProjectStatistics.prototype.setElementAnnotations = function(elementAnnotations, ProjectStatistics.prototype.getElementAnnotations = function() { return this._elementAnnotations; }; +ProjectStatistics.prototype.getReactionAnnotations = function() { + return this._reactionAnnotations; +}; ProjectStatistics.prototype.setPublicationCount = function(count) { this._publicationsCount = count; diff --git a/frontend-js/src/test/js/gui/export/ElementExportPanel-test.js b/frontend-js/src/test/js/gui/export/ElementExportPanel-test.js index 05146b3859b76a192316df4e0eade26c6c238564..209fd20b97e369a40fdc584c867db855aa3be2b4 100644 --- a/frontend-js/src/test/js/gui/export/ElementExportPanel-test.js +++ b/frontend-js/src/test/js/gui/export/ElementExportPanel-test.js @@ -3,6 +3,7 @@ /* exported logger */ var ElementExportPanel = require('../../../../main/js/gui/export/ElementExportPanel'); +var GuiMessageError = require('../../../../main/js/gui/GuiMessageError'); var MiriamType = require('../../../../main/js/map/data/MiriamType'); var logger = require('../../logger'); @@ -217,6 +218,9 @@ describe('ElementExportPanel', function() { $("input[name='ALL']", $(testDiv)).each(function(index, element) { element.checked = true; }); + var dlb = exportObject.getMiriamTypesDualListbox(); + var listItem = dlb.available[0]; + dlb.addSelected(listItem); return exportObject.createResponseString(); }).then(function(result) { // protein id @@ -224,6 +228,62 @@ describe('ElementExportPanel', function() { assert.ok(result.indexOf("329156") >= 0); }); }); + it('get invalid', function() { + var exportObject; + var project; + return ServerConnector.getProject().then(function(result) { + project = result; + return ServerConnector.getConfiguration(); + }).then(function(configuration) { + exportObject = new ElementExportPanel({ + element : testDiv, + project : project, + configuration : configuration, + }); + return exportObject.init(); + }).then(function() { + return exportObject.createResponseString(); + }).then(null, function(error) { + assert.ok(error instanceof GuiMessageError); + }); + }); + }); + + it('download file', function() { + var exportObject; + var project; + return ServerConnector.getProject().then(function(result) { + project = result; + return ServerConnector.getConfiguration(); + }).then(function(configuration) { + exportObject = new ElementExportPanel({ + element : testDiv, + project : project, + configuration : configuration, + }); + return exportObject.init(); + }).then(function() { + $("input[name='ALL']", $(testDiv)).each(function(index, element) { + element.checked = true; + }); + var element = $("[name='downloadButton']", $(testDiv))[0]; + return element.onclick(); + }); + }); + + describe('createResponseRow', function() { + it('description with new line', function() { + var exportObject = new ElementExportPanel({ + element : testDiv, + project : helper.createProject(), + configuration : helper.getConfiguration(), + }); + var alias = helper.createAlias(); + var desc = "test\ntest2\n"; + alias.setDescription(desc); + var rowString = exportObject.createResponseRow(alias, exportObject.getAllColumns(), []); + assert.ok(rowString.indexOf("test\ntest2\n") === -1); + }); }); }); diff --git a/frontend-js/src/test/js/gui/export/GraphicsExportPanel-test.js b/frontend-js/src/test/js/gui/export/GraphicsExportPanel-test.js new file mode 100644 index 0000000000000000000000000000000000000000..a2b91b43d1f71c2c2ccae68098c6ed749fb6ee06 --- /dev/null +++ b/frontend-js/src/test/js/gui/export/GraphicsExportPanel-test.js @@ -0,0 +1,68 @@ +"use strict"; + +/* exported logger */ + +var GraphicsExportPanel = require('../../../../main/js/gui/export/GraphicsExportPanel'); +var logger = require('../../logger'); +var assert = require('assert'); + +describe('GraphicsExportPanel', function() { + + it('getModelId', function() { + var exportObject; + var project; + return ServerConnector.getProject().then(function(result) { + project = result; + return ServerConnector.getConfiguration(); + }).then(function(configuration) { + exportObject = new GraphicsExportPanel({ + element : testDiv, + project : project, + configuration : configuration, + }); + return exportObject.init(); + }).then(function() { + var id = exportObject.getSubmapId(); + assert.ok(id); + }); + }); + + it('getFormatHandler', function() { + var exportObject; + var project; + return ServerConnector.getProject().then(function(result) { + project = result; + return ServerConnector.getConfiguration(); + }).then(function(configuration) { + exportObject = new GraphicsExportPanel({ + element : testDiv, + project : project, + configuration : configuration, + }); + return exportObject.init(); + }).then(function() { + var format = exportObject.getFormatHandler(); + assert.ok(format); + }); + }); + + it('download file', function() { + var exportObject; + var project; + return ServerConnector.getProject().then(function(result) { + project = result; + return ServerConnector.getConfiguration(); + }).then(function(configuration) { + exportObject = new GraphicsExportPanel({ + element : testDiv, + project : project, + configuration : configuration, + }); + return exportObject.init(); + }).then(function() { + var element = $("[name='downloadButton']", $(testDiv))[0]; + return element.onclick(); + }); + }); + +}); diff --git a/frontend-js/src/test/js/gui/export/NetworkExportPanel-test.js b/frontend-js/src/test/js/gui/export/NetworkExportPanel-test.js new file mode 100644 index 0000000000000000000000000000000000000000..1badab9af1c93d8f392d50ae969c9e3d34b91b29 --- /dev/null +++ b/frontend-js/src/test/js/gui/export/NetworkExportPanel-test.js @@ -0,0 +1,32 @@ +"use strict"; + +/* exported logger */ + +var NetworkExportPanel = require('../../../../main/js/gui/export/NetworkExportPanel'); +var logger = require('../../logger'); + +describe('NetworkExportPanel', function() { + + it('download file', function() { + var exportObject; + var project; + return ServerConnector.getProject().then(function(result) { + project = result; + return ServerConnector.getConfiguration(); + }).then(function(configuration) { + exportObject = new NetworkExportPanel({ + element : testDiv, + project : project, + configuration : configuration, + }); + return exportObject.init(); + }).then(function() { + $("input[name='ALL']", $(testDiv)).each(function(index, element) { + element.checked = true; + }); + var element = $("[name='downloadButton']", $(testDiv))[0]; + return element.onclick(); + }); + }); + +}); diff --git a/frontend-js/src/test/js/mocha-config.js b/frontend-js/src/test/js/mocha-config.js index 4b4438049ae2ebac08f04cac10d1bc2716cb853a..fa68c112a618f9833c4ab9600a398ff92e48effd 100644 --- a/frontend-js/src/test/js/mocha-config.js +++ b/frontend-js/src/test/js/mocha-config.js @@ -24,6 +24,8 @@ global.window.$ = $; // additions to jsdom implementations: global.Option = window.Option; +global.Blob = window.Blob; +global.MouseEvent = window.MouseEvent; var originalCreateElement = document.createElement; document.createElement = function(arg) { @@ -42,6 +44,9 @@ window.open = function() { }; return result; }; +window.URL.createObjectURL = function(){ + +}; // pileup is using heavily some browser defined javascript var pileup = require('pileup'); diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/15781/bioEntities/elements/columns=id,modelId&type=Drug,Complex,Phenotype,Gene,RNA,Unknown,Degraded,Antisense RNA,Ion,Simple molecule,Protein,Compartment&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/15781/bioEntities/elements/columns=id,modelId&type=Drug,Complex,Phenotype,Gene,RNA,Unknown,Degraded,Antisense RNA,Ion,Simple molecule,Protein,Compartment&token=MOCK_TOKEN_ID& new file mode 100644 index 0000000000000000000000000000000000000000..b6d21d318c262584cb47a6fa481b462fdfdec7ac --- /dev/null +++ b/frontend-js/testFiles/apiCalls/projects/sample/models/15781/bioEntities/elements/columns=id,modelId&type=Drug,Complex,Phenotype,Gene,RNA,Unknown,Degraded,Antisense RNA,Ion,Simple molecule,Protein,Compartment&token=MOCK_TOKEN_ID& @@ -0,0 +1 @@ +[{"modelId":15781,"id":329180},{"modelId":15781,"id":329166},{"modelId":15781,"id":329183},{"modelId":15781,"id":329158},{"modelId":15781,"id":329175},{"modelId":15781,"id":329160},{"modelId":15781,"id":329176},{"modelId":15781,"id":329161},{"modelId":15781,"id":329164},{"modelId":15781,"id":329171},{"modelId":15781,"id":329157},{"modelId":15781,"id":329181},{"modelId":15781,"id":329165},{"modelId":15781,"id":329184},{"modelId":15781,"id":329156},{"modelId":15781,"id":329185},{"modelId":15781,"id":329169},{"modelId":15781,"id":329162},{"modelId":15781,"id":329167},{"modelId":15781,"id":329178},{"modelId":15781,"id":329170},{"modelId":15781,"id":329163},{"modelId":15781,"id":329173},{"modelId":15781,"id":329168},{"modelId":15781,"id":329174},{"modelId":15781,"id":329182},{"modelId":15781,"id":329159},{"modelId":15781,"id":329172},{"modelId":15781,"id":329177},{"modelId":15781,"id":329179}] \ No newline at end of file diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329167,329168,329169,329172,329173,329179&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329167,329168,329169,329172,329173,329179&token=MOCK_TOKEN_ID& new file mode 100644 index 0000000000000000000000000000000000000000..ec53d5a3b9547671ae3a2d1bddac3b521d2664db --- /dev/null +++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329167,329168,329169,329172,329173,329179&token=MOCK_TOKEN_ID& @@ -0,0 +1 @@ +[{"elementId":"sa5","symbol":null,"formerSymbols":[],"other":{"structuralState":"usual","modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"RNA","abbreviation":null,"compartmentId":null,"name":"s5","bounds":{"x":0.0,"width":90.0,"y":118.5,"height":25.0},"formula":null,"id":329168,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa1","symbol":null,"formerSymbols":[],"other":{"structuralState":null,"modifications":[]},"notes":"description of S1\r\nthird line","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"s1","bounds":{"x":12.0,"width":80.0,"y":6.0,"height":40.0},"formula":null,"id":329173,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa6","symbol":null,"formerSymbols":[],"other":{"structuralState":"usual","modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Antisense RNA","abbreviation":null,"compartmentId":null,"name":"s6","bounds":{"x":101.0,"width":90.0,"y":129.5,"height":25.0},"formula":null,"id":329167,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa11","symbol":null,"formerSymbols":[],"other":{"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Unknown","abbreviation":null,"compartmentId":null,"name":"s11","bounds":{"x":105.0,"width":70.0,"y":203.5,"height":25.0},"formula":null,"id":329169,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa7","symbol":null,"formerSymbols":[],"other":{"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Phenotype","abbreviation":null,"compartmentId":null,"name":"s7","bounds":{"x":213.0,"width":80.0,"y":128.0,"height":30.0},"formula":null,"id":329172,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa2","symbol":null,"formerSymbols":[],"other":{"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"s2","bounds":{"x":165.0,"width":80.0,"y":43.0,"height":50.0},"formula":null,"id":329179,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}] \ No newline at end of file diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/reactions/participantId=329156,329157,329158,329159,329160,329161,329162,329163,329164,329165,329166,329167,329168,329169,329170,329171,329172,329173,329174,329175,329176,329177,329178,329179,329180,329181,329182,329183,329184,329185&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/reactions/participantId=329156,329157,329158,329159,329160,329161,329162,329163,329164,329165,329166,329167,329168,329169,329170,329171,329172,329173,329174,329175,329176,329177,329178,329179,329180,329181,329182,329183,329184,329185&token=MOCK_TOKEN_ID& new file mode 100644 index 0000000000000000000000000000000000000000..90a3c4b7c4fa022979780b493c9d025900e264eb --- /dev/null +++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/reactions/participantId=329156,329157,329158,329159,329160,329161,329162,329163,329164,329165,329166,329167,329168,329169,329170,329171,329172,329173,329174,329175,329176,329177,329178,329179,329180,329181,329182,329183,329184,329185&token=MOCK_TOKEN_ID& @@ -0,0 +1 @@ +[{"notes":"","references":[],"modelId":15781,"reactants":"329161","reactionId":"re20","id":153497,"type":"State transition","lines":[{"start":{"x":465.68408727882723,"y":173.00924235519662},"end":{"x":427.95591606364394,"y":159.05933030924652},"type":"START"},{"start":{"x":420.45240587887884,"y":156.28492318210644},"end":{"x":382.72423466369554,"y":142.33501113615634},"type":"END"}],"modifiers":"","centerPoint":{"x":424.2041609712614,"y":157.67212674567648},"products":"329165","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329172","reactionId":"re12","id":153522,"type":"State transition","lines":[{"start":{"x":282.92735502516456,"y":131.66828304872405},"end":{"x":349.0890546595849,"y":106.61676571141928},"type":"START"},{"start":{"x":356.5706947317768,"y":103.78391170350197},"end":{"x":422.7323943661972,"y":78.73239436619717},"type":"END"}],"modifiers":"","centerPoint":{"x":352.82987469568087,"y":105.20033870746062},"products":"329182","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329157","reactionId":"re14","id":153502,"type":"State transition","lines":[{"start":{"x":369.0,"y":60.84615384615386},"end":{"x":390.00425356060526,"y":61.8155809335664},"type":"START"},{"start":{"x":397.99574643939474,"y":62.18441906643361},"end":{"x":419.0,"y":63.15384615384615},"type":"END"}],"modifiers":"","centerPoint":{"x":394.0,"y":62.00000000000001},"products":"329182","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329172","reactionId":"re11","id":153516,"type":"State transition","lines":[{"start":{"x":266.57142857142856,"y":128.0},"end":{"x":286.0544419422188,"y":106.46614311649508},"type":"START"},{"start":{"x":291.4217485339718,"y":100.53385688350491},"end":{"x":310.904761904762,"y":79.0},"type":"END"}],"modifiers":"","centerPoint":{"x":288.7380952380953,"y":103.5},"products":"329157","hierarchyVisibilityLevel":null},{"notes":"","references":[{"resource":"REACT_1493.4","link":null,"id":860354,"type":"REACTOME"}],"modelId":15781,"reactants":"329181","reactionId":"re29","id":153506,"type":"State transition","lines":[{"start":{"x":1065.943922652377,"y":210.4515058436089},"end":{"x":1076.3953582603178,"y":134.9622060910266},"type":"START"},{"start":{"x":1077.4924870444363,"y":127.03779390897431},"end":{"x":1087.943922652377,"y":51.548494156391996},"type":"END"},{"start":{"x":1225.7682370820664,"y":95.9386128624158},"end":{"x":1081.8966802661598,"y":131.68570549007447},"type":"MIDDLE"}],"modifiers":"329170","centerPoint":{"x":1076.943922652377,"y":131.00000000000045},"products":"329164","hierarchyVisibilityLevel":null},{"notes":"","references":[],"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":null},{"notes":"","references":[],"modelId":15781,"reactants":"329177","reactionId":"re6","id":153507,"type":"State transition","lines":[{"start":{"x":73.33333333333336,"y":205.99999999999997},"end":{"x":86.57623440706466,"y":207.9864351610597},"type":"START"},{"start":{"x":94.48772523001104,"y":209.17315878450162},"end":{"x":107.73062630374235,"y":211.15959394556134},"type":"END"}],"modifiers":"","centerPoint":{"x":90.53197981853785,"y":208.57979697278066},"products":"329169","hierarchyVisibilityLevel":null},{"notes":"","references":[{"resource":"REACT_631.3","link":null,"id":860356,"type":"REACTOME"}],"modelId":15781,"reactants":"329164,329163,329184","reactionId":"re28","id":153517,"type":"State transition","lines":[{"start":{"x":1141.5196031834896,"y":51.548494156391996},"end":{"x":1132.7196031834897,"y":115.10969883127876},"type":"START"},{"start":{"x":1219.548247311565,"y":134.3979536254443},"end":{"x":1132.7196031834897,"y":115.10969883127876},"type":"START"},{"start":{"x":1246.1690051005714,"y":32.36583419471002},"end":{"x":1132.7196031834897,"y":115.10969883127876},"type":"START"},{"start":{"x":1128.3196031834896,"y":146.89030116872215},"end":{"x":1119.5196031834896,"y":210.4515058436089},"type":"END"},{"start":{"x":1270.6053791059244,"y":190.1518729146033},"end":{"x":1236.597255534866,"y":287.5959827975124},"type":"END"},{"start":{"x":1128.3196031834896,"y":146.89030116872215},"end":{"x":1270.6053791059244,"y":190.1518729146033},"type":"MIDDLE"},{"start":{"x":1225.7682370820664,"y":100.0252191528203},"end":{"x":1135.4723607972724,"y":131.68570549007447},"type":"MIDDLE"},{"start":{"x":1132.7196031834897,"y":115.10969883127876},"end":{"x":1131.0681675755488,"y":127.03779390897431},"type":"MIDDLE"},{"start":{"x":1128.3196031834896,"y":146.89030116872215},"end":{"x":1129.9710387914304,"y":134.9622060910266},"type":"MIDDLE"}],"modifiers":"329170","centerPoint":{"x":1130.5196031834896,"y":131.00000000000045},"products":"329181,329185","hierarchyVisibilityLevel":null},{"notes":"","references":[],"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":null},{"notes":"","references":[],"modelId":15781,"reactants":"329182,329158","reactionId":"re24","id":153501,"type":"Heterodimer association","lines":[{"start":{"x":483.0,"y":84.29763533176055},"end":{"x":533.8361728854625,"y":125.17338224867643},"type":"START"},{"start":{"x":533.8361728854625,"y":125.17338224867643},"end":{"x":570.5932207804386,"y":141.9996978678854},"type":"MIDDLE"},{"start":{"x":570.5932207804386,"y":141.9996978678854},"end":{"x":598.9999999999998,"y":233.5000000000009},"type":"MIDDLE"},{"start":{"x":372.0,"y":278.9000000000001},"end":{"x":598.9999999999998,"y":233.5000000000009},"type":"START"},{"start":{"x":534.1902877883472,"y":223.71375982660487},"end":{"x":502.38530409965,"y":193.69120244400173},"type":"END"},{"start":{"x":537.8602347616395,"y":200.9555550930127},"end":{"x":534.1902877883472,"y":223.71375982660487},"type":"MIDDLE"},{"start":{"x":598.9999999999998,"y":233.5000000000009},"end":{"x":560.730886628659,"y":215.4609444653865},"type":"MIDDLE"},{"start":{"x":560.730886628659,"y":215.4609444653865},"end":{"x":542.8037939212006,"y":170.29938150667186},"type":"MIDDLE"},{"start":{"x":542.8037939212006,"y":170.29938150667186},"end":{"x":539.1338469479083,"y":193.05758624026404},"type":"MIDDLE"}],"modifiers":"","centerPoint":{"x":538.4970408547739,"y":197.00657066663837},"products":"329161","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329179","reactionId":"re13","id":153498,"type":"State transition","lines":[{"start":{"x":245.0,"y":65.09677419354836},"end":{"x":263.01049445505964,"y":63.78956088632629},"type":"START"},{"start":{"x":270.98950554494036,"y":63.210439113673665},"end":{"x":289.00000000000006,"y":61.9032258064516},"type":"END"}],"modifiers":"","centerPoint":{"x":267.0,"y":63.49999999999998},"products":"329157","hierarchyVisibilityLevel":null},{"notes":"asd","references":[],"modelId":15781,"reactants":"329183,329176","reactionId":"re27","id":153503,"type":"State transition","lines":[{"start":{"x":736.0,"y":62.0},"end":{"x":857.8666666666667,"y":65.99999999999984},"type":"START"},{"start":{"x":718.0,"y":157.0},"end":{"x":857.8666666666667,"y":65.99999999999984},"type":"START"},{"start":{"x":1036.7448052448904,"y":161.82878519089866},"end":{"x":695.0,"y":259.0},"type":"END"},{"start":{"x":918.8000000000001,"y":67.99999999999976},"end":{"x":1040.6666666666667,"y":71.9999999999996},"type":"MIDDLE"},{"start":{"x":1040.6666666666667,"y":71.9999999999996},"end":{"x":1036.7448052448904,"y":161.82878519089866},"type":"MIDDLE"},{"start":{"x":918.8000000000001,"y":67.99999999999976},"end":{"x":854.0,"y":159.0},"type":"END"},{"start":{"x":857.8666666666667,"y":65.99999999999984},"end":{"x":884.3354862606928,"y":66.86877963656522},"type":"MIDDLE"},{"start":{"x":918.8000000000001,"y":67.99999999999976},"end":{"x":892.3311804059739,"y":67.13122036343438},"type":"MIDDLE"}],"modifiers":"","centerPoint":{"x":888.3333333333334,"y":66.9999999999998},"products":"329178,329160","hierarchyVisibilityLevel":null},{"notes":"notes for reaction","references":[{"resource":"123","link":"http://www.ncbi.nlm.nih.gov/pubmed/123","id":860355,"type":"PUBMED","article":{"title":"The importance of an innervated and intact antrum and pylorus in preventing postoperative duodenogastric reflux and gastritis.","authors":["Keighley MR"," Asquith P"," Edwards JA"," Alexander-Williams J."],"journal":"The British journal of surgery","year":1975,"link":"http://www.ncbi.nlm.nih.gov/pubmed/123","id":"123","citationCount":12,"stringAuthors":"Keighley MR, Asquith P, Edwards JA, Alexander-Williams J."}}],"modelId":15781,"reactants":"329166","reactionId":"re21","id":153508,"type":"State transition","lines":[{"start":{"x":129.00000000000003,"y":269.9853478599471},"end":{"x":217.3857151822324,"y":271.4614610007049},"type":"START"},{"start":{"x":217.3857151822324,"y":271.4614610007049},"end":{"x":217.98919008325365,"y":297.73178548394236},"type":"MIDDLE"},{"start":{"x":218.17291548409574,"y":305.7296755167626},"end":{"x":218.77639038511697,"y":332.0},"type":"END"}],"modifiers":"","centerPoint":{"x":218.0810527836747,"y":301.7307305003525},"products":"329171","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329174,329180","reactionId":"re26","id":153515,"type":"State transition","lines":[{"start":{"x":792.0,"y":404.0},"end":{"x":868.3333333333338,"y":377.9999999999997},"type":"START"},{"start":{"x":868.3333333333338,"y":377.9999999999997},"end":{"x":893.6666666666671,"y":378.00000000000017},"type":"MIDDLE"},{"start":{"x":884.0,"y":334.0},"end":{"x":893.6666666666671,"y":378.00000000000017},"type":"START"},{"start":{"x":931.666666666667,"y":378.0000000000009},"end":{"x":918.0,"y":447.0},"type":"END"},{"start":{"x":906.3333333333337,"y":378.00000000000045},"end":{"x":931.666666666667,"y":378.0000000000009},"type":"MIDDLE"},{"start":{"x":906.3333333333337,"y":378.00000000000045},"end":{"x":994.0,"y":296.0},"type":"END"},{"start":{"x":893.6666666666671,"y":378.00000000000017},"end":{"x":896.0000000000005,"y":378.0000000000003},"type":"MIDDLE"},{"start":{"x":906.3333333333337,"y":378.00000000000045},"end":{"x":904.0000000000005,"y":378.0000000000004},"type":"MIDDLE"}],"modifiers":"","centerPoint":{"x":900.0000000000005,"y":378.00000000000034},"products":"329162,329156","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329172","reactionId":"re19","id":153514,"type":"State transition","lines":[{"start":{"x":291.5480933063571,"y":141.36660621583232},"end":{"x":321.0332360186737,"y":140.1172357619206},"type":"START"},{"start":{"x":329.02606383097014,"y":139.7785566173318},"end":{"x":358.51120654328673,"y":138.52918616342006},"type":"END"}],"modifiers":"","centerPoint":{"x":325.0296499248219,"y":139.9478961896262},"products":"329165","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329182","reactionId":"re15","id":153520,"type":"State transition","lines":[{"start":{"x":464.2991452991452,"y":84.99999999999999},"end":{"x":474.4764759147595,"y":123.41121554925371},"type":"START"},{"start":{"x":476.52543302899414,"y":131.14437627071987},"end":{"x":486.7027636446084,"y":169.5555918199736},"type":"END"}],"modifiers":"","centerPoint":{"x":475.5009544718768,"y":127.27779590998679},"products":"329161","hierarchyVisibilityLevel":null},{"notes":"","references":[],"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":null},{"notes":"","references":[],"modelId":15781,"reactants":"329158","reactionId":"re9","id":153523,"type":"State transition","lines":[{"start":{"x":321.85186623410436,"y":207.00000000000003},"end":{"x":321.9270873884931,"y":189.4702285640532},"type":"START"},{"start":{"x":321.9270873884931,"y":189.4702285640532},"end":{"x":229.04799778942134,"y":218.492600831302},"type":"MIDDLE"},{"start":{"x":229.04799778942134,"y":218.492600831302},"end":{"x":237.43474907751033,"y":192.0589999282645},"type":"MIDDLE"},{"start":{"x":239.85410636945107,"y":184.4336009030375},"end":{"x":248.24085765754003,"y":158.0},"type":"END"}],"modifiers":"","centerPoint":{"x":238.6444277234807,"y":188.246300415651},"products":"329172","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329169","reactionId":"re7","id":153500,"type":"State transition","lines":[{"start":{"x":163.2392208530345,"y":225.3469042549395},"end":{"x":213.40853059287068,"y":245.52519412275237},"type":"START"},{"start":{"x":220.83069026016378,"y":248.51041536634685},"end":{"x":270.99999999999994,"y":268.6887052341597},"type":"END"}],"modifiers":"","centerPoint":{"x":217.11961042651723,"y":247.0178047445496},"products":"329158","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329158","reactionId":"re18","id":153524,"type":"State transition","lines":[{"start":{"x":372.0,"y":268.1587301587302},"end":{"x":386.60500853172016,"y":262.1312663202425},"type":"START"},{"start":{"x":394.0,"y":259.0793650793651},"end":{"x":408.6050085317202,"y":253.05190124087738},"type":"END"}],"modifiers":"","centerPoint":{"x":390.3025042658601,"y":260.6053156998038},"products":"329175","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329158","reactionId":"re23","id":153521,"type":"Dissociation","lines":[{"start":{"x":371.99999999999994,"y":315.10161915826575},"end":{"x":411.64153465957406,"y":335.590891248036},"type":"START"},{"start":{"x":508.05348418531685,"y":279.95891320505365},"end":{"x":379.6820939222325,"y":146.9928441065957},"type":"END"},{"start":{"x":543.7499999999999,"y":362.874999999999},"end":{"x":508.05348418531685,"y":279.95891320505365},"type":"MIDDLE"},{"start":{"x":449.8434737629195,"y":307.88463901503604},"end":{"x":270.9073813308621,"y":158.0},"type":"END"},{"start":{"x":543.7499999999999,"y":362.874999999999},"end":{"x":546.6153123135401,"y":307.94923690478544},"type":"MIDDLE"},{"start":{"x":546.6153123135401,"y":307.94923690478544},"end":{"x":449.8434737629195,"y":307.88463901503604},"type":"MIDDLE"},{"start":{"x":543.7499999999999,"y":362.874999999999},"end":{"x":500.90979517443395,"y":356.00742559541567},"type":"MIDDLE"},{"start":{"x":500.90979517443395,"y":356.00742559541567},"end":{"x":458.3899053124841,"y":359.75342920945576},"type":"MIDDLE"},{"start":{"x":458.3899053124841,"y":359.75342920945576},"end":{"x":418.7483706529099,"y":339.2641571196856},"type":"MIDDLE"}],"modifiers":"","centerPoint":{"x":415.194952656242,"y":337.4275241838608},"products":"329165,329172","hierarchyVisibilityLevel":null},{"notes":"","references":[],"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":null},{"notes":"","references":[],"modelId":15781,"reactants":"329168","reactionId":"re2","id":153511,"type":"State transition","lines":[{"start":{"x":45.833333333333336,"y":118.49999999999999},"end":{"x":47.983923957904906,"y":86.24114063142645},"type":"START"},{"start":{"x":48.516076042095094,"y":78.25885936857357},"end":{"x":50.666666666666664,"y":46.0},"type":"END"}],"modifiers":"","centerPoint":{"x":48.25,"y":82.25},"products":"329173","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329171","reactionId":"re22","id":153505,"type":"Positive influence","lines":[{"start":{"x":169.66666666666666,"y":332.0},"end":{"x":149.31765717927775,"y":319.13724818355684},"type":"START"},{"start":{"x":142.5553586937381,"y":314.86275181644316},"end":{"x":122.2063492063492,"y":302.0},"type":"END"}],"modifiers":"","centerPoint":{"x":145.93650793650792,"y":317.0},"products":"329166","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329177","reactionId":"re1","id":153519,"type":"State transition","lines":[{"start":{"x":41.07142857142857,"y":186.0},"end":{"x":42.30429751433407,"y":168.73983479932295},"type":"START"},{"start":{"x":42.87427391423735,"y":160.76016520067705},"end":{"x":44.107142857142854,"y":143.5},"type":"END"}],"modifiers":"","centerPoint":{"x":42.58928571428571,"y":164.75},"products":"329168","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329182","reactionId":"re16","id":153513,"type":"State transition","lines":[{"start":{"x":434.8904109589041,"y":85.0},"end":{"x":410.8341500923087,"y":104.95576185524392},"type":"START"},{"start":{"x":404.6769250286157,"y":110.06345991944379},"end":{"x":380.62066416202026,"y":130.0192217746877},"type":"END"}],"modifiers":"","centerPoint":{"x":407.7555375604622,"y":107.50961088734385},"products":"329165","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329165","reactionId":"re17","id":153509,"type":"State transition","lines":[{"start":{"x":375.66023326033917,"y":149.5988027812886},"end":{"x":392.8475673435525,"y":192.3761676106196},"type":"START"},{"start":{"x":395.8301166301696,"y":199.7994013906443},"end":{"x":413.0174507133829,"y":242.5767662199753},"type":"END"}],"modifiers":"","centerPoint":{"x":394.33884198686104,"y":196.08778450063195},"products":"329175","hierarchyVisibilityLevel":null},{"notes":"","references":[],"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":null}] \ No newline at end of file diff --git a/model/src/main/java/lcsb/mapviewer/model/map/model/Model.java b/model/src/main/java/lcsb/mapviewer/model/map/model/Model.java index 5df367d06fe0e9da343d11e186252eaea20c8f03..9b09e2708b9244f8798fef693184859756ec2ccc 100644 --- a/model/src/main/java/lcsb/mapviewer/model/map/model/Model.java +++ b/model/src/main/java/lcsb/mapviewer/model/map/model/Model.java @@ -389,7 +389,7 @@ public interface Model { * element database identifier ({@link Element#id}) * @return {@link Element} for a given id */ - Element getElementByDbId(Integer dbId); + <T extends Element> T getElementByDbId(Integer dbId); /** * Returns {@link Reaction} for given database identifier. diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java index 668985f097cfc601ef841129dfc8aa372df3eaff..843edf209d9f71f8ea1c36e93041eab82f99ed15 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java @@ -91,12 +91,14 @@ public class ConfigurationRestImpl { userService.getToken(token); List<Map<String, Object>> result = new ArrayList<>(); - List<Pair<String, Class<? extends AbstractImageGenerator>>> imageGenerators = new ImageGenerators().getAvailableImageGenerators(); + ImageGenerators imageGenerators = new ImageGenerators(); + List<Pair<String, Class<? extends AbstractImageGenerator>>> imageGeneratorList = imageGenerators.getAvailableImageGenerators(); - for (Pair<String, Class<? extends AbstractImageGenerator>> element : imageGenerators) { + for (Pair<String, Class<? extends AbstractImageGenerator>> element : imageGeneratorList) { Map<String, Object> row = new HashMap<>(); row.put("name", element.getLeft()); row.put("handler", element.getRight().getCanonicalName()); + row.put("extension", imageGenerators.getExtension(element.getRight())); result.add(row); } return result; @@ -114,6 +116,7 @@ public class ConfigurationRestImpl { Map<String, Object> row = new HashMap<>(); row.put("name", converter.getCommonName()); row.put("handler", converter.getClass().getCanonicalName()); + row.put("extension", converter.getFileExtension()); result.add(row); } return result; diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsController.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsController.java index 21b5336199ad0f71bc68dd588c58abfa50d53081..d7bdf466830f02f9d5ee3b8f61d96fe0981415da 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsController.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsController.java @@ -29,9 +29,11 @@ public class ElementsController extends BaseController { @RequestParam(value = "id", defaultValue = "") String id, // @RequestParam(value = "type", defaultValue = "") String type, // @RequestParam(value = "columns", defaultValue = "") String columns, // + @RequestParam(value = "includedCompartmentIds", defaultValue = "") String includedCompartmentIds, // + @RequestParam(value = "excludedCompartmentIds", defaultValue = "") String excludedCompartmentIds, // @CookieValue(value = Configuration.AUTH_TOKEN) String token// ) throws SecurityException { - return projectController.getElements(projectId, id, columns, modelId, token, type); + return projectController.getElements(projectId, id, columns, modelId, token, type, includedCompartmentIds, excludedCompartmentIds); } } \ No newline at end of file diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsRestImpl.java index c30f92abc8903929a1c1ddabb55d9fca647f7acf..9348dc68691f9a30029e51ad2e5a5934b8459939 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsRestImpl.java @@ -12,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import lcsb.mapviewer.api.BaseRestImpl; +import lcsb.mapviewer.model.map.compartment.Compartment; import lcsb.mapviewer.model.map.model.Model; import lcsb.mapviewer.model.map.species.AntisenseRna; import lcsb.mapviewer.model.map.species.Element; @@ -35,8 +36,8 @@ public class ElementsRestImpl extends BaseRestImpl { @Autowired private OverviewImageViewFactory factory; - public List<Map<String, Object>> getElements(String projectId, String id, String columns, String modelId, String token, String type) - throws UserAccessException, SecurityException { + public List<Map<String, Object>> getElements(String projectId, String id, String columns, String modelId, String token, String type, + String includedCompartmentIds, String excludedCompartmentIds) throws UserAccessException, SecurityException { Set<Integer> ids = new HashSet<>(); if (!id.equals("")) { for (String str : id.split(",")) { @@ -49,18 +50,21 @@ public class ElementsRestImpl extends BaseRestImpl { types.add(str.toLowerCase()); } } + List<Model> models = getModels(projectId, modelId, token); + Set<Compartment> includedCompartments = getCompartments(includedCompartmentIds, models); + Set<Compartment> excludedCompartments = getCompartments(excludedCompartmentIds, models); Set<String> columnsSet = createElementColumnSet(columns); List<Map<String, Object>> result = new ArrayList<>(); - List<Model> models = getModels(projectId, modelId, token); - for (Model model2 : models) { for (Element element : model2.getElements()) { if (ids.size() == 0 || ids.contains(element.getId())) { if (types.size() == 0 || types.contains(element.getStringType().toLowerCase())) { - result.add(preparedElement(element, columnsSet)); + if (matchIncludedExcludedCompartments(element, includedCompartments, excludedCompartments)) { + result.add(preparedElement(element, columnsSet)); + } } } } @@ -69,6 +73,53 @@ public class ElementsRestImpl extends BaseRestImpl { return result; } + private boolean matchIncludedExcludedCompartments(Element element, Set<Compartment> includedCompartments, Set<Compartment> excludedCompartments) { + boolean matchIncluded = true; + boolean matchExcluded = false; + + if (includedCompartments.size() > 0) { + matchIncluded = matchCompartments(element, includedCompartments); + } + if (excludedCompartments.size() > 0) { + matchExcluded = matchCompartments(element, excludedCompartments); + } + + return matchIncluded && !matchExcluded; + } + + private boolean matchCompartments(Element element, Set<Compartment> compartmentList) { + boolean isInside = false; + if (element != null) { + for (Compartment compartment : compartmentList) { + if (compartment.contains(element) && element.getModel().getId().equals(compartment.getModel().getId())) { + isInside = true; + } + } + } + return isInside; + } + + private Set<Compartment> getCompartments(String includedCompartmentIds, List<Model> models) { + Set<Compartment> includedCompartments = new HashSet<>(); + int count = 0; + if (!includedCompartmentIds.isEmpty()) { + for (String compartmentId : includedCompartmentIds.split(",")) { + Integer integerId = Integer.valueOf(compartmentId); + for (Model model : models) { + Compartment compartment = model.getElementByDbId(integerId); + if (compartment != null) { + includedCompartments.add(compartment); + } + } + count++; + } + if (count > 0 && includedCompartments.size() == 0) { + includedCompartments.add(new Compartment("empty_comp_to_reject_all_elements")); + } + } + return includedCompartments; + } + private Map<String, Object> preparedElement(Element element, Set<String> columnsSet) { Map<String, Object> result = new HashMap<>(); for (String string : columnsSet) { diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/publications/PublicationsRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/publications/PublicationsRestImpl.java index 0d3e0349126edced91c82d2ad674c564cbd97505..44257fd6b443e375a2b1f6321cb44f8212392170 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/publications/PublicationsRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/publications/PublicationsRestImpl.java @@ -29,9 +29,7 @@ import lcsb.mapviewer.model.map.model.Model; import lcsb.mapviewer.model.map.reaction.Reaction; import lcsb.mapviewer.model.map.species.Element; import lcsb.mapviewer.services.SecurityException; -import lcsb.mapviewer.services.interfaces.IModelService; import lcsb.mapviewer.services.interfaces.ISearchService; -import lcsb.mapviewer.services.interfaces.IUserService; import lcsb.mapviewer.services.view.OverviewImageViewFactory; @Transactional(value = "txManager") @@ -42,12 +40,6 @@ public class PublicationsRestImpl extends BaseRestImpl { */ private Logger logger = Logger.getLogger(PublicationsRestImpl.class); - @Autowired - private IUserService userService; - - @Autowired - private IModelService modelService; - @Autowired private ISearchService searchService; @@ -89,40 +81,6 @@ public class PublicationsRestImpl extends BaseRestImpl { return publications; } - /** - * @return the userService - * @see #userService - */ - public IUserService getUserService() { - return userService; - } - - /** - * @param userService - * the userService to set - * @see #userService - */ - public void setUserService(IUserService userService) { - this.userService = userService; - } - - /** - * @return the modelService - * @see #modelService - */ - public IModelService getModelService() { - return modelService; - } - - /** - * @param modelService - * the modelService to set - * @see #modelService - */ - public void setModelService(IModelService modelService) { - this.modelService = modelService; - } - /** * @return the searchService * @see #searchService diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/AllProjectTests.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/AllProjectTests.java index 60e3837712d839ffd77e188018a37d6f166f3601..d6b904ceb9dfadc1c4f8b52b554efe6cb6b5d19d 100644 --- a/rest-api/src/test/java/lcsb/mapviewer/api/projects/AllProjectTests.java +++ b/rest-api/src/test/java/lcsb/mapviewer/api/projects/AllProjectTests.java @@ -8,14 +8,12 @@ import lcsb.mapviewer.api.projects.chemicals.AllChemicalTests; import lcsb.mapviewer.api.projects.drugs.AllDrugTests; import lcsb.mapviewer.api.projects.mirnas.AllMiRnaTests; import lcsb.mapviewer.api.projects.models.AllModelsTests; -import lcsb.mapviewer.api.projects.overlays.AllOverlaysTests; @RunWith(Suite.class) @SuiteClasses({ AllChemicalTests.class, // AllDrugTests.class, // AllMiRnaTests.class, // AllModelsTests.class, // - AllOverlaysTests.class, // ModelMetaDataTest.class, // ProjectRestImplTest.class }) public class AllProjectTests { diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/ProjectRestImplTest.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/ProjectRestImplTest.java index 12a789d393bd4674120a9568735b6ac54bae29e6..0699aadfa0bbbe9acec86e910789e83bb1382c4d 100644 --- a/rest-api/src/test/java/lcsb/mapviewer/api/projects/ProjectRestImplTest.java +++ b/rest-api/src/test/java/lcsb/mapviewer/api/projects/ProjectRestImplTest.java @@ -24,6 +24,7 @@ import lcsb.mapviewer.api.RestTestFunctions; import lcsb.mapviewer.common.exception.InvalidArgumentException; import lcsb.mapviewer.converter.graphics.PdfImageGenerator; import lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser; +import lcsb.mapviewer.model.cache.FileEntry; import lcsb.mapviewer.model.map.MiriamType; import lcsb.mapviewer.model.map.model.Model; import lcsb.mapviewer.services.interfaces.IModelService; @@ -50,7 +51,7 @@ public class ProjectRestImplTest extends RestTestFunctions { } @Test - public void testGetModelAsImage() throws Exception { + public void testGetModelAsImageForInvalidConverter() throws Exception { try { ProjectRestImpl projectRest = createMockProjectRest("testFiles/model/sample.xml"); projectRest.getModelAsImage(token.getId(), "sample", "0", "", "", "", "", ""); @@ -62,6 +63,18 @@ public class ProjectRestImplTest extends RestTestFunctions { } } + @Test + public void testGetModelAsImage() throws Exception { + try { + ProjectRestImpl projectRest = createMockProjectRest("testFiles/model/sample.xml"); + FileEntry result = projectRest.getModelAsImage(token.getId(), "sample", "0", PdfImageGenerator.class.getCanonicalName(), "", "", "", ""); + assertNotNull(result); + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + } + @Test(expected = ObjectNotFoundException.class) public void testGetInvalidMetaData() throws Exception { _projectRestImpl.getMetaData("unknown_model_id", token.getId()); diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementRestImplTest.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementRestImplTest.java index 7da42635f993dc74e3cbeed463dec330876ce993..19cc3a66c98d2cc2f09e10d94d8709cf6831b841 100644 --- a/rest-api/src/test/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementRestImplTest.java +++ b/rest-api/src/test/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementRestImplTest.java @@ -55,7 +55,7 @@ public class ElementRestImplTest extends RestTestFunctions { public void testGetElementsProcessAllColumns() throws Exception { try { ElementsRestImpl projectRest = createMockElementRest("testFiles/model/sample.xml"); - List<Map<String, Object>> result = projectRest.getElements("sample", "", "", "*", token.getId(), ""); + List<Map<String, Object>> result = projectRest.getElements("sample", "", "", "*", token.getId(), "", "", ""); for (Map<String, Object> element : result) { for (String paramName : element.keySet()) { Object val = element.get(paramName); @@ -80,7 +80,7 @@ public class ElementRestImplTest extends RestTestFunctions { try { String proteinType = new GenericProtein("1").getStringType(); ElementsRestImpl elementRest = createMockElementRest("testFiles/model/sample.xml"); - List<Map<String, Object>> result = elementRest.getElements("sample", "", "", "*", token.getId(), proteinType); + List<Map<String, Object>> result = elementRest.getElements("sample", "", "", "*", token.getId(), proteinType, "", ""); assertEquals(12, result.size()); } catch (Exception e) { @@ -93,7 +93,7 @@ public class ElementRestImplTest extends RestTestFunctions { public void testGetElementsVisibility() throws Exception { try { ElementsRestImpl elementRest = createMockElementRest("testFiles/model/sample.xml"); - List<Map<String, Object>> result = elementRest.getElements("sample", "", "", "*", token.getId(), ""); + List<Map<String, Object>> result = elementRest.getElements("sample", "", "", "*", token.getId(), "", "", ""); for (Map<String, Object> map : result) { assertTrue(map.get("hierarchyVisibilityLevel") instanceof String); } diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/AllOverlaysTests.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/AllOverlaysTests.java deleted file mode 100644 index daf60c8088672175d23a5947536c5a6f62a42f8d..0000000000000000000000000000000000000000 --- a/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/AllOverlaysTests.java +++ /dev/null @@ -1,11 +0,0 @@ -package lcsb.mapviewer.api.projects.overlays; - -import org.junit.runner.RunWith; -import org.junit.runners.Suite; -import org.junit.runners.Suite.SuiteClasses; - -@RunWith(Suite.class) -@SuiteClasses({ }) -public class AllOverlaysTests { - -}