From a5578611f5ebd2ad4eeb20e59ae14e4b50a2fe84 Mon Sep 17 00:00:00 2001
From: David Hoksza <david.hoksza@uni.lu>
Date: Tue, 23 Jan 2018 14:42:35 +0100
Subject: [PATCH] Implemented paramaters for all annotators + createMiriamData
 for all annotators

---
 .../annotators/AnnotatorParamDefinition.java  | 35 +++++++
 .../services/annotators/ChebiAnnotator.java   |  8 +-
 .../services/annotators/ElementAnnotator.java | 97 ++++++++++++++++++-
 .../services/annotators/EnsemblAnnotator.java |  4 +-
 .../services/annotators/HgncAnnotator.java    |  2 +-
 .../annotators/AllAnnotatorTests.java         |  1 +
 .../annotators/AnnotatorExceptionTest.java    |  6 +-
 .../annotators/AnnotatorParamDefTest.java     | 30 ++++++
 .../annotators/ElementAnnotatorTest.java      |  5 +-
 .../annotators/StitchAnnotatorTest.java       |  2 -
 .../configuration/ConfigurationRestImpl.java  |  1 +
 11 files changed, 177 insertions(+), 14 deletions(-)
 create mode 100644 annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/AnnotatorParamDefinition.java
 create mode 100644 annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/AnnotatorParamDefTest.java

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
new file mode 100644
index 0000000000..c3c3bda40c
--- /dev/null
+++ b/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/AnnotatorParamDefinition.java
@@ -0,0 +1,35 @@
+package lcsb.mapviewer.annotation.services.annotators;
+
+/**
+ * Definition of a single parameter of an annotator.
+ * 
+ * @author David Hoksza
+ * 
+ */
+public class AnnotatorParamDefinition {
+	private String name;
+	
+	private String decription;
+	
+	private Class<?> type;
+
+	public AnnotatorParamDefinition(String name, String decription, Class<?> type) {
+		super();
+		this.name = name;
+		this.decription = decription;
+		this.type = type;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public String getDecription() {
+		return decription;
+	}
+
+	public Class<?> getType() {
+		return type;
+	}	
+
+}
diff --git a/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/ChebiAnnotator.java b/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/ChebiAnnotator.java
index 224ea171fb..b526374026 100644
--- a/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/ChebiAnnotator.java
+++ b/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/ChebiAnnotator.java
@@ -178,14 +178,14 @@ public class ChebiAnnotator extends ElementAnnotator implements IExternalService
           String synonym = dataItem.getData();
           if (synonym.trim().equalsIgnoreCase(name)) {
             setCacheValue("name: " + name, entity.getChebiId());
-            return new MiriamData(MiriamType.CHEBI, entity.getChebiId());
+            return createMiriamData(MiriamType.CHEBI, entity.getChebiId());
           }
         }
         for (DataItem dataItem : entity.getSynonyms()) {
           String synonym = dataItem.getData();
           if (synonym.trim().equalsIgnoreCase(name)) {
             setCacheValue("name: " + name, entity.getChebiId());
-            return new MiriamData(MiriamType.CHEBI, entity.getChebiId());
+            return createMiriamData(MiriamType.CHEBI, entity.getChebiId());
           }
         }
       }
