From 0e9f18f5c9ae54ce97be10d4074579cace70a678 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Wed, 7 Feb 2018 18:02:43 +0100
Subject: [PATCH] export of modifier type added

---
 .../sbml/reaction/SBOTermModifierType.java    | 24 +++++++-
 .../sbml/reaction/SbmlReactionExporter.java   |  4 ++
 .../sbml/reaction/SbmlReactionParser.java     | 55 ++++++++++---------
 .../sbml/GenericSbmlToXmlParserTest.java      |  3 +-
 .../sbml/species/SbmlSpeciesParserTest.java   |  2 +
 5 files changed, 59 insertions(+), 29 deletions(-)

diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SBOTermModifierType.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SBOTermModifierType.java
index 605f4b8c5f..580deecbb6 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SBOTermModifierType.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SBOTermModifierType.java
@@ -1,7 +1,7 @@
 package lcsb.mapviewer.converter.model.sbml.reaction;
 
-import java.util.HashSet;
-import java.util.Set;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.log4j.Logger;
 
@@ -19,7 +19,7 @@ public enum SBOTermModifierType {
   ;
 
   private static Logger logger = Logger.getLogger(SBOTermModifierType.class);
-  private Set<String> sboTerms = new HashSet<>();
+  private List<String> sboTerms = new ArrayList<>();
   Class<? extends Modifier> clazz;
 
   private SBOTermModifierType(Class<? extends Modifier> clazz, String[] inputSboTerms) {
@@ -47,4 +47,22 @@ public enum SBOTermModifierType {
     }
     return result;
   }
+
+  public static String getTermByType(Class<? extends Modifier> clazz) {
+    for (SBOTermModifierType term : values()) {
+      if (clazz.equals(term.clazz)) {
+        return term.getSBO();
+      }
+    }
+    logger.warn("Cannot find SBO term for class: " + clazz);
+    return null;
+  }
+
+  private String getSBO() {
+    if (sboTerms.size() != 0) {
+      return sboTerms.get(0);
+    }
+    logger.warn("Cannot find SBO term for class: " + clazz);
+    return null;
+  }
 }
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporter.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporter.java
index 67e1391847..ef9da4db73 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporter.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporter.java
@@ -78,6 +78,10 @@ public class SbmlReactionExporter extends SbmlBioEntityExporter<Reaction, org.sb
       Species sbmlSymbol = speciesExporter.getSbmlElementByElementId(modifier.getElement().getElementId());
       SimpleSpeciesReference speciesReference = result.createModifier(sbmlSymbol);
       speciesReferenceByReactionNode.put(modifier, speciesReference);
+      String term = SBOTermModifierType.getTermByType(modifier.getClass());
+      if (term != null) {
+        speciesReference.setSBOTerm(term);
+      }
     }
     if (reaction.getKinetics() != null) {
       result.setKineticLaw(createKineticLaw(reaction));
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionParser.java
index 876a08866d..af039111eb 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionParser.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionParser.java
@@ -109,32 +109,33 @@ public class SbmlReactionParser extends SbmlBioEntityParser {
           SpeciesGlyph speciesGlyph = layout.getSpeciesGlyph(speciesRefernceGlyph.getSpeciesGlyph());
           ReactionNode minervaNode = null;
           Class<? extends ReactionNode> nodeClass = null;
-          switch (speciesRefernceGlyph.getRole()) {
-          case ACTIVATOR:
-            nodeClass = Trigger.class;
-            break;
-          case INHIBITOR:
-            nodeClass = Inhibition.class;
-            break;
-          case MODIFIER:
-            nodeClass = Modulation.class;
-            break;
-          case PRODUCT:
-            nodeClass = Product.class;
-            break;
-          case SIDEPRODUCT:
-            nodeClass = Product.class;
-            break;
-          case SIDESUBSTRATE:
-            nodeClass = Reactant.class;
-            break;
-          case SUBSTRATE:
-            nodeClass = Reactant.class;
-            break;
-          case UNDEFINED:
-            nodeClass = null;
-            break;
+          if (speciesRefernceGlyph.getRole() != null) {
+            switch (speciesRefernceGlyph.getRole()) {
+            case ACTIVATOR:
+              nodeClass = Trigger.class;
+              break;
+            case INHIBITOR:
+              nodeClass = Inhibition.class;
+              break;
+            case PRODUCT:
+              nodeClass = Product.class;
+              break;
+            case SIDEPRODUCT:
+              nodeClass = Product.class;
+              break;
+            case SIDESUBSTRATE:
+              nodeClass = Reactant.class;
+              break;
+            case SUBSTRATE:
+              nodeClass = Reactant.class;
+              break;
+            case UNDEFINED:
+            case MODIFIER:
+              nodeClass = null;
+              break;
+            }
           }
+
           if (reactionWithLayout.isReversible() && (nodeClass == Reactant.class || nodeClass == Product.class)) {
             nodeClass = null;
           }
@@ -148,7 +149,11 @@ public class SbmlReactionParser extends SbmlBioEntityParser {
               }
             }
           }
+          if (nodeClass == Modifier.class) {
+            nodeClass = Modulation.class;
+          }
           if (minervaNode == null) {
+            logger.debug(nodeClass);
             throw new InvalidInputDataExecption(
                 "Cannot find reaction node for layouted reaction: " + speciesGlyph.getSpecies() + ", " + glyph.getId());
           }
diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/GenericSbmlToXmlParserTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/GenericSbmlToXmlParserTest.java
index 4b17dfa771..c3f9c5bfa6 100644
--- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/GenericSbmlToXmlParserTest.java
+++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/GenericSbmlToXmlParserTest.java
@@ -53,6 +53,7 @@ public class GenericSbmlToXmlParserTest {
   @Test
   public void toXmlModelTest() throws Exception {
     try {
+
       String dir = Files.createTempDirectory("sbgn-temp-images-dir").toFile().getAbsolutePath();
 
       IConverter converter = new SbmlParser();
@@ -64,7 +65,7 @@ public class GenericSbmlToXmlParserTest {
           + filePath.getFileName().toString().substring(0, filePath.getFileName().toString().indexOf(".xml"));
       String xmlFilePath = pathWithouExtension.concat(".xml");
       converter.exportModelToFile(model, xmlFilePath);
-      
+
       Model model2 = converter.createModel(new ConverterParams().filename(xmlFilePath));
       model2.setName(null);
 
diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesParserTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesParserTest.java
index 2a049eecec..c82b00a7e4 100644
--- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesParserTest.java
+++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesParserTest.java
@@ -6,6 +6,7 @@ import java.io.FileNotFoundException;
 
 import org.apache.log4j.Logger;
 import org.junit.Test;
+import org.sbml.jsbml.SBMLDocument;
 
 import lcsb.mapviewer.converter.ConverterParams;
 import lcsb.mapviewer.converter.InvalidInputDataExecption;
@@ -128,4 +129,5 @@ public class SbmlSpeciesParserTest {
     assertTrue(element instanceof Unknown);
   }
 
+
 }
-- 
GitLab