From 399e0c4c1186eeaddcbe5089a3518b8f0a656aa7 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Mon, 31 Dec 2018 10:35:01 +0100
Subject: [PATCH] multi species type is exported

---
 .../model/sbml/SbmlBioEntityExporter.java     |  5 +++
 .../sbml/species/SbmlSpeciesExporter.java     | 17 ++++++++--
 .../model/sbml/SbmlExporterTest.java          | 32 +++++++++++++++++++
 3 files changed, 52 insertions(+), 2 deletions(-)

diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporter.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporter.java
index e28c802f96..62d6d3ab7c 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporter.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporter.java
@@ -14,6 +14,7 @@ import org.apache.log4j.Logger;
 import org.sbml.jsbml.Model;
 import org.sbml.jsbml.ext.layout.AbstractReferenceGlyph;
 import org.sbml.jsbml.ext.layout.Layout;
+import org.sbml.jsbml.ext.multi.MultiModelPlugin;
 import org.sbml.jsbml.ext.render.ColorDefinition;
 import org.sbml.jsbml.ext.render.LocalRenderInformation;
 import org.sbml.jsbml.ext.render.LocalStyle;
@@ -151,6 +152,10 @@ public abstract class SbmlBioEntityExporter<T extends BioEntity, S extends org.s
     return null;
   }
 
+  protected MultiModelPlugin getMultiPlugin() {
+    return (MultiModelPlugin) sbmlModel.getExtension("multi");
+  }
+
   protected lcsb.mapviewer.model.map.model.Model getMinervaModel() {
     return minervaModel;
   }
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporter.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporter.java
index 7cbc779867..f72ce30209 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporter.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporter.java
@@ -6,6 +6,8 @@ import java.util.List;
 import org.apache.log4j.Logger;
 import org.sbml.jsbml.ext.layout.AbstractReferenceGlyph;
 import org.sbml.jsbml.ext.layout.Layout;
+import org.sbml.jsbml.ext.multi.MultiSpeciesPlugin;
+import org.sbml.jsbml.ext.multi.MultiSpeciesType;
 import org.sbml.jsbml.ext.render.LocalStyle;
 
 import lcsb.mapviewer.converter.model.sbml.SbmlElementExporter;
@@ -15,13 +17,13 @@ import lcsb.mapviewer.model.map.InconsistentModelException;
 import lcsb.mapviewer.model.map.species.Species;
 
 public class SbmlSpeciesExporter extends SbmlElementExporter<Species, org.sbml.jsbml.Species> {
-  
+
   /**
    * Default class logger.
    */
   @SuppressWarnings("unused")
   private static Logger logger = Logger.getLogger(SbmlSpeciesExporter.class);
-  
+
   private SbmlCompartmentExporter compartmentExporter;
 
   public SbmlSpeciesExporter(Layout layout,
@@ -49,9 +51,20 @@ public class SbmlSpeciesExporter extends SbmlElementExporter<Species, org.sbml.j
     if (element.getConstant() != null) {
       result.setConstant(element.getConstant());
     }
+    if (isExtensionEnabled(SbmlExtension.MULTI)) {
+      MultiSpeciesPlugin multiExtension = new MultiSpeciesPlugin(result);
+      multiExtension.setSpeciesType(getMultiSpeciesType(element));
+      result.addExtension("multi", multiExtension);
+    }
     return result;
   }
 
+  private String getMultiSpeciesType(Species element) {
+    MultiSpeciesType speciesType = getMultiPlugin()
+        .getSpeciesType("minerva_species_type_" + element.getClass().getSimpleName());
+    return speciesType.getId();
+  }
+
   @Override
   protected AbstractReferenceGlyph createElementGlyph(String sbmlElementId, String glyphId) {
     AbstractReferenceGlyph speciesGlyph = getLayout().createSpeciesGlyph(glyphId, sbmlElementId);
diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlExporterTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlExporterTest.java
index 44b0b66d7c..65b86191f8 100644
--- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlExporterTest.java
+++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlExporterTest.java
@@ -21,6 +21,7 @@ import org.junit.Test;
 import org.reflections.Reflections;
 import org.sbml.jsbml.SBMLDocument;
 import org.sbml.jsbml.ext.multi.MultiModelPlugin;
+import org.sbml.jsbml.ext.multi.MultiSpeciesPlugin;
 import org.sbml.jsbml.ext.multi.MultiSpeciesType;
 import org.sbml.jsbml.ext.multi.PossibleSpeciesFeatureValue;
 import org.sbml.jsbml.ext.multi.SpeciesFeatureType;
@@ -537,4 +538,35 @@ public class SbmlExporterTest {
     }
   }
 
+  @Test
+  public void testMultiExtensionTypeDefinition() throws Exception {
+    String structuralState = "xxx";
+    Model model = createEmptyModel();
+    GenericProtein element = new GenericProtein("id");
+    element.setName("test name");
+    element.setX(10);
+    element.setWidth(10);
+    element.setY(10);
+    element.setHeight(10);
+    element.setStructuralState(structuralState);
+    model.addElement(element);
+    org.sbml.jsbml.Model sbmlModel = exporter.toSbmlDocument(model).getModel();
+
+    MultiModelPlugin multiPlugin = (MultiModelPlugin) sbmlModel.getExtension("multi");
+
+    org.sbml.jsbml.Species sbmlSpecies = sbmlModel.getSpecies(0);
+    MultiSpeciesPlugin speciesExtension = (MultiSpeciesPlugin) sbmlSpecies.getExtension("multi");
+    assertNotNull("Multi extension not defined for species", speciesExtension);
+    String speciesTypeString = speciesExtension.getSpeciesType();
+
+    MultiSpeciesType speciesType = null;
+    for (MultiSpeciesType type : multiPlugin.getListOfSpeciesTypes()) {
+      if (type.getId().equals(speciesTypeString)) {
+        speciesType = type;
+      }
+    }
+    assertNotNull("Species type is not set in multi extension", speciesType);
+
+  }
+
 }
-- 
GitLab