diff --git a/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/AnnotatorParamDefinition.java b/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/AnnotatorParamDefinition.java index c3c3bda40c3f482c05713c8be1fd18f2a8e69233..3d13f4181e468d27339e7b810b281ec99bfa6e7a 100644 --- a/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/AnnotatorParamDefinition.java +++ b/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/AnnotatorParamDefinition.java @@ -13,7 +13,7 @@ public class AnnotatorParamDefinition { private Class<?> type; - public AnnotatorParamDefinition(String name, String decription, Class<?> type) { + public AnnotatorParamDefinition(String name, Class<?> type, String decription) { super(); this.name = name; this.decription = decription; diff --git a/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/BrendaAnnotator.java b/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/BrendaAnnotator.java index 75bc68e62ffb04467504ecf8851bf199f7290ac1..a3df6fdc1a2a56dd9893eea4a9a1007562f77e3a 100644 --- a/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/BrendaAnnotator.java +++ b/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/BrendaAnnotator.java @@ -3,9 +3,7 @@ package lcsb.mapviewer.annotation.services.annotators; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; -import java.util.HashSet; import java.util.List; -import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.log4j.Logger; @@ -17,7 +15,6 @@ import lcsb.mapviewer.annotation.cache.WebPageDownloader; import lcsb.mapviewer.annotation.services.ExternalServiceStatus; import lcsb.mapviewer.annotation.services.ExternalServiceStatusType; import lcsb.mapviewer.annotation.services.IExternalService; -import lcsb.mapviewer.annotation.services.WrongResponseCodeIOException; import lcsb.mapviewer.common.exception.InvalidArgumentException; import lcsb.mapviewer.model.map.BioEntity; import lcsb.mapviewer.model.map.MiriamData; @@ -46,11 +43,6 @@ public class BrendaAnnotator extends ElementAnnotator implements IExternalServic @Autowired private TairAnnotator tairAnnotator; - /** - * Pattern used for finding EC symbol from UniProt page . - */ - private Pattern uniprotECMatcher = Pattern.compile("EC=((\\d+\\.-\\.-\\.-)|(\\d+\\.\\d+\\.-\\.-)|(\\d+\\.\\d+\\.\\d+\\.-)|(\\d+\\.\\d+\\.\\d+\\.\\d+))"); - /** * Default constructor. */ diff --git a/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/ElementAnnotator.java b/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/ElementAnnotator.java index 763241dd961e300632233ad8c99bc575cca3bf23..a3fe33f3d337c9c841e0905945554c91b0fe64d0 100644 --- a/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/ElementAnnotator.java +++ b/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/ElementAnnotator.java @@ -182,8 +182,7 @@ public abstract class ElementAnnotator extends CachableInterface { /** * Returns list with definitions of the parameters available for this annotator. * @return the parameters {@link AnnotatorParamDefinition} list - */ - + */ public Collection<AnnotatorParamDefinition> getParametersDefinitions(){ return paramsDefs; } @@ -532,6 +531,24 @@ public abstract class ElementAnnotator extends CachableInterface { } } + /** + * Sets definitions of parameters for given annotator. + * @param paramDefs + * definitions to be set + */ + public void setParametersDefinitions(List<AnnotatorParamDefinition> paramDefs){ + this.paramsDefs = paramDefs; + } + + /** + * Adds parameter definition to the definitions of parameters for given annotator + * @param paramDef + * parameter definition to be added + */ + public void addParameterDefinition(AnnotatorParamDefinition paramDef){ + this.paramsDefs.add(paramDef); + } + /** * Sets MiriamData.annotator to this annotator * diff --git a/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/HgncAnnotator.java b/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/HgncAnnotator.java index b7cd593c8d99a78aeea7d1b947a28397df869160..c9b04d8a53960a377b4ff7f887942621f0d10f0b 100644 --- a/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/HgncAnnotator.java +++ b/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/HgncAnnotator.java @@ -100,7 +100,7 @@ public class HgncAnnotator extends ElementAnnotator implements IExternalService try { GenericProtein proteinAlias = new GenericProtein("id"); proteinAlias - .addMiriamData(new MiriamData(MiriamRelationType.BQ_BIOL_IS_DESCRIBED_BY, MiriamType.HGNC_SYMBOL, "SNCA")); + .addMiriamData(createMiriamData(MiriamRelationType.BQ_BIOL_IS_DESCRIBED_BY, MiriamType.HGNC_SYMBOL, "SNCA")); annotateElement(proteinAlias); if (proteinAlias.getFullName() == null || proteinAlias.getFullName().equals("")) { @@ -182,16 +182,16 @@ public class HgncAnnotator extends ElementAnnotator implements IExternalService // add hgnc id only when there was no hgnc_id in the element String id = getNodeValue(node); id = id.replaceAll("HGNC:", ""); - element.addMiriamData(new MiriamData(MiriamType.HGNC, id)); + element.addMiriamData(createMiriamData(MiriamType.HGNC, id)); } else if (type.equals("ensembl_gene_id")) { - element.addMiriamData(new MiriamData(MiriamType.ENSEMBL, getNodeValue(node))); + element.addMiriamData(createMiriamData(MiriamType.ENSEMBL, getNodeValue(node))); } else if (type.equals("entrez_id")) { - element.addMiriamData(new MiriamData(MiriamType.ENTREZ, getNodeValue(node))); + element.addMiriamData(createMiriamData(MiriamType.ENTREZ, getNodeValue(node))); } else if (type.equals("symbol")) { if (symbols.size() == 0) { // add hgnc symbol annnotation only when there was no // hgnc_symbol in the element - element.addMiriamData(new MiriamData(MiriamType.HGNC_SYMBOL, getNodeValue(node))); + element.addMiriamData(createMiriamData(MiriamType.HGNC_SYMBOL, getNodeValue(node))); } setSymbol(element, getNodeValue(node), prefix); } else if (type.equals("name")) { @@ -204,7 +204,7 @@ public class HgncAnnotator extends ElementAnnotator implements IExternalService for (int j = 0; j < sublist.getLength(); j++) { Node subnode = sublist.item(j); if (subnode.getNodeType() == Node.ELEMENT_NODE) { - element.addMiriamData(new MiriamData(MiriamType.REFSEQ, getNodeValue(subnode))); + element.addMiriamData(createMiriamData(MiriamType.REFSEQ, getNodeValue(subnode))); } } } else if (type.equals("prev_symbol")) { @@ -232,7 +232,7 @@ public class HgncAnnotator extends ElementAnnotator implements IExternalService for (int j = 0; j < sublist.getLength(); j++) { Node subnode = sublist.item(j); if (subnode.getNodeType() == Node.ELEMENT_NODE) { - element.addMiriamData(new MiriamData(MiriamType.UNIPROT, getNodeValue(subnode))); + element.addMiriamData(createMiriamData(MiriamType.UNIPROT, getNodeValue(subnode))); } } } @@ -316,7 +316,7 @@ public class HgncAnnotator extends ElementAnnotator implements IExternalService Node uniprotNode = uniprotList.item(j); if (uniprotNode.getNodeType() == Node.ELEMENT_NODE) { if (uniprotNode.getNodeName().equals("str")) { - result.add(new MiriamData(MiriamType.UNIPROT, uniprotNode.getTextContent())); + result.add(createMiriamData(MiriamType.UNIPROT, uniprotNode.getTextContent())); } } } @@ -372,7 +372,7 @@ public class HgncAnnotator extends ElementAnnotator implements IExternalService if (node.getNodeName().equals("str")) { String type = getNodeAttr("name", node); if (type.equals("symbol")) { - return new MiriamData(MiriamType.HGNC_SYMBOL, node.getTextContent()); + return createMiriamData(MiriamType.HGNC_SYMBOL, node.getTextContent()); } } } @@ -444,7 +444,7 @@ public class HgncAnnotator extends ElementAnnotator implements IExternalService String type = getNodeAttr("name", node); if (type.equals("entrez_id")) { String id = getNodeValue(node); - return new MiriamData(MiriamType.ENTREZ, id); + return createMiriamData(MiriamType.ENTREZ, id); } } } diff --git a/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/KeggAnnotator.java b/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/KeggAnnotator.java index 99a67fdf12b230aa5ed10716ce3be62c63ac8602..d02dab68420999703a8bf06da4fb3df3754883a1 100644 --- a/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/KeggAnnotator.java +++ b/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/KeggAnnotator.java @@ -66,6 +66,13 @@ public class KeggAnnotator extends ElementAnnotator implements IExternalService */ public KeggAnnotator() { super(KeggAnnotator.class, new Class[] { Protein.class, Gene.class, Rna.class }, false); + AnnotatorParamDefinition paramDef = new AnnotatorParamDefinition( + "KEGG organism identifier", + String.class, + "Space-delimited list of organisms codes for which homologous genes" + + " (GENE section in the KEGG enzyme record) should be imported." + + " Currently ATH (Arabidopsis Thaliana) is supported."); + this.addParameterDefinition(paramDef); } @Override diff --git a/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/PdbAnnotator.java b/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/PdbAnnotator.java index 3c2c45af31db02c679e38cdfebe7354cf9460041..91599e123b93fed1d8a092df780ce0f17b2517b7 100644 --- a/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/PdbAnnotator.java +++ b/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/PdbAnnotator.java @@ -51,13 +51,6 @@ public class PdbAnnotator extends ElementAnnotator implements IExternalService { */ private ElementUtils elementUtils = new ElementUtils(); - /** - * Service used for annotation of proteins using {@link MiriamType#UNIPROT - * uniprot}. - */ - @Autowired - private UniprotAnnotator uniprotAnnotator; - /** * Service used for annotation of proteins using {@link MiriamType#HGNC * hgnc} (this can include lookup and loading annotation from {@link diff --git a/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/TairAnnotator.java b/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/TairAnnotator.java index 9dcac43bcde09b02bc3797f31ee10219c60f9b13..6a39ecd3b35f1fc8ea788e680bed675f481c0235 100644 --- a/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/TairAnnotator.java +++ b/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/TairAnnotator.java @@ -186,7 +186,7 @@ public class TairAnnotator extends ElementAnnotator implements IExternalService @Override public String getCommonName() { - return MiriamType.TAIR_LOCUS.getCommonName(); + return "TAIR"; } @Override diff --git a/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/AllAnnotatorTests.java b/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/AllAnnotatorTests.java index 96735e6957fb8682aa42780c29155642fc7185fe..5ac4db041ce95c39da38cad1fc1a6ad4b029fb0c 100644 --- a/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/AllAnnotatorTests.java +++ b/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/AllAnnotatorTests.java @@ -17,6 +17,7 @@ import org.junit.runners.Suite.SuiteClasses; GoAnnotatorTest.class, // HgncAnnotatorTest.class, // KeggAnnotatorTest.class, // + MultipleAnnotatorsTest.class, // PdbAnnotatorTest.class, // ReconAnnotatorTest.class, // StitchAnnotatorTest.class, // diff --git a/frontend-js/src/main/css/global.css b/frontend-js/src/main/css/global.css index 7d91c173bfbdfb008505e08b85fcf666f617ad75..d599f5b6cac82fa4a882af8668287d97aaedce1e 100644 --- a/frontend-js/src/main/css/global.css +++ b/frontend-js/src/main/css/global.css @@ -530,3 +530,55 @@ h1 { } +.minerva-annotators-params { + margin-top: 10px; + border: 1px #ddd solid; +} + +.minerva-annotator-params { + padding: 5px; + +} +.minerva-annotator-params-header { + font-weight: bold; + text-align: center; + padding-bottom: 5px; +} +.minerva-annotator-param { + display: table; + width: 100%; + +} + +.minerva-annotator-param-name { + display: table-cell; + vertical-align: middle; + width: 30%; + padding-right: 5px; + +} + +.minerva-annotator-param-value { + display: table-cell; + width: 70%; +} + +.minerva-annotator-param-value textarea { + width: 100%; + height: 100px; +} + +.minerva-annotators-params-header { + position: relative +} + +.minerva-annotators-params-header>div { + position: absolute; + left: 20px; + top: -11px; + background-color: white; + padding-left: 10px; + padding-right: 10px; + font-weight: bold; +} + diff --git a/frontend-js/src/main/js/Functions.js b/frontend-js/src/main/js/Functions.js index a369f12974ae1b005a4bbfd76d565d6cff8ae492..531b1c46d90b90a23caa1138af6a562261c0e509 100644 --- a/frontend-js/src/main/js/Functions.js +++ b/frontend-js/src/main/js/Functions.js @@ -261,6 +261,9 @@ Functions.createElement = function (params) { if (params.onclick !== null && params.onclick !== undefined) { result.onclick = params.onclick; } + if (params.onchange !== null && params.onchange !== undefined) { + result.onchange = params.onchange; + } if (params.href !== null && params.href !== undefined) { result.href = params.href; } diff --git a/frontend-js/src/main/js/gui/admin/ChooseAnnotatorsDialog.js b/frontend-js/src/main/js/gui/admin/ChooseAnnotatorsDialog.js index d4109916dd2dfb595238eb873128b684fa561e22..984e66b20f039ef169f4204aa2f78e36e5ea0b86 100644 --- a/frontend-js/src/main/js/gui/admin/ChooseAnnotatorsDialog.js +++ b/frontend-js/src/main/js/gui/admin/ChooseAnnotatorsDialog.js @@ -7,6 +7,8 @@ var DualListbox = require('dual-listbox').DualListbox; var GuiConnector = require("../../GuiConnector"); var UserPreferences = require("../../map/data/UserPreferences"); +var InvalidArgumentError = require ('../../InvalidArgumentError'); + var Functions = require('../../Functions'); var logger = require('../../logger'); @@ -33,15 +35,40 @@ ChooseAnnotatorsDialog.prototype.createGui = function () { content: "<div name='elementTree'/>" })); - content.appendChild(Functions.createElement({ + var annotatorsDiv = Functions.createElement({ type: "div", - style: "display:table-cell", - content: "<div name='annotatorListBox'/>" + style: "display:table-cell" + }); + + annotatorsDiv.appendChild(Functions.createElement({ + type: "div", + name: "annotatorListBox" + })); + + annotatorsDiv.appendChild(Functions.createElement({ + type: "div", + className: "minerva-annotators-params" })); + content.appendChild(annotatorsDiv); + self.getElement().appendChild(content); }; +function onChangeParameterValue(element, user){ + var value = element; + var name = $(element).siblings(".minerva-annotator-param-name").text(); + var annotatorClassName = $(element).parent().parent().attr('name'); + + var data = new UserPreferences(); + + var annotatorsParams = {}; + annotatorsParams[annotatorClassName] = {name: value}; + data.setAnnotatorsParameters(annotatorsParams); + return ServerConnector.updateUserPreferences({user: user, preferences: data}).then(null, GuiConnector.alert); + +} + ChooseAnnotatorsDialog.prototype.setElementType = function (elementType) { var self = this; @@ -52,7 +79,9 @@ ChooseAnnotatorsDialog.prototype.setElementType = function (elementType) { return ServerConnector.getLoggedUser(); }).then(function (user) { var element = $("[name='annotatorListBox']", self.getElement())[0]; + var annotatorsParams = $(".minerva-annotators-params", self.getElement())[0]; Functions.removeChildren(element); + Functions.removeChildren(annotatorsParams); var selectElement = Functions.createElement({ type: "select", @@ -69,14 +98,76 @@ ChooseAnnotatorsDialog.prototype.setElementType = function (elementType) { for (var j = 0; j < selectedAnnotators.length; j++) { if (annotator.getName() === selectedAnnotators[j]) { selected = true; - } + + var paramsDefs = annotator.getParametersDefinitions(); + if (paramsDefs.length > 0) { + annotatorsParams.appendChild(Functions.createElement({ + type: "div", + className: "minerva-annotators-params-header", + content: '<div>Available parameters</div>' + })) + + var annotatorParams = Functions.createElement({ + type: "div", + className: "minerva-annotator-params", + name: annotator.getClassName() + }); + + annotatorParams.appendChild(Functions.createElement({ + type: "div", + className: "minerva-annotator-params-header", + content: annotator.getName() + })); + + for (var k = 0; k < paramsDefs.length; k++) { + var param = paramsDefs[k]; + var paramElement = Functions.createElement({ + type: "div", + className: "minerva-annotator-param" + }); + + paramElement.appendChild(Functions.createElement({ + type: "div", + className: "minerva-annotator-param-name", + content: param.name + })); + + var paramValue; + if (param.type.indexOf("String") >= 0) { + paramValue = Functions.createElement({ + type: "textarea", + onchange: function(){return onChangeParameterValue(this, user);} + }); + } else if (param.type.indexOf("Integer") >= 0) { + paramValue = Functions.createElement({ + type: "input", + inputType: "number", + onchange: function(){return onChangeParameterValue(this, user);} + }); + } else if (param.type.indexOf("Boolean") >= 0) { + paramValue = Functions.createElement({ + type: "input", + inputType: "checkbox", + onchange: function(){return onChangeParameterValue(this, user);} + }); + } else { + throw new InvalidAlgorithmError("Unknown annotator parameter type"); + } + + paramElement.appendChild(paramValue); + annotatorParams.appendChild(paramElement); + } + + annotatorsParams.appendChild(annotatorParams); + } + } } var option = new Option(); option.value = annotator.getClassName(); option.attributes.selected = selected; option.innerHTML = "<div>" + annotator.getName() + "</div>"; selectElement.appendChild(option); - } + }; element.appendChild(selectElement); new DualListbox(selectElement, { diff --git a/frontend-js/src/main/js/map/data/Annotator.js b/frontend-js/src/main/js/map/data/Annotator.js index 9b821d8e3899a86552c914e0216959afc8dc5578..74d342558aa94e65fa4c5c1c601efd1d371598c0 100644 --- a/frontend-js/src/main/js/map/data/Annotator.js +++ b/frontend-js/src/main/js/map/data/Annotator.js @@ -12,11 +12,13 @@ function Annotator(javaObject, configuration) { self.setClassName(javaObject.getClassName()); this._elementTypes = javaObject.getElementTypes(); self.setName(javaObject.getName()); + self.setParametersDefinitions(javaObject.getParametersDefinitions()); self.setUrl(javaObject.getUrl()); } else { self.setClassName(javaObject.className); self.setElementTypes(javaObject.elementClassNames, configuration); self.setName(javaObject.name); + self.setParametersDefinitions(javaObject.parametersDefinitions); self.setUrl(javaObject.url); } } @@ -45,6 +47,14 @@ Annotator.prototype.getUrl = function () { return this._url; }; +Annotator.prototype.getParametersDefinitions = function () { + return this._parametersDefinitions; +} + +Annotator.prototype.setParametersDefinitions = function (parametersDefinitions) { + this._parametersDefinitions = parametersDefinitions; +} + Annotator.prototype.setElementTypes = function (elementTypesClassNames, configuration) { this._elementTypes = []; var typeByClassName = {}; diff --git a/frontend-js/src/main/js/map/data/UserPreferences.js b/frontend-js/src/main/js/map/data/UserPreferences.js index c3807b066432534e4921bf05360509001d24913a..a6b4383f1528ef7a6dc5b42863c41946f73cc975 100644 --- a/frontend-js/src/main/js/map/data/UserPreferences.js +++ b/frontend-js/src/main/js/map/data/UserPreferences.js @@ -10,11 +10,13 @@ function UserPreferences(javaObject) { this.setElementAnnotators(javaObject["element-annotators"]); this.setElementRequiredAnnotations(javaObject["element-required-annotations"]); this.setElementValidAnnotations(javaObject["element-valid-annotations"]); + this.setAnnotatorsParameters(javaObject["annotators-parameters"]); } else { this._projectUpload = {}; this._elementAnnotators = {}; this._elementRequiredAnnotations = {}; this._elementValidAnnotations = {}; + this._annotatorsParameters = {}; } } @@ -28,10 +30,16 @@ UserPreferences.prototype.setProjectUpload = function (projectUpload) { sbgn: projectUpload["sbgn"] }; }; +UserPreferences.prototype.getAnnotatorsParameters = function () { + return this._annotatorsParameters; +}; +UserPreferences.prototype.setAnnotatorsParameters = function (annotatorsParameters) { + this._annotatorsParameters = annotatorsParameters; +}; UserPreferences.prototype.getProjectUpload = function () { return this._projectUpload; }; -UserPreferences.prototype.setElementAnnotators = function (elementAnnotators) { +UserPreferences.prototype .setElementAnnotators = function (elementAnnotators) { this._elementAnnotators = elementAnnotators; }; UserPreferences.prototype.getElementAnnotators = function (className) { @@ -82,7 +90,8 @@ UserPreferences.prototype.toExport = function () { }, "element-annotators": this._elementAnnotators, "element-valid-annotations": this._elementValidAnnotations, - "element-required-annotations": requiredAnnotations + "element-required-annotations": requiredAnnotations, + "annotators-parameters": this.getAnnotatorsParameters() }; }; diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java index a845b33e098b3681159205abc44eeac57c2f13f9..c87f7a62b88bdb1cb56a431d4efce665f429df1e 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java @@ -157,6 +157,10 @@ public class UserRestImpl extends BaseRestImpl { } } } + + private void updateAnnotatorsParams(UserAnnotationSchema schema, Map<String, Object> data) { + + } private Map<String, Object> prepareRequiredAnnotations(List<UserClassRequiredAnnotations> classRequiredAnnotators) { Map<String, Object> result = new HashMap<>(); @@ -363,6 +367,9 @@ public class UserRestImpl extends BaseRestImpl { for (String key : preferencesData.keySet()) { Map<String, Object> value = (Map<String, Object>) preferencesData.get(key); + + logger.debug(key); + logger.debug(value); if (key.equals("project-upload")) { updateUploadPreferences(schema, value); @@ -372,6 +379,8 @@ public class UserRestImpl extends BaseRestImpl { updateRequiredAnnotations(schema, value); } else if (key.equals("element-valid-annotations")) { updateValidAnnotations(schema, value); + } else if (key.equals("annotators-parameters")) { + updateAnnotatorsParams(schema, value); } else { throw new QueryException("Unknown preferences field: " + key); }