From 24e9d06d245b661cd89f6839496f5a033a505275 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Wed, 2 Jan 2019 15:52:03 +0100
Subject: [PATCH] adding modification residues is class dependent (there is no
 possibil;ity to add invalid residue type)

---
 .../structure/CellDesignerAntisenseRna.java   | 18 +++++++++--
 .../structure/CellDesignerGene.java           | 22 +++++++++++--
 .../structure/CellDesignerProtein.java        | 18 ++++++++---
 .../structure/CellDesignerRna.java            | 20 +++++++++---
 .../structure/SpeciesStateTest.java           |  4 +--
 .../model/sbgnml/SbgnmlXmlParser.java         |  2 +-
 .../model/sbgnml/SbgnmlXmlParserTest2.java    |  2 +-
 .../element/species/SpeciesConverterTest.java |  2 +-
 .../model/sbml/SbmlExporterTest.java          | 31 +++++++++++++++++++
 .../model/map/species/AntisenseRna.java       | 23 +++++++++++---
 .../mapviewer/model/map/species/Gene.java     | 22 ++++++++++++-
 .../mapviewer/model/map/species/Protein.java  | 14 +++++++--
 .../lcsb/mapviewer/model/map/species/Rna.java | 23 +++++++++++---
 .../field/AbstractSiteModification.java       |  4 +++
 .../species/field/ModificationResidue.java    |  4 +++
 .../model/map/species/field/Residue.java      |  4 +++
 .../species/AntisenseRnaComparatorTest.java   |  2 +-
 .../model/map/species/AntisenseRnaTest.java   |  2 +-
 .../model/map/species/GeneComparatorTest.java | 12 +++----
 .../mapviewer/model/map/species/GeneTest.java |  2 +-
 .../map/species/ProteinComparatorTest.java    |  2 +-
 .../model/map/species/RnaComparatorTest.java  |  2 +-
 .../mapviewer/model/map/species/RnaTest.java  |  2 +-
 .../wikipathway/XML/ModelContructor.java      |  4 +--
 .../persist/dao/map/CommentDaoTest.java       |  4 +--
 .../persist/dao/map/LayoutDaoTest.java        |  2 +-
 .../persist/dao/map/ModelDaoTest.java         |  2 +-
 .../dao/map/layout/alias/AliasDaoTest2.java   |  6 ++--
 .../map/layout/alias/AntisenseRnaTest.java    |  2 +-
 .../persist/dao/map/layout/alias/RnaTest.java |  2 +-
 .../elements/ElementRestImplTest.java         |  6 ++--
 31 files changed, 210 insertions(+), 55 deletions(-)

diff --git a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerAntisenseRna.java b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerAntisenseRna.java
index 9ad77efd72..1e2809aa35 100644
--- a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerAntisenseRna.java
+++ b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerAntisenseRna.java
@@ -5,10 +5,15 @@ import java.util.List;
 
 import org.apache.log4j.Logger;
 
+import lcsb.mapviewer.common.exception.InvalidArgumentException;
 import lcsb.mapviewer.common.exception.NotImplementedException;
 import lcsb.mapviewer.converter.model.celldesigner.structure.fields.CellDesignerModificationResidue;
 import lcsb.mapviewer.model.map.species.AntisenseRna;
 import lcsb.mapviewer.model.map.species.Species;
