From 3724bc1a867c182c949dd045a33c98d2ed5ed400 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Fri, 4 Jan 2019 14:05:07 +0100
Subject: [PATCH] export import of element symbol property added

---
 .../extension/multi/BioEntityFeature.java     |  7 +++++--
 .../multi/MultiPackageNamingUtils.java        |  2 ++
 .../sbml/species/SbmlSpeciesExporter.java     | 20 ++++++++++++++-----
 .../model/sbml/species/SbmlSpeciesParser.java | 14 +++++++++++--
 4 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/extension/multi/BioEntityFeature.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/extension/multi/BioEntityFeature.java
index b34767108a..02dfab98ff 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/extension/multi/BioEntityFeature.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/extension/multi/BioEntityFeature.java
@@ -12,8 +12,11 @@ public enum BioEntityFeature {
       "minerva_position_to_compartment_"), 
   
   SYNONYM("Synonym", null, new Class<?>[] { Element.class },
-      "minerva_synonym_");
-
+      "minerva_synonym_"), 
+  
+  SYMBOL("Symbol", null, new Class<?>[] { Element.class },
+      "minerva_symbol_"); 
+  
   private String featureName;
   private String defaultValue;
   private Class<?>[] properClasses;
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/extension/multi/MultiPackageNamingUtils.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/extension/multi/MultiPackageNamingUtils.java
index eefbd1bd25..1ef585cd49 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/extension/multi/MultiPackageNamingUtils.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/extension/multi/MultiPackageNamingUtils.java
@@ -27,6 +27,8 @@ public final class MultiPackageNamingUtils {
 
   private static final String MINERVA_MODIFICATION_TYPE_PREFIX = "minerva_modification_type_";
 
+  public static final String NULL_REPRESENTATION = "NULL";
+
   /**
    * Returns id of the {@link MultiSpeciesType} for a given minerva class.
    * 
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 d5b7937f4b..9356fb591e 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
@@ -99,6 +99,7 @@ public class SbmlSpeciesExporter extends SbmlElementExporter<Species, org.sbml.j
     assignPostionToCompartmentToMulti(element, multiExtension, speciesType);
     assignElementModificationResiduesToMulti(element, multiExtension, speciesType);
     assignListOfSynonymsToMulti(element, multiExtension, speciesType);
+    assignSymbolToMulti(element, multiExtension, speciesType);
   }
 
   private void assignElementModificationResiduesToMulti(Species element, MultiSpeciesPlugin multiExtension,
@@ -241,16 +242,16 @@ public class SbmlSpeciesExporter extends SbmlElementExporter<Species, org.sbml.j
 
   private PossibleSpeciesFeatureValue getPosibleFeatureIdByName(String featureValueName,
       SpeciesFeatureType speciesFeature) {
-    PossibleSpeciesFeatureValue structuralStateFeatureValue = null;
+    PossibleSpeciesFeatureValue result = null;
     for (PossibleSpeciesFeatureValue value : speciesFeature.getListOfPossibleSpeciesFeatureValues()) {
       if (value.getName().equals(featureValueName)) {
-        structuralStateFeatureValue = value;
+        result = value;
       }
     }
-    if (structuralStateFeatureValue == null) {
-      structuralStateFeatureValue = addPosibleValueToFeature(speciesFeature, featureValueName);
+    if (result == null) {
+      result = addPosibleValueToFeature(speciesFeature, featureValueName);
     }
-    return structuralStateFeatureValue;
+    return result;
   }
 
   private void assignPostionToCompartmentToMulti(Species element, MultiSpeciesPlugin multiExtension,
@@ -269,6 +270,11 @@ public class SbmlSpeciesExporter extends SbmlElementExporter<Species, org.sbml.j
     }
   }
 
+  private void assignSymbolToMulti(Species element, MultiSpeciesPlugin multiExtension,
+      MultiSpeciesType speciesType) {
+    assignValueToFeature(element, multiExtension, speciesType, element.getSymbol(), BioEntityFeature.SYMBOL);
+  }
+
   private void assignValueToFeature(Species element, MultiSpeciesPlugin multiExtension, MultiSpeciesType speciesType,
       String value, BioEntityFeature feature) {
     SpeciesFeatureType structuralStateFeature = getFeature(element.getClass(), speciesType, feature);
@@ -370,6 +376,10 @@ public class SbmlSpeciesExporter extends SbmlElementExporter<Species, org.sbml.j
   }
 
   private PossibleSpeciesFeatureValue addPosibleValueToFeature(SpeciesFeatureType feature, String value) {
+    if (value == null) {
+      value = MultiPackageNamingUtils.NULL_REPRESENTATION;
+    }
+
     PossibleSpeciesFeatureValue result = null;
     for (PossibleSpeciesFeatureValue existingValue : feature.getListOfPossibleSpeciesFeatureValues()) {
       if (existingValue.getName().equals(value)) {
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesParser.java
index b504bb60d5..e34dac0312 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesParser.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesParser.java
@@ -139,12 +139,18 @@ public class SbmlSpeciesParser extends SbmlElementParser<org.sbml.jsbml.Species>
       }
     } else if (MultiPackageNamingUtils.isFeatureId(featureTypeString, BioEntityFeature.POSITION_TO_COMPARTMENT)) {
       if (featureValues.size() != 1) {
-        logger.warn(warnPrefix + "Position to compartment must exactly one value");
+        logger.warn(warnPrefix + "Position to compartment must have exactly one value");
       } else {
         minervaElement.setPositionToCompartment(PositionToCompartment.getByString(featureValues.get(0)));
       }
     } else if (MultiPackageNamingUtils.isFeatureId(featureTypeString, BioEntityFeature.SYNONYM)) {
       minervaElement.setSynonyms(featureValues);
+    } else if (MultiPackageNamingUtils.isFeatureId(featureTypeString, BioEntityFeature.SYMBOL)) {
+      if (featureValues.size() != 1) {
+        logger.warn(warnPrefix + "Symbol must have exactly one value");
+      } else {
+        minervaElement.setSymbol(featureValues.get(0));
+      }
     } else if (MultiPackageNamingUtils.isModificationFeatureId(featureTypeString)) {
       createModificationResidues(minervaElement, speciesType, feature);
     } else {
@@ -160,7 +166,11 @@ public class SbmlSpeciesParser extends SbmlElementParser<org.sbml.jsbml.Species>
       for (SpeciesFeatureValue featureValue : feature.getListOfSpeciesFeatureValues()) {
         PossibleSpeciesFeatureValue possibleSpeciesFeatureValue = featureType.getListOfPossibleSpeciesFeatureValues()
             .get(featureValue.getValue());
-        result.add(possibleSpeciesFeatureValue.getName());
+        if (possibleSpeciesFeatureValue.getName().equals(MultiPackageNamingUtils.NULL_REPRESENTATION)) {
+          result.add(null);
+        } else {
+          result.add(possibleSpeciesFeatureValue.getName());
+        }
       }
     } else {
       for (SpeciesTypeInstance speciesTypeInstance : speciesType.getListOfSpeciesTypeInstances()) {
-- 
GitLab