From ffca982e4820b718245d5f5d89a6695315298fa9 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <p.gawron@atcomp.pl>
Date: Fri, 14 Mar 2025 10:39:04 +0100
Subject: [PATCH] make sure that immediate links are copied and tested properly

---
 .../mapviewer/model/map/species/Element.java  |  1 +
 .../model/map/species/ElementComparator.java  | 80 +++++++++----------
 .../map/species/ElementComparatorTest.java    | 20 +++++
 .../model/map/species/ElementTest.java        | 42 +++++-----
 4 files changed, 79 insertions(+), 64 deletions(-)

diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/Element.java b/model/src/main/java/lcsb/mapviewer/model/map/species/Element.java
index cb649f940f..7858e94c4a 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/species/Element.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/Element.java
@@ -366,6 +366,7 @@ public abstract class Element implements BioEntity, MinervaEntity, SbmlArgument
       setGlyph(new Glyph(original.getGlyph()));
     }
     setBorderColor(original.getBorderColor());
+    setImmediateLink(original.getImmediateLink());
   }
 
   /**
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/ElementComparator.java b/model/src/main/java/lcsb/mapviewer/model/map/species/ElementComparator.java
index b5bf17b05a..72997425c9 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/species/ElementComparator.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/ElementComparator.java
@@ -1,8 +1,5 @@
 package lcsb.mapviewer.model.map.species;
 
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-
 import lcsb.mapviewer.common.Comparator;
 import lcsb.mapviewer.common.Configuration;
 import lcsb.mapviewer.common.comparator.ColorComparator;
@@ -21,26 +18,20 @@ import lcsb.mapviewer.model.map.model.ElementSubmodelConnectionComparator;
 
 /**
  * Comparator class used for comparing {@link Element} objects.
- * 
- * @author Piotr Gawron
  *
+ * @author Piotr Gawron
  */
 public class ElementComparator extends Comparator<Element> {
-  /**
-   * Default class logger.
-   */
-  private static Logger logger = LogManager.getLogger();
 
   /**
    * Epsilon value used for comparison of doubles.
    */
-  private double epsilon;
+  private final double epsilon;
 
   /**
    * Constructor that requires {@link #epsilon} parameter.
-   * 
-   * @param epsilon
-   *          {@link #epsilon}
+   *
+   * @param epsilon {@link #epsilon}
    */
   public ElementComparator(final double epsilon) {
     super(Element.class, true);
@@ -74,97 +65,97 @@ public class ElementComparator extends Comparator<Element> {
     DoubleComparator doubleComparator = new DoubleComparator(epsilon);
 
     if (stringComparator.compare(arg0.getElementId(), arg1.getElementId()) != 0) {
-      logger.debug("ElementId different: " + arg0.getElementId() + ", " + arg1.getElementId());
+      logger.debug("ElementId different: {}, {}", arg0.getElementId(), arg1.getElementId());
       return stringComparator.compare(arg0.getElementId(), arg1.getElementId());
     }
 
     if (doubleComparator.compare(arg0.getX(), arg1.getX()) != 0) {
-      logger.debug("X different: " + arg0.getX() + ", " + arg1.getX());
+      logger.debug("X different: {}, {}", arg0.getX(), arg1.getX());
       return doubleComparator.compare(arg0.getX(), arg1.getX());
     }
 
     if (doubleComparator.compare(arg0.getY(), arg1.getY()) != 0) {
-      logger.debug("Y different: " + arg0.getY() + ", " + arg1.getY());
+      logger.debug("Y different: {}, {}", arg0.getY(), arg1.getY());
       return doubleComparator.compare(arg0.getY(), arg1.getY());
     }
 
     IntegerComparator integerComparator = new IntegerComparator();
     if (integerComparator.compare(arg0.getZ(), arg1.getZ()) != 0) {
-      logger.debug("Z-index different: " + arg0.getZ() + ", " + arg1.getZ());
+      logger.debug("Z-index different: {}, {}", arg0.getZ(), arg1.getZ());
       return integerComparator.compare(arg0.getZ(), arg1.getZ());
     }
 
     if (doubleComparator.compare(arg0.getWidth(), arg1.getWidth()) != 0) {
-      logger.debug("Width different: " + arg0.getWidth() + ", " + arg1.getWidth());
+      logger.debug("Width different: {}, {}", arg0.getWidth(), arg1.getWidth());
       return doubleComparator.compare(arg0.getWidth(), arg1.getWidth());
     }
 
     if (doubleComparator.compare(arg0.getHeight(), arg1.getHeight()) != 0) {
-      logger.debug("Height different: " + arg0.getHeight() + ", " + arg1.getHeight());
+      logger.debug("Height different: {}, {}", arg0.getHeight(), arg1.getHeight());
       return doubleComparator.compare(arg0.getHeight(), arg1.getHeight());
     }
 
     if (doubleComparator.compare(arg0.getFontSize(), arg1.getFontSize()) != 0) {
-      logger.debug("Font size different: " + arg0.getFontSize() + ", " + arg1.getFontSize());
+      logger.debug("Font size different: {}, {}", arg0.getFontSize(), arg1.getFontSize());
       return doubleComparator.compare(arg0.getFontSize(), arg1.getFontSize());
     }
 
     if (stringComparator.compare(arg0.getVisibilityLevel(), arg1.getVisibilityLevel()) != 0) {
-      logger.debug("Visibility level different: " + arg0.getVisibilityLevel() + ", " + arg1.getVisibilityLevel());
+      logger.debug("Visibility level different: {}, {}", arg0.getVisibilityLevel(), arg1.getVisibilityLevel());
       return stringComparator.compare(arg0.getVisibilityLevel(), arg1.getVisibilityLevel());
     }
 
     if (colorComparator.compare(arg0.getFillColor(), arg1.getFillColor()) != 0) {
-      logger.debug("Fill color different: " + arg0.getFillColor() + ", " + arg1.getFillColor());
+      logger.debug("Fill color different: {}, {}", arg0.getFillColor(), arg1.getFillColor());
       return colorComparator.compare(arg0.getFillColor(), arg1.getFillColor());
     }
 
     if (colorComparator.compare(arg0.getBorderColor(), arg1.getBorderColor()) != 0) {
-      logger.debug("Border color different: " + arg0.getBorderColor() + ", " + arg1.getBorderColor());
+      logger.debug("Border color different: {}, {}", arg0.getBorderColor(), arg1.getBorderColor());
       return colorComparator.compare(arg0.getBorderColor(), arg1.getBorderColor());
     }
 
     if (colorComparator.compare(arg0.getFontColor(), arg1.getFontColor()) != 0) {
-      logger.debug("Font color different: " + arg0.getFontColor() + ", " + arg1.getFontColor());
+      logger.debug("Font color different: {}, {}", arg0.getFontColor(), arg1.getFontColor());
       return colorComparator.compare(arg0.getFontColor(), arg1.getFontColor());
     }
 
     // this should be somehow modified, because it can create a situation where
     // comparison will fall into infinite loop (in cyclic submodels)
-    ElementSubmodelConnectionComparator ascc = new ElementSubmodelConnectionComparator(epsilon);
-    int status = ascc.compare(arg0.getSubmodel(), arg1.getSubmodel());
+    ElementSubmodelConnectionComparator connectionComparator = new ElementSubmodelConnectionComparator(epsilon);
+    int status = connectionComparator.compare(arg0.getSubmodel(), arg1.getSubmodel());
     if (status != 0) {
-      logger.debug("Element submodel different: " + arg0.getSubmodel() + ", " + arg1.getSubmodel());
+      logger.debug("Element submodel different: {}, {}", arg0.getSubmodel(), arg1.getSubmodel());
       return status;
     }
 
     if (stringComparator.compare(arg0.getName(), arg1.getName()) != 0) {
-      logger.debug("Name different: " + arg0.getName() + ", " + arg1.getName());
+      logger.debug("Name different: {}, {}", arg0.getName(), arg1.getName());
       return stringComparator.compare(arg0.getName(), arg1.getName());
     }
 
     if (stringComparator.compare(arg0.getNotes(), arg1.getNotes(), true) != 0) {
-      logger.debug("notes different: \n\"" + arg0.getNotes() + "\"\n\"" + arg1.getNotes() + "\"");
+      logger.debug("notes different: \n\"{}\"\n\"{}\"", arg0.getNotes(), arg1.getNotes());
       return stringComparator.compare(arg0.getNotes(), arg1.getNotes());
     }
 
     if (stringComparator.compare(arg0.getSymbol(), arg1.getSymbol()) != 0) {
-      logger.debug("symbol different: \"" + arg0.getSymbol() + "\", \"" + arg1.getSymbol() + "\"");
+      logger.debug("symbol different: \"{}\", \"{}\"", arg0.getSymbol(), arg1.getSymbol());
       return stringComparator.compare(arg0.getSymbol(), arg1.getSymbol());
     }
 
     if (stringComparator.compare(arg0.getFullName(), arg1.getFullName()) != 0) {
-      logger.debug("full name different: \"" + arg0.getFullName() + "\", \"" + arg1.getFullName() + "\"");
+      logger.debug("full name different: \"{}\", \"{}\"", arg0.getFullName(), arg1.getFullName());
       return stringComparator.compare(arg0.getFullName(), arg1.getFullName());
     }
 
     if (stringComparator.compare(arg0.getAbbreviation(), arg1.getAbbreviation()) != 0) {
-      logger.debug("Abbreviation different: \"" + arg0.getAbbreviation() + "\", \"" + arg1.getAbbreviation() + "\"");
+      logger.debug("Abbreviation different: \"{}\", \"{}\"", arg0.getAbbreviation(), arg1.getAbbreviation());
       return stringComparator.compare(arg0.getAbbreviation(), arg1.getAbbreviation());
     }
 
     if (stringComparator.compare(arg0.getFormula(), arg1.getFormula()) != 0) {
-      logger.debug("formula different: \"" + arg0.getFormula() + "\", \"" + arg1.getFormula() + "\"");
+      logger.debug("formula different: \"{}\", \"{}\"", arg0.getFormula(), arg1.getFormula());
       return stringComparator.compare(arg0.getFormula(), arg1.getFormula());
     }
 
@@ -184,46 +175,47 @@ public class ElementComparator extends Comparator<Element> {
 
     status = miriamDataSetComparator.compare(arg0.getMiriamData(), arg1.getMiriamData());
     if (status != 0) {
-      logger.debug("miriam data different");
-      logger.debug(arg0.getMiriamData());
-      logger.debug(arg1.getMiriamData());
+      logger.debug("miriam data different:\n{}\n{}", arg0.getMiriamData(), arg1.getMiriamData());
       return status;
     }
 
     if (doubleComparator.compare(arg0.getNameX(), arg1.getNameX()) != 0) {
-      logger.debug("NameX different: " + arg0.getNameX() + ", " + arg1.getNameX());
+      logger.debug("NameX different: {}, {}", arg0.getNameX(), arg1.getNameX());
       return doubleComparator.compare(arg0.getNameX(), arg1.getNameX());
     }
 
     if (doubleComparator.compare(arg0.getNameY(), arg1.getNameY()) != 0) {
-      logger.debug("NameY different: " + arg0.getNameY() + ", " + arg1.getNameY());
+      logger.debug("NameY different: {}, {}", arg0.getNameY(), arg1.getNameY());
       return doubleComparator.compare(arg0.getNameY(), arg1.getNameY());
     }
 
     if (doubleComparator.compare(arg0.getNameWidth(), arg1.getNameWidth()) != 0) {
-      logger.debug("NameWidth different: " + arg0.getNameWidth() + ", " + arg1.getNameWidth());
+      logger.debug("NameWidth different: {}, {}", arg0.getNameWidth(), arg1.getNameWidth());
       return doubleComparator.compare(arg0.getNameWidth(), arg1.getNameWidth());
     }
 
     if (doubleComparator.compare(arg0.getNameHeight(), arg1.getNameHeight()) != 0) {
-      logger.debug("NameHeight different: " + arg0.getNameHeight() + ", " + arg1.getNameHeight());
+      logger.debug("NameHeight different: {}, {}", arg0.getNameHeight(), arg1.getNameHeight());
       return doubleComparator.compare(arg0.getNameHeight(), arg1.getNameHeight());
     }
 
     EnumComparator<VerticalAlign> verticalAlignComparator = new EnumComparator<>();
     if (verticalAlignComparator.compare(arg0.getNameVerticalAlign(), arg1.getNameVerticalAlign()) != 0) {
-      logger.debug("Name vertical alignment different: " + arg0.getNameVerticalAlign() + ", "
-          + arg1.getNameVerticalAlign());
+      logger.debug("Name vertical alignment different: {}, {}", arg0.getNameVerticalAlign(), arg1.getNameVerticalAlign());
       return verticalAlignComparator.compare(arg0.getNameVerticalAlign(), arg1.getNameVerticalAlign());
     }
 
     EnumComparator<HorizontalAlign> horizontalAlignComparator = new EnumComparator<>();
     if (horizontalAlignComparator.compare(arg0.getNameHorizontalAlign(), arg1.getNameHorizontalAlign()) != 0) {
-      logger.debug("Name horizontal alignment different: " + arg0.getNameHorizontalAlign() + ", "
-          + arg1.getNameHorizontalAlign());
+      logger.debug("Name horizontal alignment different: {}, {}", arg0.getNameHorizontalAlign(), arg1.getNameHorizontalAlign());
       return horizontalAlignComparator.compare(arg0.getNameHorizontalAlign(), arg1.getNameHorizontalAlign());
     }
 
+    if (stringComparator.compare(arg0.getImmediateLink(), arg1.getImmediateLink()) != 0) {
+      logger.debug("Immediate link different: {}, {}", arg0.getImmediateLink(), arg1.getImmediateLink());
+      return stringComparator.compare(arg0.getImmediateLink(), arg1.getImmediateLink());
+    }
+
     return 0;
   }
 
diff --git a/model/src/test/java/lcsb/mapviewer/model/map/species/ElementComparatorTest.java b/model/src/test/java/lcsb/mapviewer/model/map/species/ElementComparatorTest.java
index 4c8e741187..b6408a09ad 100644
--- a/model/src/test/java/lcsb/mapviewer/model/map/species/ElementComparatorTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/map/species/ElementComparatorTest.java
@@ -307,4 +307,24 @@ public class ElementComparatorTest extends ModelTestFunctions {
     assertEquals(0, comparator.compare(species2, species1));
   }
 
+  @Test
+  public void testCompareImmediateLink() throws Exception {
+    SimpleMolecule species1 = createSimpleMolecule();
+    SimpleMolecule species2 = new SimpleMolecule(species1);
+
+    species1.setImmediateLink(faker.internet().url());
+    assertTrue(comparator.compare(species1, species2) != 0);
+    assertTrue(comparator.compare(species2, species1) != 0);
+
+    species1 = createSimpleMolecule();
+    species2 = createSimpleMolecule();
+
+    species1.setImmediateLink(faker.internet().url());
+    species2.setImmediateLink(species1.getImmediateLink());
+
+    assertEquals(0, comparator.compare(species1, species2));
+    assertEquals(0, comparator.compare(species2, species1));
+
+  }
+
 }
diff --git a/model/src/test/java/lcsb/mapviewer/model/map/species/ElementTest.java b/model/src/test/java/lcsb/mapviewer/model/map/species/ElementTest.java
index 1a5e038d82..2bab07e314 100644
--- a/model/src/test/java/lcsb/mapviewer/model/map/species/ElementTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/map/species/ElementTest.java
@@ -1,22 +1,5 @@
 package lcsb.mapviewer.model.map.species;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.awt.geom.Point2D;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mockito;
-
 import lcsb.mapviewer.ModelTestFunctions;
 import lcsb.mapviewer.common.Configuration;
 import lcsb.mapviewer.common.exception.InvalidArgumentException;
@@ -30,10 +13,27 @@ import lcsb.mapviewer.model.map.model.ElementSubmodelConnection;
 import lcsb.mapviewer.model.map.model.Model;
 import lcsb.mapviewer.model.map.model.ModelData;
 import lcsb.mapviewer.model.map.model.ModelFullIndexed;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import java.awt.geom.Point2D;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 
 public class ElementTest extends ModelTestFunctions {
 
-  private static double EPSILON = Configuration.EPSILON;
+  private static final double EPSILON = Configuration.EPSILON;
 
   @Before
   public void setUp() throws Exception {
@@ -103,9 +103,11 @@ public class ElementTest extends ModelTestFunctions {
     GenericProtein protein = new GenericProtein();
     protein.setId(-17);
     protein.setSubmodel(new ElementSubmodelConnection());
+    protein.setImmediateLink(faker.internet().url());
     Element copy = new GenericProtein(protein);
     assertNotNull(copy);
     assertEquals(protein.getId(), copy.getId());
+    assertEquals(protein.getImmediateLink(), copy.getImmediateLink());
   }
 
   @Test
@@ -350,7 +352,7 @@ public class ElementTest extends ModelTestFunctions {
     synonyms = new ArrayList<>();
     synonyms.add(syn);
     element.addSynonyms(synonyms);
-    assertFalse(syn.equals(element.getSynonyms().get(1)));
+    assertNotEquals(syn, element.getSynonyms().get(1));
   }
 
   @Test
@@ -369,7 +371,7 @@ public class ElementTest extends ModelTestFunctions {
     formerSymbols = new ArrayList<>();
     formerSymbols.add(syn);
     element.addFormerSymbols(formerSymbols);
-    assertFalse(syn.equals(element.getFormerSymbols().get(1)));
+    assertNotEquals(syn, element.getFormerSymbols().get(1));
   }
 
 }
-- 
GitLab