+import lcsb.mapviewer.model.map.species.field.CodingRegion;
+import lcsb.mapviewer.model.map.species.field.ModificationResidue;
+import lcsb.mapviewer.model.map.species.field.ModificationSite;
+import lcsb.mapviewer.model.map.species.field.ProteinBindingDomain;
 
 /**
  * Class representing CellDesigner {@link AntisenseRna}.
@@ -140,9 +145,18 @@ public class CellDesignerAntisenseRna extends CellDesignerSpecies<AntisenseRna>
   }
 
   @Override
-  public void updateModelElementAfterLayoutAdded(Species element) {
+  public void updateModelElementAfterLayoutAdded(AntisenseRna antisenseRna) {
     for (CellDesignerModificationResidue region : regions) {
-      ((AntisenseRna) element).addRegion(region.createModificationResidue(element));
+      ModificationResidue mr = region.createModificationResidue(antisenseRna);
+      if (mr instanceof CodingRegion) {
+        antisenseRna.addCodingRegion((CodingRegion) mr);
+      } else if (mr instanceof ModificationSite) {
+        antisenseRna.addModificationSite((ModificationSite) mr);
+      } else if (mr instanceof ProteinBindingDomain) {
+        antisenseRna.addProteinBindingDomain((ProteinBindingDomain) mr);
+      } else {
+        throw new InvalidArgumentException("Cannot add modification residue to element: " + mr.getClass());
+      }
     }
   }
 
diff --git a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerGene.java b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerGene.java
index 247887c598..cd8e8ee223 100644
--- a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerGene.java
+++ b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerGene.java
@@ -3,10 +3,16 @@ package lcsb.mapviewer.converter.model.celldesigner.structure;
 import java.util.ArrayList;
 import java.util.List;
 
+import lcsb.mapviewer.common.exception.InvalidArgumentException;
 import lcsb.mapviewer.common.exception.NotImplementedException;
 import lcsb.mapviewer.converter.model.celldesigner.structure.fields.CellDesignerModificationResidue;
 import lcsb.mapviewer.model.map.species.Gene;
 import lcsb.mapviewer.model.map.species.Species;
+import lcsb.mapviewer.model.map.species.field.CodingRegion;
+import lcsb.mapviewer.model.map.species.field.ModificationResidue;
+import lcsb.mapviewer.model.map.species.field.ModificationSite;
+import lcsb.mapviewer.model.map.species.field.RegulatoryRegion;
+import lcsb.mapviewer.model.map.species.field.TranscriptionSite;
 
 /**
  * Class representing CellDesigner {@link Gene}.
@@ -113,10 +119,20 @@ public class CellDesignerGene extends CellDesignerSpecies<Gene> {
   }
 
   @Override
-  public void updateModelElementAfterLayoutAdded(Species element) {
+  public void updateModelElementAfterLayoutAdded(Gene gene) {
     for (CellDesignerModificationResidue region : modificationResidues) {
-      ((Gene) element).addModificationResidue(region.createModificationResidue(element));
+      ModificationResidue mr = region.createModificationResidue(gene);
+      if (mr instanceof CodingRegion) {
+        gene.addCodingRegion((CodingRegion) mr);
+      } else if (mr instanceof ModificationSite) {
+        gene.addModificationSite((ModificationSite) mr);
+      } else if (mr instanceof RegulatoryRegion) {
+        gene.addRegulatoryRegion((RegulatoryRegion) mr);
+      } else if (mr instanceof TranscriptionSite) {
+        gene.addTranscriptionSite((TranscriptionSite) mr);
+      } else {
+        throw new InvalidArgumentException("Cannot add modification residue to element: " + mr.getClass());
+      }
     }
   }
-
 }
diff --git a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerProtein.java b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerProtein.java
index 9fa15ca0df..d82a2060b3 100644
--- a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerProtein.java
+++ b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerProtein.java
@@ -5,10 +5,13 @@ import java.util.List;
 
 import org.apache.log4j.Logger;
 
+import lcsb.mapviewer.common.exception.InvalidArgumentException;
 import lcsb.mapviewer.common.exception.NotImplementedException;
 import lcsb.mapviewer.converter.model.celldesigner.structure.fields.CellDesignerModificationResidue;
 import lcsb.mapviewer.model.map.species.Protein;
-import lcsb.mapviewer.model.map.species.Species;
+import lcsb.mapviewer.model.map.species.field.BindingRegion;
+import lcsb.mapviewer.model.map.species.field.ModificationResidue;
+import lcsb.mapviewer.model.map.species.field.Residue;
 
 /**
  * Class representing CellDesigner {@link Protein} object.
@@ -150,9 +153,16 @@ public class CellDesignerProtein<T extends Protein> extends CellDesignerSpecies<
   }
 
   @Override
-  public void updateModelElementAfterLayoutAdded(Species element) {
-    for (CellDesignerModificationResidue mr : modificationResidues) {
-      ((Protein) element).addModificationResidue(mr.createModificationResidue(element));
+  public void updateModelElementAfterLayoutAdded(Protein element) {
+    for (CellDesignerModificationResidue region : modificationResidues) {
+      ModificationResidue mr = region.createModificationResidue(element);
+      if (mr instanceof Residue) {
+        element.addResidue((Residue) mr);
+      } else if (mr instanceof BindingRegion) {
+        element.addBindingRegion((BindingRegion) mr);
+      } else {
+        throw new InvalidArgumentException("Cannot add modification residue to element: " + mr.getClass());
+      }
     }
   }
 
diff --git a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerRna.java b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerRna.java
index 64e121ad9a..1e2406c374 100644
--- a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerRna.java
+++ b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerRna.java
@@ -5,10 +5,14 @@ import java.util.List;
 
 import org.apache.log4j.Logger;
 
+import lcsb.mapviewer.common.exception.InvalidArgumentException;
 import lcsb.mapviewer.common.exception.NotImplementedException;
 import lcsb.mapviewer.converter.model.celldesigner.structure.fields.CellDesignerModificationResidue;
 import lcsb.mapviewer.model.map.species.Rna;
-import lcsb.mapviewer.model.map.species.Species;
+import lcsb.mapviewer.model.map.species.field.CodingRegion;
+import lcsb.mapviewer.model.map.species.field.ModificationResidue;
+import lcsb.mapviewer.model.map.species.field.ModificationSite;
+import lcsb.mapviewer.model.map.species.field.ProteinBindingDomain;
 
 /**
  * Class representing CellDesigner {@link Rna}.
@@ -139,10 +143,18 @@ public class CellDesignerRna extends CellDesignerSpecies<Rna> {
   }
 
   @Override
-  public void updateModelElementAfterLayoutAdded(Species element) {
+  public void updateModelElementAfterLayoutAdded(Rna rna) {
     for (CellDesignerModificationResidue region : regions) {
-      Rna rna = (Rna) element;
-      rna.addRegion(region.createModificationResidue(rna));
+      ModificationResidue mr = region.createModificationResidue(rna);
+      if (mr instanceof CodingRegion) {
+        rna.addCodingRegion((CodingRegion) mr);
+      } else if (mr instanceof ModificationSite) {
+        rna.addModificationSite((ModificationSite) mr);
+      } else if (mr instanceof ProteinBindingDomain) {
+        rna.addProteinBindingDomain((ProteinBindingDomain) mr);
+      } else {
+        throw new InvalidArgumentException("Cannot add modification residue to element: " + mr.getClass());
+      }
     }
   }
 
diff --git a/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/structure/SpeciesStateTest.java b/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/structure/SpeciesStateTest.java
index 5e24aa5ddb..1c6e9ca880 100644
--- a/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/structure/SpeciesStateTest.java
+++ b/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/structure/SpeciesStateTest.java
@@ -56,7 +56,7 @@ public class SpeciesStateTest {
     rna.setHeight(10);
     CodingRegion mr = new CodingRegion();
     mr.setPosition(new Point2D.Double(10, 40));
-    rna.addRegion(mr);
+    rna.addCodingRegion(mr);
     SpeciesState state = new SpeciesState(rna);
     assertEquals(1, state.getModifications().size());
   }
@@ -68,7 +68,7 @@ public class SpeciesStateTest {
     gene.setHeight(10);
     ModificationSite mr = new ModificationSite();
     mr.setPosition(new Point2D.Double(10, 40));
-    gene.addModificationResidue(mr);
+    gene.addModificationSite(mr);
     SpeciesState state = new SpeciesState(gene);
     assertEquals(1, state.getModifications().size());
   }
diff --git a/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlParser.java b/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlParser.java
index 7c6c5e53d5..3be28e7f95 100644
--- a/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlParser.java
+++ b/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlParser.java
@@ -831,7 +831,7 @@ public class SbgnmlXmlParser {
 
     mr.setPosition(new Point2D.Double(x, y));
 
-    protein.addModificationResidue(mr);
+    protein.addResidue(mr);
   }
 
   /**
diff --git a/converter-SBGNML/src/test/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlParserTest2.java b/converter-SBGNML/src/test/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlParserTest2.java
index fd00fea41c..e14f56980f 100644
--- a/converter-SBGNML/src/test/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlParserTest2.java
+++ b/converter-SBGNML/src/test/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlParserTest2.java
@@ -33,7 +33,7 @@ public class SbgnmlXmlParserTest2 {
     Residue mr = new Residue();
     Point2D position = new Point2D.Double(100, 20);
     mr.setPosition(position);
-    protein.addModificationResidue(mr);
+    protein.addResidue(mr);
     parser.adjustModificationCoordinates(protein);
 
     assertTrue(mr.getPosition().distance(position) > Configuration.EPSILON);
diff --git a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverterTest.java b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverterTest.java
index 9b1ec5616f..d44d12eefa 100644
--- a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverterTest.java
+++ b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverterTest.java
@@ -197,7 +197,7 @@ public class SpeciesConverterTest {
       bindingRegion.setPosition(new Point2D.Double(10, 10));
       bindingRegion.setWidth(100.0);
       bindingRegion.setHeight(10.0);
-      protein.addModificationResidue(bindingRegion);
+      protein.addBindingRegion(bindingRegion);
 
       ProteinConverter converter = Mockito.spy(new ProteinConverter(colorExtractor));
       converter.drawModification(bindingRegion, graphics, false);
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 1ae127b723..cffe83e934 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
@@ -50,7 +50,9 @@ import lcsb.mapviewer.model.map.species.IonChannelProtein;
 import lcsb.mapviewer.model.map.species.ReceptorProtein;
 import lcsb.mapviewer.model.map.species.Species;
 import lcsb.mapviewer.model.map.species.TruncatedProtein;
+import lcsb.mapviewer.model.map.species.field.ModificationState;
 import lcsb.mapviewer.model.map.species.field.PositionToCompartment;
+import lcsb.mapviewer.model.map.species.field.Residue;
 
 public class SbmlExporterTest {
   Logger logger = Logger.getLogger(SbmlExporterTest.class);
@@ -606,4 +608,33 @@ public class SbmlExporterTest {
         speciesExtension.getListOfSpeciesFeatures().size() > 0);
   }
 
+  @Test
+  public void testExportResidue() throws Exception {
+    Model model = createEmptyModel();
+    GenericProtein element = new GenericProtein("id");
+    element.setName("test name");
+    element.setX(10);
+    element.setWidth(10);
+    element.setY(10);
+    element.setHeight(10);
+    Residue mr = new Residue("x1");
+    mr.setName("217U");
+    mr.setState(ModificationState.PHOSPHORYLATED);
+    element.addResidue(mr);
+    mr = new Residue("Y");
+    mr.setName("218");
+    mr.setState(ModificationState.PHOSPHORYLATED);
+    element.addResidue(mr);
+    mr = new Residue("Z");
+    mr.setName("219");
+    mr.setState(ModificationState.UBIQUITINATED);
+    element.addResidue(mr);
+    model.addElement(element);
+    Model deserializedModel = getModelAfterSerializing(model);
+
+    GenericProtein protein = deserializedModel.getElementByElementId("id");
+    assertEquals("Residues weren't exported/imported properly", 3, protein.getModificationResidues().size());
+
+  }
+
 }
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/AntisenseRna.java b/model/src/main/java/lcsb/mapviewer/model/map/species/AntisenseRna.java
index bf985706d3..416802d7db 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/species/AntisenseRna.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/AntisenseRna.java
@@ -13,7 +13,10 @@ import org.hibernate.annotations.LazyCollection;
 import org.hibernate.annotations.LazyCollectionOption;
 
 import lcsb.mapviewer.common.exception.NotImplementedException;
+import lcsb.mapviewer.model.map.species.field.CodingRegion;
 import lcsb.mapviewer.model.map.species.field.ModificationResidue;
+import lcsb.mapviewer.model.map.species.field.ModificationSite;
+import lcsb.mapviewer.model.map.species.field.ProteinBindingDomain;
 
 /**
  * Entity representing antisense rna element on the map.
@@ -38,7 +41,7 @@ public class AntisenseRna extends Species {
   @OneToMany(mappedBy = "species")
   @LazyCollection(LazyCollectionOption.FALSE)
   private List<ModificationResidue> regions = new ArrayList<>();
-
+  
   /**
    * Empty constructor required by hibernate.
    */
