From 37b3208fe8664396af3c34fc08ff48c7474de1f5 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Tue, 20 Jun 2017 14:03:53 +0200
Subject: [PATCH] export to xml improved (additional field data added)

---
 .../annotation/RestAnnotationParser.java      | 96 ++++++++++++++++---
 .../annotation/RestAnnotationParserTest.java  | 12 ++-
 2 files changed, 93 insertions(+), 15 deletions(-)

diff --git a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParser.java b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParser.java
index a1ab11fc4a..ccec089ae5 100644
--- a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParser.java
+++ b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParser.java
@@ -1,6 +1,7 @@
 package lcsb.mapviewer.converter.model.celldesigner.annotation;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -21,6 +22,8 @@ import lcsb.mapviewer.common.comparator.StringSetComparator;
 import lcsb.mapviewer.common.exception.InvalidArgumentException;
 import lcsb.mapviewer.common.exception.InvalidXmlSchemaException;
 import lcsb.mapviewer.common.exception.NotImplementedException;
+import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerElement;
+import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerSpecies;
 import lcsb.mapviewer.model.map.AnnotatedObject;
 import lcsb.mapviewer.model.map.MiriamData;
 import lcsb.mapviewer.model.map.MiriamRelationType;
@@ -100,25 +103,90 @@ public class RestAnnotationParser extends XmlParser {
 	 * @return note string with structural information about element
 	 */
 	public String createAnnotationString(Element element) {
-		String symbol = element.getSymbol();
-		if (symbol == null) {
-			symbol = "";
-		}
-		String name = element.getFullName();
-		if (name == null) {
-			name = "";
-		}
+		return createAnnotationString(element, false);
+	}
+
+	/**
+	 * Creates note string with structural information about element.
+	 * 
+	 * @param element
+	 *          element for which notes are created
+	 * @param forceFullInfo
+	 *          when true annotation string will contain information about empty
+	 *          fields
+	 * @return note string with structural information about element
+	 */
+	public String createAnnotationString(Element element, boolean forceFullInfo) {
+		Set<MiriamData> data = element.getMiriamData();
 		StringBuilder sb = new StringBuilder();
-		sb.append(NoteField.SYMBOL.getCommonName() + ": " + symbol + "\n");
-		sb.append(NoteField.NAME.getCommonName() + ": " + name + "\n");
-		// descrfiption will be in the string anyways so we don't need to repeat it
-		sb.append(NoteField.DESCRIPTION.getCommonName() + ": \n");
-		sb.append(NoteField.PREVIOUS_SYMBOLS.getCommonName() + ": " + StringUtils.join(element.getFormerSymbols(), ", ") + "\n");
-		sb.append(NoteField.SYNONYMS.getCommonName() + ": " + StringUtils.join(element.getSynonyms(), ", ") + "\n");
+		sb.append(createEntry(NoteField.SYMBOL, element.getSymbol(), forceFullInfo));
+		sb.append(createEntry(NoteField.NAME, element.getFullName(), forceFullInfo));
+		sb.append(createEntry(NoteField.PREVIOUS_SYMBOLS, element.getFormerSymbols(), forceFullInfo));
+		sb.append(createEntry(NoteField.SYNONYMS, element.getSynonyms(), forceFullInfo));
+		sb.append(createEntry(NoteField.HGNC, filterMiriam(data, MiriamType.HGNC), forceFullInfo));
+		sb.append(createEntry(NoteField.ENTREZ, filterMiriam(data, MiriamType.ENTREZ), forceFullInfo));
+		sb.append(createEntry(NoteField.REFSEQ, filterMiriam(data, MiriamType.REFSEQ), forceFullInfo));
+		sb.append(createEntry(NoteField.REACTOME, filterMiriam(data, MiriamType.REACTOME), forceFullInfo));
+		sb.append(createEntry(NoteField.PUBMED, filterMiriam(data, MiriamType.PUBMED), forceFullInfo));
+		sb.append(createEntry(NoteField.KEGG_GENES, filterMiriam(data, MiriamType.KEGG_GENES), forceFullInfo));
+		sb.append(createEntry(NoteField.PANTHER, filterMiriam(data, MiriamType.PANTHER), forceFullInfo));
+		sb.append(createEntry(NoteField.DESCRIPTION, null, forceFullInfo));
+		sb.append(createEntry(NoteField.ABBREVIATION, element.getAbbreviation(), forceFullInfo));
+		sb.append(createEntry(NoteField.SEMANTIC_ZOOM_LEVEL_VISIBILITY, element.getSemanticZoomLevelVisibility(), forceFullInfo));
+		sb.append(createEntry(NoteField.CHARGED_FORMULA, element.getFormula(), forceFullInfo));
+		if (element instanceof Species) {
+			sb.append(createEntry(NoteField.CHARGE, ((Species) element).getCharge(), forceFullInfo));
+		}
+
 		sb.append("\n");
 		return sb.toString();
 	}
 
+	private List<MiriamData> filterMiriam(Collection<MiriamData> miriamDataSet, MiriamType type) {
+		List<MiriamData> result = new ArrayList<>();
+		for (MiriamData miriamData : miriamDataSet) {
+			if (miriamData.getDataType().equals(type)) {
+				result.add(miriamData);
+			}
+		}
+		return result;
+	}
+
+	private String createEntry(NoteField type, Object value, boolean forceFullInfo) {
+		if (value == null) {
+			if (forceFullInfo) {
+				return type.getCommonName() + ": \n";
+			} else {
+				return "";
+			}
+		} else if (value instanceof String) {
+			return type.getCommonName() + ": " + value + "\n";
+		} else if (value instanceof Integer) {
+			return type.getCommonName() + ": " + value + "\n";
+		} else if (value instanceof Collection) {
+			Collection<?> collection = (Collection) value;
+			if (collection.size() > 0 || forceFullInfo) {
+				String result = "";
+				for (Object object : collection) {
+					if (!result.equals("")) {
+						result = result + ", ";
+					}
+					if (object instanceof MiriamData) {
+						result += ((MiriamData) object).getResource();
+					} else {
+						result += object;
+					}
+
+				}
+				return type.getCommonName() + ": " + result + "\n";
+			} else {
+				return "";
+			}
+		} else {
+			throw new InvalidArgumentException("Unknown class type: " + value.getClass());
+		}
+	}
+
 	/**
 	 * Returns value for the type of the structurized annotation. Structurized
 	 * annotation is in format:
diff --git a/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParserTest.java b/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParserTest.java
index f8ab6d2d44..6cca1af6e5 100644
--- a/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParserTest.java
+++ b/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParserTest.java
@@ -22,6 +22,7 @@ import org.w3c.dom.Node;
 import lcsb.mapviewer.common.exception.InvalidArgumentException;
 import lcsb.mapviewer.common.exception.NotImplementedException;
 import lcsb.mapviewer.converter.model.celldesigner.CellDesignerTestFunctions;
+import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerElement;
 import lcsb.mapviewer.model.map.AnnotatedObject;
 import lcsb.mapviewer.model.map.MiriamData;
 import lcsb.mapviewer.model.map.MiriamRelationType;
@@ -286,10 +287,19 @@ public class RestAnnotationParserTest extends CellDesignerTestFunctions {
 			GenericProtein element = new GenericProtein("id");
 			element.addFormerSymbol(former1);
 			element.addFormerSymbol(former2);
-			String str = rap.createAnnotationString(element);
+			element.setCharge(1);
+			String str = rap.createAnnotationString(element, true);
+			logger.debug(str);
 			assertTrue(str.contains(former1));
 			assertTrue(str.contains(former2));
 
+			for (NoteField field : NoteField.values()) {
+				if (field.getClazz().isAssignableFrom(element.getClass()) || CellDesignerElement.class.isAssignableFrom(field.getClazz())) {
+					assertTrue("Export string doesn't contain info about: " + field.getCommonName(), str.indexOf(field.getCommonName()) >= 0);
+				}
+
+			}
+
 		} catch (Exception e) {
 			e.printStackTrace();
 			throw e;
-- 
GitLab