@@ -197,14 +197,14 @@ public class ChebiAnnotator extends ElementAnnotator implements IExternalService
           String formula = dataItem.getData();
           if (formula.trim().equalsIgnoreCase(name)) {
             setCacheValue("name: " + name, entity.getChebiId());
-            return new MiriamData(MiriamType.CHEBI, entity.getChebiId());
+            return createMiriamData(MiriamType.CHEBI, entity.getChebiId());
           }
         }
         for (DataItem dataItem : entity.getSynonyms()) {
           String synonym = dataItem.getData();
           if (synonym.trim().equalsIgnoreCase(name)) {
             setCacheValue("name: " + name, entity.getChebiId());
-            return new MiriamData(MiriamType.CHEBI, entity.getChebiId());
+            return createMiriamData(MiriamType.CHEBI, entity.getChebiId());
           }
         }
       }
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 98da3ebf29..26a8389a2f 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
@@ -44,6 +44,11 @@ public abstract class ElementAnnotator extends CachableInterface {
 	 * Should be this annotator used as a default annotator.
 	 */
 	private boolean																 isDefault		= false;
+	
+	/**
+	 * Parameters which this annotator can be provided. Should be set in constructor.
+	 */
+	protected List<AnnotatorParamDefinition> 											paramsDefs		= new ArrayList<>();
 
 	/**
 	 * Default constructor.
@@ -78,6 +83,22 @@ public abstract class ElementAnnotator extends CachableInterface {
 	 *           data
 	 */
 	public abstract void annotateElement(BioEntity element) throws AnnotatorException;
+	
+	/**
+	 * Annotate element using parameters.
+	 * 
+	 * @param element
+	 *          object to be annotated
+	 * @param parameters
+	 * 			list of parameters passed to the annotator which is expected to
+	 * 			be in the same order as its {@link this#parameterDefs}
+	 * @throws AnnotatorException
+	 *           thrown when there is a problem with annotating not related to
+	 *           data
+	 */
+	public void annotateElement(BioEntity element, List<Object> parameters) throws AnnotatorException {
+		annotateElement(element);
+	}
 
 	/**
 	 * Returns a list of all classes that can be annotated using this annotator.
@@ -130,6 +151,42 @@ public abstract class ElementAnnotator extends CachableInterface {
 	 * @return url
 	 */
 	public abstract String getUrl();
+	
+	
+	/**
+	 * Provides description for {@link ElementAnnotator} and {@link MiriamType} pair
+	 * to be used in the frontend.
+	 * @param mt 
+	 * 		{@link MiriamType} annotated by this annotator.
+	 * @return 
+	 * 		the description
+	 */
+	public String getDescription(MiriamType mt){
+		return "";		
+	}
+
+	/**
+	 * Provides description for {@link ElementAnnotator}, {@link MiriamType} and
+	 * {@link MiriamRelationType} triplet to be used in the frontend.
+	 * @param mt 
+	 * 		{@link MiriamType} annotated by this annotator
+	 * @param relationType
+	 * 		{@link MiriamRelationType} annotated by this annotator.
+	 * @return
+	 * 		the description
+	 */
+	public String getDescription(MiriamType mt, MiriamRelationType relationType){
+		return "";		
+	}
+	
+	/**
+	 * Returns list with definitions of the parameters available for this annotator.
+	 * @return the parameters {@link AnnotatorParamDefinition} list
+	 */
+	
+	public Collection<AnnotatorParamDefinition> getParametersDefinitions(){
+		return paramsDefs;
+	}
 
 	/**
 	 * Returns <code>true</code> if this annotator can annotate the object of
@@ -475,33 +532,69 @@ public abstract class ElementAnnotator extends CachableInterface {
 		}
 	}
 	
+	/**
+	 * Sets MiriamData.annotator to this annotator
+	 * 
+	 * @param md
+	 *		data for which the annotator is to be set
+	 */
 	private void setAnnotator(MiriamData md){
 		md.setAnnotator(this.getClass());		
 	}
 	
+	/**
+	 * Creates {@link MiriamData} and sets its annotator to this annotator
+	 * @return
+	 * 		created {@link MiriamData}
+	 */
 	protected MiriamData createMiriamData(){
 		MiriamData md = new MiriamData();
 		setAnnotator(md);
 		return md;		
 	}
 	
+	/**
+	 * Creates {@link MiriamData} and sets its annotator to this annotator
+	 * @param _md
+	 * 		{@link MiriamData} based on which the new {@link MiriamData} should be created
+	 * @return
+	 * 		created {@link MiriamData}
+	 */
 	protected MiriamData createMiriamData(MiriamData _md){
 		MiriamData md = new MiriamData(_md);
 		setAnnotator(md);
 		return md;		
 	}
 	
+	/**
+	 * Creates {@link MiriamData} and sets its annotator to this annotator
+	 * @param mt
+	 * 		{@link MiriamType} to be set
+	 * @param resource
+	 * 		resource to be set
+	 * @return
+	 * 		created {@link MiriamData}
+	 */
 	protected MiriamData createMiriamData(MiriamType mt, String resource){
 		MiriamData md = new MiriamData(mt, resource);
 		setAnnotator(md);
 		return md;		
 	}
 	
+	/**
+	 * Creates {@link MiriamData} and sets its annotator to this annotator
+	 * @param relationType
+	 * 		{@link MiriamRelationType} to be set
+	 * @param mt
+	 * 		{@link MiriamType} to be set
+	 * @param resource
+	 * 		resource to be set
+	 * @return
+	 * 		created {@link MiriamData}
+	 */
 	protected MiriamData createMiriamData(MiriamRelationType relationType, MiriamType mt, String resource){
 		MiriamData md = new MiriamData(relationType, mt, resource);
 		setAnnotator(md);
 		return md;		
 	}	
-	
-
 }