@@ -54,7 +57,7 @@ public class AntisenseRna extends Species {
   public AntisenseRna(AntisenseRna original) {
     super(original);
     for (ModificationResidue region : original.getRegions()) {
-      addRegion(region.copy());
+      addModificationResidue(region.copy());
     }
   }
 
@@ -74,11 +77,23 @@ public class AntisenseRna extends Species {
    * @param antisenseRnaRegion
    *          region to be added
    */
-  public void addRegion(ModificationResidue antisenseRnaRegion) {
+  private void addModificationResidue(ModificationResidue antisenseRnaRegion) {
     regions.add(antisenseRnaRegion);
     antisenseRnaRegion.setSpecies(this);
   }
-
+  
+  public void addCodingRegion(CodingRegion codingRegion) {
+    this.addModificationResidue(codingRegion);
+  }
+  
+  public void addProteinBindingDomain(ProteinBindingDomain codingRegion) {
+    this.addModificationResidue(codingRegion);
+  }
+  
+  public void addModificationSite(ModificationSite codingRegion) {
+    this.addModificationResidue(codingRegion);
+  }
+  
   @Override
   public AntisenseRna copy() {
     if (this.getClass() == AntisenseRna.class) {
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/Gene.java b/model/src/main/java/lcsb/mapviewer/model/map/species/Gene.java
index 183c684ef1..9c87b44c78 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/species/Gene.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/Gene.java
@@ -13,7 +13,11 @@ import org.hibernate.annotations.LazyCollection;
 import org.hibernate.annotations.LazyCollectionOption;
 
 import lcsb.mapviewer.common.exception.NotImplementedException;
+import lcsb.mapviewer.model.map.species.field.CodingRegion;
 import lcsb.mapviewer.model.map.species.field.ModificationResidue;
+import lcsb.mapviewer.model.map.species.field.ModificationSite;
+import lcsb.mapviewer.model.map.species.field.RegulatoryRegion;
+import lcsb.mapviewer.model.map.species.field.TranscriptionSite;
 
 /**
  * Entity representing gene element on the map.
@@ -73,12 +77,28 @@ public class Gene extends Species {
    * @param modificationResidue
    *          {@link ModificationResidue} to be added
    */
-  public void addModificationResidue(ModificationResidue modificationResidue) {
+  private void addModificationResidue(ModificationResidue modificationResidue) {
     modificationResidues.add(modificationResidue);
     modificationResidue.setSpecies(this);
 
   }
 
+  public void addCodingRegion(CodingRegion codingRegion) {
+    this.addModificationResidue(codingRegion);
+  }
+
+  public void addModificationSite(ModificationSite modificationSite) {
+    this.addModificationResidue(modificationSite);
+  }
+
+  public void addRegulatoryRegion(RegulatoryRegion regulatoryRegion) {
+    this.addModificationResidue(regulatoryRegion);
+  }
+
+  public void addTranscriptionSite(TranscriptionSite transcriptionSite) {
+    this.addModificationResidue(transcriptionSite);
+  }
+
   @Override
   public Gene copy() {
     if (this.getClass() == Gene.class) {
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/Protein.java b/model/src/main/java/lcsb/mapviewer/model/map/species/Protein.java
index 829ca43483..9a52c46031 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/species/Protein.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/Protein.java
@@ -12,7 +12,9 @@ import org.hibernate.annotations.CascadeType;
 import org.hibernate.annotations.LazyCollection;
 import org.hibernate.annotations.LazyCollectionOption;
 
+import lcsb.mapviewer.model.map.species.field.BindingRegion;
 import lcsb.mapviewer.model.map.species.field.ModificationResidue;
+import lcsb.mapviewer.model.map.species.field.Residue;
 
 /**
  * Entity representing protein element on the map.
@@ -41,7 +43,7 @@ public abstract class Protein extends Species {
   @OneToMany(mappedBy = "species", orphanRemoval = true)
   @LazyCollection(LazyCollectionOption.FALSE)
   private List<ModificationResidue> modificationResidues = new ArrayList<>();
-
+  
   /**
    * Empty constructor required by hibernate.
    */
@@ -78,11 +80,19 @@ public abstract class Protein extends Species {
    * @param modificationResidue
    *          modification to add
    */
-  public void addModificationResidue(ModificationResidue modificationResidue) {
+  private void addModificationResidue(ModificationResidue modificationResidue) {
     modificationResidues.add(modificationResidue);
     modificationResidue.setSpecies(this);
   }
 
+  public void addBindingRegion(BindingRegion bindingRegion) {
+    this.addModificationResidue(bindingRegion);
+  }
+
+  public void addResidue(Residue residue) {
+    this.addModificationResidue(residue);
+  }
+
   /**
    * @return the modificationResidues
    * @see #modificationResidues
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/Rna.java b/model/src/main/java/lcsb/mapviewer/model/map/species/Rna.java
index b9d6f9233f..cbaedd90b4 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/species/Rna.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/Rna.java
@@ -13,7 +13,10 @@ import org.hibernate.annotations.LazyCollection;
 import org.hibernate.annotations.LazyCollectionOption;
 
 import lcsb.mapviewer.common.exception.NotImplementedException;
+import lcsb.mapviewer.model.map.species.field.CodingRegion;
 import lcsb.mapviewer.model.map.species.field.ModificationResidue;
+import lcsb.mapviewer.model.map.species.field.ModificationSite;
+import lcsb.mapviewer.model.map.species.field.ProteinBindingDomain;
 
 /**
  * Entity representing rna element on the map.
@@ -53,7 +56,7 @@ public class Rna extends Species {
   public Rna(Rna original) {
     super(original);
     for (ModificationResidue region : original.getRegions()) {
-      addRegion(region.copy());
+      addModificationResidue(region.copy());
     }
   }
 
@@ -74,9 +77,21 @@ public class Rna extends Species {
    * @param rnaRegion
    *          object to be added
    */
-  public void addRegion(ModificationResidue rnaRegion) {
-    regions.add(rnaRegion);
-    rnaRegion.setSpecies(this);
+  private void addModificationResidue(ModificationResidue antisenseRnaRegion) {
+    regions.add(antisenseRnaRegion);
+    antisenseRnaRegion.setSpecies(this);
+  }
+  
+  public void addCodingRegion(CodingRegion codingRegion) {
+    this.addModificationResidue(codingRegion);
+  }
+  
+  public void addProteinBindingDomain(ProteinBindingDomain codingRegion) {
+    this.addModificationResidue(codingRegion);
+  }
+  
+  public void addModificationSite(ModificationSite codingRegion) {
+    this.addModificationResidue(codingRegion);
   }
 
   @Override
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/field/AbstractSiteModification.java b/model/src/main/java/lcsb/mapviewer/model/map/species/field/AbstractSiteModification.java
index e1b7030a96..86ef4c8d19 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/species/field/AbstractSiteModification.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/field/AbstractSiteModification.java
@@ -31,6 +31,10 @@ public abstract class AbstractSiteModification extends ModificationResidue {
     this.state = mr.getState();
   }
 
+  public AbstractSiteModification(String modificationId) {
+   super(modificationId);
+  }
+
   public ModificationState getState() {
     return state;
   }
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/field/ModificationResidue.java b/model/src/main/java/lcsb/mapviewer/model/map/species/field/ModificationResidue.java
index 6d76f71c98..4225d31fb3 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/species/field/ModificationResidue.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/field/ModificationResidue.java
@@ -92,6 +92,10 @@ public abstract class ModificationResidue implements Serializable {
     this.position = mr.position;
   }
 
+  public ModificationResidue(String modificationId) {
+    this.idModificationResidue = modificationId;
+  }
+
   /**
    * @return the idModificationResidue
    * @see #id
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/field/Residue.java b/model/src/main/java/lcsb/mapviewer/model/map/species/field/Residue.java
index d93cc8956d..c20e0606fb 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/species/field/Residue.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/field/Residue.java
@@ -29,6 +29,10 @@ public class Residue extends AbstractSiteModification {
     super(residue);
   }
 
+  public Residue(String modificationId) {
+    super(modificationId);
+  }
+
   /**
    * Creates copy of the object.
    * 
diff --git a/model/src/test/java/lcsb/mapviewer/model/map/species/AntisenseRnaComparatorTest.java b/model/src/test/java/lcsb/mapviewer/model/map/species/AntisenseRnaComparatorTest.java
index 3df395f239..858bc750ba 100644
--- a/model/src/test/java/lcsb/mapviewer/model/map/species/AntisenseRnaComparatorTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/map/species/AntisenseRnaComparatorTest.java
@@ -79,7 +79,7 @@ public class AntisenseRnaComparatorTest {
     AntisenseRna result = new AntisenseRna();
 
     CodingRegion region1 = new CodingRegion();
-    result.addRegion(region1);
+    result.addCodingRegion(region1);
     region1.setIdModificationResidue("a");
     region1.setName("name");
     region1.setPosition(new Point2D.Double(0, 1));
diff --git a/model/src/test/java/lcsb/mapviewer/model/map/species/AntisenseRnaTest.java b/model/src/test/java/lcsb/mapviewer/model/map/species/AntisenseRnaTest.java
index f52284cd4f..102da4683c 100644
--- a/model/src/test/java/lcsb/mapviewer/model/map/species/AntisenseRnaTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/map/species/AntisenseRnaTest.java
@@ -41,7 +41,7 @@ public class AntisenseRnaTest {
   public void testConstructor1() {
     try {
       AntisenseRna original = new AntisenseRna();
-      original.addRegion(new CodingRegion());
+      original.addCodingRegion(new CodingRegion());
       AntisenseRna aRna = new AntisenseRna(original);
       assertNotNull(aRna);
     } catch (Exception e) {
diff --git a/model/src/test/java/lcsb/mapviewer/model/map/species/GeneComparatorTest.java b/model/src/test/java/lcsb/mapviewer/model/map/species/GeneComparatorTest.java
index e255b76e32..7b7d6d4869 100644
--- a/model/src/test/java/lcsb/mapviewer/model/map/species/GeneComparatorTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/map/species/GeneComparatorTest.java
@@ -82,13 +82,13 @@ public class GeneComparatorTest {
     Gene result = new Gene();
     result.setHypothetical(true);
 
-    AbstractSiteModification residue = new ModificationSite();
-    result.addModificationResidue(residue);
+    ModificationSite modificationSite = new ModificationSite();
+    result.addModificationSite(modificationSite);
 
-    residue.setIdModificationResidue("a");
-    residue.setName("name");
-    residue.setPosition(new Point2D.Double(10, 20));
-    residue.setState(ModificationState.ACETYLATED);
+    modificationSite.setIdModificationResidue("a");
+    modificationSite.setName("name");
+    modificationSite.setPosition(new Point2D.Double(10, 20));
+    modificationSite.setState(ModificationState.ACETYLATED);
     return result;
   }
 
diff --git a/model/src/test/java/lcsb/mapviewer/model/map/species/GeneTest.java b/model/src/test/java/lcsb/mapviewer/model/map/species/GeneTest.java
index 5dd200337e..f79e6affe7 100644
--- a/model/src/test/java/lcsb/mapviewer/model/map/species/GeneTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/map/species/GeneTest.java
@@ -41,7 +41,7 @@ public class GeneTest {
   public void testConstructor1() {
     try {
       Gene original = new Gene();
-      original.addModificationResidue(new ModificationSite());
+      original.addModificationSite(new ModificationSite());
       Gene gene = new Gene(original);
       assertNotNull(gene);
     } catch (Exception e) {
diff --git a/model/src/test/java/lcsb/mapviewer/model/map/species/ProteinComparatorTest.java b/model/src/test/java/lcsb/mapviewer/model/map/species/ProteinComparatorTest.java
index e07e6d0e81..e0cdc967ea 100644
--- a/model/src/test/java/lcsb/mapviewer/model/map/species/ProteinComparatorTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/map/species/ProteinComparatorTest.java
@@ -126,7 +126,7 @@ public class ProteinComparatorTest {
     result.setHypothetical(true);
 
     Residue residue = new Residue();
-    result.addModificationResidue(residue);
+    result.addResidue(residue);
 
     residue.setIdModificationResidue("a");
     residue.setName("name");
diff --git a/model/src/test/java/lcsb/mapviewer/model/map/species/RnaComparatorTest.java b/model/src/test/java/lcsb/mapviewer/model/map/species/RnaComparatorTest.java
index 819c28ea1d..f99156d913 100644
--- a/model/src/test/java/lcsb/mapviewer/model/map/species/RnaComparatorTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/map/species/RnaComparatorTest.java
@@ -81,7 +81,7 @@ public class RnaComparatorTest {
     result.setHypothetical(true);
 
     CodingRegion region1 = new CodingRegion();
-    result.addRegion(region1);
+    result.addCodingRegion(region1);
     region1.setIdModificationResidue("a");
     region1.setPosition(new Point2D.Double(0, 10));
     region1.setWidth(2.0);
diff --git a/model/src/test/java/lcsb/mapviewer/model/map/species/RnaTest.java b/model/src/test/java/lcsb/mapviewer/model/map/species/RnaTest.java
index 948f46dcb1..f36d79d001 100644
--- a/model/src/test/java/lcsb/mapviewer/model/map/species/RnaTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/map/species/RnaTest.java
@@ -54,7 +54,7 @@ public class RnaTest {
   public void testConstructor() {
     try {
       Rna rna = new Rna("d");
-      rna.addRegion(new CodingRegion());
+      rna.addCodingRegion(new CodingRegion());
       Rna rna2 = new Rna(rna);
       assertEquals(rna.getRegions().size(), rna2.getRegions().size());
     } catch (Exception e) {
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java
index f340ba5f5b..83d5009859 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java
@@ -390,10 +390,10 @@ public class ModelContructor {
 
         if (species instanceof Protein) {
           mr = new Residue();
-          ((Protein) species).addModificationResidue(mr);
+          ((Protein) species).addResidue((Residue) mr);
         } else if (species instanceof Gene) {
           mr = new ModificationSite();
-          ((Gene) species).addModificationResidue(mr);
+          ((Gene) species).addModificationSite((ModificationSite) mr);
         } else {
           logger.warn(
               state.getWarningPrefix() + "state for " + species.getClass().getSimpleName() + " is not supported.");
diff --git a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/CommentDaoTest.java b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/CommentDaoTest.java
index e00f0b9d3a..f44acde754 100644
--- a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/CommentDaoTest.java
+++ b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/CommentDaoTest.java
@@ -145,9 +145,9 @@ public class CommentDaoTest extends PersistTestFunctions {
     alias = createSpeciesAlias(264.8333333333335, 517.75, 86.0, 46.0, "pr1");
     model.addElement(alias);
 
-    ModificationResidue mr = new Residue();
+    Residue mr = new Residue();
     mr.setName("mr");
-    alias.addModificationResidue(mr);
+    alias.addResidue(mr);
 
     alias.addMiriamData(new MiriamData(MiriamRelationType.BQ_BIOL_IS_DESCRIBED_BY, MiriamType.CHEBI, "c"));
     return model;
diff --git a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/LayoutDaoTest.java b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/LayoutDaoTest.java
index 406af68352..d896472061 100644
--- a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/LayoutDaoTest.java
+++ b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/LayoutDaoTest.java
@@ -195,7 +195,7 @@ public class LayoutDaoTest extends PersistTestFunctions {
 
     Residue mr = new Residue();
     mr.setName("mr");
-    protein.addModificationResidue(mr);
+    protein.addResidue(mr);
 
     protein.addMiriamData(new MiriamData(MiriamRelationType.BQ_BIOL_IS_DESCRIBED_BY, MiriamType.CHEBI, "c"));
     return model;
diff --git a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/ModelDaoTest.java b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/ModelDaoTest.java
index 719167ffff..400af2be98 100644
--- a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/ModelDaoTest.java
+++ b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/ModelDaoTest.java
@@ -424,7 +424,7 @@ public class ModelDaoTest extends PersistTestFunctions {
     Residue mr = new Residue();
     mr.setName("mr");
     mr.setPosition(new Point2D.Double(10, 20));
-    alias.addModificationResidue(mr);
+    alias.addResidue(mr);
 
     alias.addMiriamData(new MiriamData(MiriamRelationType.BQ_BIOL_IS_DESCRIBED_BY, MiriamType.CHEBI, "c"));
     return model;
diff --git a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/AliasDaoTest2.java b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/AliasDaoTest2.java
index abab8f1ff1..08cfd58ce8 100644
--- a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/AliasDaoTest2.java
+++ b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/AliasDaoTest2.java
@@ -108,7 +108,7 @@ public class AliasDaoTest2 extends PersistTestFunctions {
       mr.setPosition(new Point2D.Double(10, 20));
       mr.setName("name");
       mr.setState(ModificationState.GLYCOSYLATED);
-      protein.addModificationResidue(mr);
+      protein.addResidue(mr);
 
       elementDao.add(protein);
 
@@ -143,7 +143,7 @@ public class AliasDaoTest2 extends PersistTestFunctions {
       ModificationSite mr = new ModificationSite();
       mr.setName("name");
       mr.setState(ModificationState.DONT_CARE);
-      sp.addRegion(mr);
+      sp.addModificationSite(mr);
 
       elementDao.add(sp);
       elementDao.evict(sp);
@@ -177,7 +177,7 @@ public class AliasDaoTest2 extends PersistTestFunctions {
       AntisenseRna sp = new AntisenseRna(testIdAlias);
       ModificationSite mr = new ModificationSite();
       mr.setName("name");
-      sp.addRegion(mr);
+      sp.addModificationSite(mr);
 
       elementDao.add(sp);
       elementDao.evict(sp);
diff --git a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/AntisenseRnaTest.java b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/AntisenseRnaTest.java
index 44bb7dcec7..1b67cca4e9 100644
--- a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/AntisenseRnaTest.java
+++ b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/AntisenseRnaTest.java
@@ -75,7 +75,7 @@ public class AntisenseRnaTest extends PersistTestFunctions {
     Model model = new ModelFullIndexed(null);
 
     AntisenseRna alias = new AntisenseRna("As");
-    alias.addRegion(new CodingRegion());
+    alias.addCodingRegion(new CodingRegion());
     alias.setX(1);
     alias.setY(2);
     alias.setWidth(10);
diff --git a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/RnaTest.java b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/RnaTest.java
index 4eea1e67a9..d0392f51a0 100644
--- a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/RnaTest.java
+++ b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/RnaTest.java
@@ -74,7 +74,7 @@ public class RnaTest extends PersistTestFunctions {
     Model model = new ModelFullIndexed(null);
 
     Rna alias = new Rna("As");
-    alias.addRegion(new CodingRegion());
+    alias.addCodingRegion(new CodingRegion());
     alias.setX(1);
     alias.setY(2);
     alias.setWidth(10);
diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementRestImplTest.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementRestImplTest.java
index 61b7458f8e..c9701d3a83 100644
--- a/rest-api/src/test/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementRestImplTest.java
+++ b/rest-api/src/test/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementRestImplTest.java
@@ -117,7 +117,7 @@ public class ElementRestImplTest extends RestTestFunctions {
       Residue mr = new Residue();
       mr.setState(ModificationState.ACETYLATED);
       mr.setName("S250");
-      protein.addModificationResidue(mr);
+      protein.addResidue(mr);
       protein.setStructuralState(state);
       Map<String, Object> result = _elementsRestImpl.getOthersForElement(protein);
       assertNotNull(result.get("modifications"));
@@ -139,7 +139,7 @@ public class ElementRestImplTest extends RestTestFunctions {
       ModificationSite mr = new ModificationSite();
       mr.setState(ModificationState.ACETYLATED);
       mr.setName("S250");
-      rna.addRegion(mr);
+      rna.addModificationSite(mr);
       rna.setState(state);
       Map<String, Object> result = _elementsRestImpl.getOthersForElement(rna);
       assertNotNull(result.get("modifications"));
@@ -160,7 +160,7 @@ public class ElementRestImplTest extends RestTestFunctions {
       AntisenseRna antisenseRna = new AntisenseRna("s1");
       ModificationSite mr = new ModificationSite();
       mr.setName("S250");
-      antisenseRna.addRegion(mr);
+      antisenseRna.addModificationSite(mr);
       antisenseRna.setState(state);
       Map<String, Object> result = _elementsRestImpl.getOthersForElement(antisenseRna);
       assertNotNull(result.get("modifications"));
-- 
GitLab