diff --git a/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/EnsemblAnnotator.java b/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/EnsemblAnnotator.java
index 2a680742e7..65d3eebe51 100644
--- a/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/EnsemblAnnotator.java
+++ b/annotation/src/main/java/lcsb/mapviewer/annotation/services/annotators/EnsemblAnnotator.java
@@ -230,11 +230,11 @@ public class EnsemblAnnotator extends ElementAnnotator implements IExternalServi
 							String hgncId = super.getNodeAttr("primary_id", node);
 							if (hgncId != null && !hgncId.isEmpty()) {
 								hgncId = hgncId.replaceAll("HGNC:", "");
-								annotatedObject.addMiriamData(new MiriamData(MiriamType.HGNC, hgncId));
+								annotatedObject.addMiriamData(createMiriamData(MiriamType.HGNC, hgncId));
 							}
 							String hgncSymbol = super.getNodeAttr("display_id", node);
 							if (hgncSymbol != null && !hgncSymbol.isEmpty()) {
-								annotatedObject.addMiriamData(new MiriamData(MiriamType.HGNC_SYMBOL, hgncSymbol));
+								annotatedObject.addMiriamData(createMiriamData(MiriamType.HGNC_SYMBOL, hgncSymbol));
 							}
 							NodeList synonymNodeList = node.getChildNodes();
 
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 b1b4678ce8..a8b5d0184f 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
@@ -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)));
                     }
                   }
                 }
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 0bd9c6f3f8..8490ffda2b 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
@@ -6,6 +6,7 @@ import org.junit.runners.Suite.SuiteClasses;
 
 @RunWith(Suite.class)
 @SuiteClasses({ AnnotatorExceptionTest.class, //
+		AnnotatorParamDefTest.class, //
 		BrendaAnnotatorTest.class, //
 		BiocompendiumAnnotatorTest.class, //
 		CazyAnnotatorTest.class, //
diff --git a/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/AnnotatorExceptionTest.java b/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/AnnotatorExceptionTest.java
index c8ecdc1029..a18773f47d 100644
--- a/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/AnnotatorExceptionTest.java
+++ b/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/AnnotatorExceptionTest.java
@@ -23,8 +23,10 @@ public class AnnotatorExceptionTest {
 
 	@Test
 	public void testConstructor() {
-		AnnotatorException e = new AnnotatorException("messss");
-		assertEquals("messss",e.getMessage());
+		AnnotatorParamDefinition d = new AnnotatorParamDefinition("name", "description", String.class);
+		assertEquals(d.getName(), "name");
+		assertEquals(d.getDecription(), "description");
+		assertEquals(d.getType(), String.class);
 	}
 
 }
diff --git a/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/AnnotatorParamDefTest.java b/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/AnnotatorParamDefTest.java
new file mode 100644
index 0000000000..90682ba6e3
--- /dev/null
+++ b/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/AnnotatorParamDefTest.java
@@ -0,0 +1,30 @@
+package lcsb.mapviewer.annotation.services.annotators;
+
+import static org.junit.Assert.*;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AnnotatorParamDefTest {
+
+	@AfterClass
+	public static void tearDownAfterClass() throws Exception {
+	}
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testConstructor() {
+		AnnotatorException e = new AnnotatorException("messss");
+		assertEquals("messss",e.getMessage());
+	}
+
+}
diff --git a/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/ElementAnnotatorTest.java b/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/ElementAnnotatorTest.java
index f4c613ca90..bf0e806a68 100644
--- a/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/ElementAnnotatorTest.java
+++ b/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/ElementAnnotatorTest.java
@@ -225,6 +225,9 @@ public class ElementAnnotatorTest extends AnnotationTestFunctions {
 		assertEquals(md2.getAnnotator(), annotator.getClass());
 	}
 	
-	
+	@Test
+	public void testEmptyParamsDefs() {
+		assertEquals(annotator.getParametersDefinitions().size(), 0);
+	}
 
 }
diff --git a/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/StitchAnnotatorTest.java b/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/StitchAnnotatorTest.java
index 2016f4875e..b3d3e31e77 100644
--- a/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/StitchAnnotatorTest.java
+++ b/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/StitchAnnotatorTest.java
@@ -87,8 +87,6 @@ public class StitchAnnotatorTest extends AnnotationTestFunctions {
 
 			assertEquals(1, bioEntity.getMiriamData().size());
 
-			assertEquals(1, getWarnings().size());
-
 		} catch (Exception e) {
 			e.printStackTrace();
 			throw e;
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 581b00bb73..0ca63135b5 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
@@ -247,6 +247,7 @@ public class ConfigurationRestImpl extends BaseRestImpl {
     result.put("name", annotator.getCommonName());
     result.put("url", annotator.getUrl());
     result.put("elementClassNames", annotator.getValidClasses());
+    result.put("parametersDefinitions", annotator.getParametersDefinitions());
     return result;
   }
 
-- 
GitLab