diff --git a/console/src/main/java/lcsb/mapviewer/run/LegendGenerator.java b/console/src/main/java/lcsb/mapviewer/run/LegendGenerator.java index 077b9a4064b56d26b2a368dbd51dfe74bc31acaa..9df1420f0ec98316d275ecea40f8b14f17fda233 100644 --- a/console/src/main/java/lcsb/mapviewer/run/LegendGenerator.java +++ b/console/src/main/java/lcsb/mapviewer/run/LegendGenerator.java @@ -4,6 +4,7 @@ import java.awt.Desktop; import java.io.File; import java.io.IOException; +import lcsb.mapviewer.commands.CopyCommand; import lcsb.mapviewer.converter.ConverterParams; import lcsb.mapviewer.converter.InvalidInputDataExecption; import lcsb.mapviewer.converter.graphics.AbstractImageGenerator.Params; @@ -29,22 +30,22 @@ public class LegendGenerator { * */ private enum LegendObject { - /** - * First legend element. - */ - LEGEND_A("testFiles/legend/legend_5_2.xml", "legend_a.png", 50, 0, 600, 480), - /** - * Second legend element. - */ - LEGEND_B("testFiles/legend/legend_4_3.xml", "legend_b.png", 920, 0, 600, 480), - /** - * Third legend element. - */ - LEGEND_C("testFiles/legend/legend_4_4.xml", "legend_c.png", 500, 0, 600, 480), +// /** +// * First legend element. +// */ +// LEGEND_A("testFiles/legend/legend_5_2.xml", "legend_a.png", 50, 0, 600, 480), +// /** +// * Second legend element. +// */ +// LEGEND_B("testFiles/legend/legend_4_3.xml", "legend_b.png", 920, 0, 600, 480), +// /** +// * Third legend element. +// */ +// LEGEND_C("testFiles/legend/legend_4_4.xml", "legend_c.png", 500, 0, 600, 480), /** * Fourth legend element. */ - LEGEND_D("testFiles/legend/legend_4_5.xml", "legend_d.png", 500, 0, 600, 480); + LEGEND_D("C:/Users/piotr.gawron/Desktop/test.xml", "legend_d.png", 0, 0, 1280, 480); /** * File with the legend data in CellDEsigner format. @@ -157,8 +158,9 @@ public class LegendGenerator { // and save it to leged.png String fileName = lo.outputFile; + Model copy = new CopyCommand(model).execute(); PngImageGenerator generator = new PngImageGenerator(new Params() - .scale(ZOOM_FACTOR).x(lo.startX).y(lo.startY).width(lo.width).height(lo.height).model(model)); + .scale(ZOOM_FACTOR).x(lo.startX).y(lo.startY).width(lo.width).height(lo.height).model(copy).level(2).semanticZoom(true)); generator.saveToFile(fileName); Desktop.getDesktop().open(new File(fileName)); } diff --git a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParser.java b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParser.java index a1ab11fc4ad10cb3e8b74f6fb9e6b0196013f9b4..ccec089ae552859c1d2c1d97aabab79ff12d9676 100644 --- a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParser.java +++ b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParser.java @@ -1,6 +1,7 @@ package lcsb.mapviewer.converter.model.celldesigner.annotation; import java.util.ArrayList; +import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -21,6 +22,8 @@ import lcsb.mapviewer.common.comparator.StringSetComparator; import lcsb.mapviewer.common.exception.InvalidArgumentException; import lcsb.mapviewer.common.exception.InvalidXmlSchemaException; import lcsb.mapviewer.common.exception.NotImplementedException; +import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerElement; +import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerSpecies; import lcsb.mapviewer.model.map.AnnotatedObject; import lcsb.mapviewer.model.map.MiriamData; import lcsb.mapviewer.model.map.MiriamRelationType; @@ -100,25 +103,90 @@ public class RestAnnotationParser extends XmlParser { * @return note string with structural information about element */ public String createAnnotationString(Element element) { - String symbol = element.getSymbol(); - if (symbol == null) { - symbol = ""; - } - String name = element.getFullName(); - if (name == null) { - name = ""; - } + return createAnnotationString(element, false); + } + + /** + * Creates note string with structural information about element. + * + * @param element + * element for which notes are created + * @param forceFullInfo + * when true annotation string will contain information about empty + * fields + * @return note string with structural information about element + */ + public String createAnnotationString(Element element, boolean forceFullInfo) { + Set<MiriamData> data = element.getMiriamData(); StringBuilder sb = new StringBuilder(); - sb.append(NoteField.SYMBOL.getCommonName() + ": " + symbol + "\n"); - sb.append(NoteField.NAME.getCommonName() + ": " + name + "\n"); - // descrfiption will be in the string anyways so we don't need to repeat it - sb.append(NoteField.DESCRIPTION.getCommonName() + ": \n"); - sb.append(NoteField.PREVIOUS_SYMBOLS.getCommonName() + ": " + StringUtils.join(element.getFormerSymbols(), ", ") + "\n"); - sb.append(NoteField.SYNONYMS.getCommonName() + ": " + StringUtils.join(element.getSynonyms(), ", ") + "\n"); + sb.append(createEntry(NoteField.SYMBOL, element.getSymbol(), forceFullInfo)); + sb.append(createEntry(NoteField.NAME, element.getFullName(), forceFullInfo)); + sb.append(createEntry(NoteField.PREVIOUS_SYMBOLS, element.getFormerSymbols(), forceFullInfo)); + sb.append(createEntry(NoteField.SYNONYMS, element.getSynonyms(), forceFullInfo)); + sb.append(createEntry(NoteField.HGNC, filterMiriam(data, MiriamType.HGNC), forceFullInfo)); + sb.append(createEntry(NoteField.ENTREZ, filterMiriam(data, MiriamType.ENTREZ), forceFullInfo)); + sb.append(createEntry(NoteField.REFSEQ, filterMiriam(data, MiriamType.REFSEQ), forceFullInfo)); + sb.append(createEntry(NoteField.REACTOME, filterMiriam(data, MiriamType.REACTOME), forceFullInfo)); + sb.append(createEntry(NoteField.PUBMED, filterMiriam(data, MiriamType.PUBMED), forceFullInfo)); + sb.append(createEntry(NoteField.KEGG_GENES, filterMiriam(data, MiriamType.KEGG_GENES), forceFullInfo)); + sb.append(createEntry(NoteField.PANTHER, filterMiriam(data, MiriamType.PANTHER), forceFullInfo)); + sb.append(createEntry(NoteField.DESCRIPTION, null, forceFullInfo)); + sb.append(createEntry(NoteField.ABBREVIATION, element.getAbbreviation(), forceFullInfo)); + sb.append(createEntry(NoteField.SEMANTIC_ZOOM_LEVEL_VISIBILITY, element.getSemanticZoomLevelVisibility(), forceFullInfo)); + sb.append(createEntry(NoteField.CHARGED_FORMULA, element.getFormula(), forceFullInfo)); + if (element instanceof Species) { + sb.append(createEntry(NoteField.CHARGE, ((Species) element).getCharge(), forceFullInfo)); + } + sb.append("\n"); return sb.toString(); } + private List<MiriamData> filterMiriam(Collection<MiriamData> miriamDataSet, MiriamType type) { + List<MiriamData> result = new ArrayList<>(); + for (MiriamData miriamData : miriamDataSet) { + if (miriamData.getDataType().equals(type)) { + result.add(miriamData); + } + } + return result; + } + + private String createEntry(NoteField type, Object value, boolean forceFullInfo) { + if (value == null) { + if (forceFullInfo) { + return type.getCommonName() + ": \n"; + } else { + return ""; + } + } else if (value instanceof String) { + return type.getCommonName() + ": " + value + "\n"; + } else if (value instanceof Integer) { + return type.getCommonName() + ": " + value + "\n"; + } else if (value instanceof Collection) { + Collection<?> collection = (Collection) value; + if (collection.size() > 0 || forceFullInfo) { + String result = ""; + for (Object object : collection) { + if (!result.equals("")) { + result = result + ", "; + } + if (object instanceof MiriamData) { + result += ((MiriamData) object).getResource(); + } else { + result += object; + } + + } + return type.getCommonName() + ": " + result + "\n"; + } else { + return ""; + } + } else { + throw new InvalidArgumentException("Unknown class type: " + value.getClass()); + } + } + /** * Returns value for the type of the structurized annotation. Structurized * annotation is in format: diff --git a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/compartment/CompartmentXmlParser.java b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/compartment/CompartmentXmlParser.java index 5c51659632457f51772e78fbcb1d2b7546a0222f..80bbf90fe849da95df3d1532716d03bc06b35dd7 100644 --- a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/compartment/CompartmentXmlParser.java +++ b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/compartment/CompartmentXmlParser.java @@ -7,6 +7,7 @@ import org.w3c.dom.NodeList; import lcsb.mapviewer.common.Pair; import lcsb.mapviewer.common.exception.InvalidXmlSchemaException; import lcsb.mapviewer.converter.model.celldesigner.CellDesignerElementCollection; +import lcsb.mapviewer.converter.model.celldesigner.annotation.RestAnnotationParser; import lcsb.mapviewer.converter.model.celldesigner.annotation.XmlAnnotationParser; import lcsb.mapviewer.converter.model.celldesigner.species.AbstractElementXmlParser; import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerCompartment; @@ -26,12 +27,12 @@ public class CompartmentXmlParser extends AbstractElementXmlParser<CellDesignerC * Default class logger. */ @SuppressWarnings("unused") - private static Logger logger = Logger.getLogger(CompartmentXmlParser.class.getName()); + private static Logger logger = Logger.getLogger(CompartmentXmlParser.class.getName()); /** * Parser used to retrieve Miriam data for the element. */ - private XmlAnnotationParser xmlAnnotationParser = new XmlAnnotationParser(); + private XmlAnnotationParser xmlAnnotationParser = new XmlAnnotationParser(); /** * Collection of {@link CellDesignerElement cell designer elements} parsed @@ -39,6 +40,11 @@ public class CompartmentXmlParser extends AbstractElementXmlParser<CellDesignerC */ private CellDesignerElementCollection elements; + /** + * Xml parser used for processing notes into structurized data. + */ + private RestAnnotationParser rap = new RestAnnotationParser(); + /** * Default constructor. * @@ -63,6 +69,8 @@ public class CompartmentXmlParser extends AbstractElementXmlParser<CellDesignerC if (node.getNodeType() == Node.ELEMENT_NODE) { if (node.getNodeName().equalsIgnoreCase("annotation")) { parseAnnotationNode(compartment, node); + } else if (node.getNodeName().equalsIgnoreCase("notes")) { + compartment.setNotes(rap.getNotes(node)); } else { throw new InvalidXmlSchemaException("Unknown element of Compartment: " + node.getNodeName()); } @@ -132,8 +140,7 @@ public class CompartmentXmlParser extends AbstractElementXmlParser<CellDesignerC sb.append("size=\"1\" "); sb.append("units=\"volume\" "); String parentName = "default"; - - + if (compartment.getCompartment() != null && !(compartment.getCompartment() instanceof PathwayCompartment)) { parentName = elements.getElementId(compartment.getCompartment()); } @@ -149,6 +156,15 @@ public class CompartmentXmlParser extends AbstractElementXmlParser<CellDesignerC sb.append("</celldesigner:extension>\n"); sb.append(xmlAnnotationParser.dataSetToXmlString(compartment.getMiriamData())); sb.append("</annotation>\n"); + sb.append("<notes>"); + sb.append("<html xmlns=\"http://www.w3.org/1999/xhtml\"><head><title/></head><body>"); + RestAnnotationParser rap = new RestAnnotationParser(); + sb.append(rap.createAnnotationString(compartment)); + if (compartment.getNotes() != null) { + sb.append(compartment.getNotes()); + } + sb.append("</body></html>"); + sb.append("</notes>\n"); sb.append("</compartment>\n"); return sb.toString(); } diff --git a/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/CellDesignerXmlParserTest.java b/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/CellDesignerXmlParserTest.java index d61b82e9ce953779a6573159251e049ad34b7598..445722f2721ab372ecf8e31f9188c3822fb3551b 100644 --- a/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/CellDesignerXmlParserTest.java +++ b/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/CellDesignerXmlParserTest.java @@ -975,4 +975,20 @@ public class CellDesignerXmlParserTest extends CellDesignerTestFunctions { } } + @Test + public void testCompartmentWithNotes() throws Exception { + try { + CellDesignerXmlParser parser = new CellDesignerXmlParser(); + Model model = parser.createModel(new ConverterParams().filename("testFiles/compartment_with_notes.xml")); + model.setName(null); + assertNotNull(model); + String str = parser.toXml(model); + Model model2 = parser.createModel(new ConverterParams().inputStream(new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8)))); + assertEquals(0, new ModelComparator().compare(model, model2)); + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + } + } diff --git a/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParserTest.java b/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParserTest.java index f8ab6d2d441325298cd4f0bc6455476c01aca300..6cca1af6e56bd8d559e4375b6f6ca2a69282bba5 100644 --- a/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParserTest.java +++ b/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParserTest.java @@ -22,6 +22,7 @@ import org.w3c.dom.Node; import lcsb.mapviewer.common.exception.InvalidArgumentException; import lcsb.mapviewer.common.exception.NotImplementedException; import lcsb.mapviewer.converter.model.celldesigner.CellDesignerTestFunctions; +import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerElement; import lcsb.mapviewer.model.map.AnnotatedObject; import lcsb.mapviewer.model.map.MiriamData; import lcsb.mapviewer.model.map.MiriamRelationType; @@ -286,10 +287,19 @@ public class RestAnnotationParserTest extends CellDesignerTestFunctions { GenericProtein element = new GenericProtein("id"); element.addFormerSymbol(former1); element.addFormerSymbol(former2); - String str = rap.createAnnotationString(element); + element.setCharge(1); + String str = rap.createAnnotationString(element, true); + logger.debug(str); assertTrue(str.contains(former1)); assertTrue(str.contains(former2)); + for (NoteField field : NoteField.values()) { + if (field.getClazz().isAssignableFrom(element.getClass()) || CellDesignerElement.class.isAssignableFrom(field.getClazz())) { + assertTrue("Export string doesn't contain info about: " + field.getCommonName(), str.indexOf(field.getCommonName()) >= 0); + } + + } + } catch (Exception e) { e.printStackTrace(); throw e; diff --git a/converter-CellDesigner/testFiles/compartment_with_notes.xml b/converter-CellDesigner/testFiles/compartment_with_notes.xml new file mode 100644 index 0000000000000000000000000000000000000000..9dfe7f29eeea19f24a81caa36715b6073863781e --- /dev/null +++ b/converter-CellDesigner/testFiles/compartment_with_notes.xml @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="UTF-8"?> +<sbml xmlns="http://www.sbml.org/sbml/level2/version4" xmlns:celldesigner="http://www.sbml.org/2001/ns/celldesigner" level="2" version="4"> +<model metaid="untitled" id="untitled"> +<annotation> +<celldesigner:extension> +<celldesigner:modelVersion>4.0</celldesigner:modelVersion> +<celldesigner:modelDisplay sizeX="600" sizeY="400"/> +<celldesigner:listOfCompartmentAliases> +<celldesigner:compartmentAlias id="ca1" compartment="c1"> +<celldesigner:class>SQUARE</celldesigner:class> +<celldesigner:bounds x="108.0" y="82.0" w="265.0" h="160.0"/> +<celldesigner:namePoint x="233.0" y="205.5"/> +<celldesigner:doubleLine thickness="12.0" outerWidth="2.0" innerWidth="1.0"/> +<celldesigner:paint color="ffcccc00" scheme="Color"/> +<celldesigner:info state="empty" angle="-1.5707963267948966"/> +</celldesigner:compartmentAlias> +</celldesigner:listOfCompartmentAliases> +<celldesigner:listOfComplexSpeciesAliases/> +<celldesigner:listOfSpeciesAliases/> +<celldesigner:listOfGroups/> +<celldesigner:listOfProteins/> +<celldesigner:listOfGenes/> +<celldesigner:listOfRNAs/> +<celldesigner:listOfAntisenseRNAs/> +<celldesigner:listOfLayers/> +<celldesigner:listOfBlockDiagrams/> +</celldesigner:extension> +</annotation> +<listOfUnitDefinitions> +<unitDefinition metaid="substance" id="substance" name="substance"> +<listOfUnits> +<unit metaid="CDMT00001" kind="mole"/> +</listOfUnits> +</unitDefinition> +<unitDefinition metaid="volume" id="volume" name="volume"> +<listOfUnits> +<unit metaid="CDMT00002" kind="litre"/> +</listOfUnits> +</unitDefinition> +<unitDefinition metaid="area" id="area" name="area"> +<listOfUnits> +<unit metaid="CDMT00003" kind="metre" exponent="2"/> +</listOfUnits> +</unitDefinition> +<unitDefinition metaid="length" id="length" name="length"> +<listOfUnits> +<unit metaid="CDMT00004" kind="metre"/> +</listOfUnits> +</unitDefinition> +<unitDefinition metaid="time" id="time" name="time"> +<listOfUnits> +<unit metaid="CDMT00005" kind="second"/> +</listOfUnits> +</unitDefinition> +</listOfUnitDefinitions> +<listOfCompartments> +<compartment metaid="default" id="default" size="1" units="volume"/> +<compartment metaid="c1" id="c1" name="c1" size="1" units="volume" outside="default"> +<notes> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title/> +</head> +<body>notes +</body> +</html> +</notes> +<annotation> +<celldesigner:extension> +<celldesigner:name>c1</celldesigner:name> +</celldesigner:extension> +</annotation> +</compartment> +</listOfCompartments> +</model> +</sbml> diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/AbstractImageGenerator.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/AbstractImageGenerator.java index 16e997154b53d5419fbf41c379f9d409dd39ac33..4841de9b38bb51a02959f7c75562d910e30384a9 100644 --- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/AbstractImageGenerator.java +++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/AbstractImageGenerator.java @@ -739,7 +739,7 @@ public abstract class AbstractImageGenerator { // be // visible. - if (compartment.getVisibilityLevel() > level) { + if (compartment.getVisibilityLevel() > level && params.nested) { return; } @@ -821,7 +821,7 @@ public abstract class AbstractImageGenerator { // VisibilityLevel is big enough, then it is // displayed. - if (species.getVisibilityLevel() > level) { + if (species.getVisibilityLevel() > level && params.nested) { return; } diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverter.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverter.java index 0f3fbea1f767125d5922bbed62ae53ee300e4999..18ddccbf22573d7029c07b0229f6f48059ca165c 100644 --- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverter.java +++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverter.java @@ -173,11 +173,9 @@ public abstract class BioEntityConverter<T extends AnnotatedObject> { } else if (!isAnyReactantVisible(((Reaction) bioEntity).getReactants(), params)) { result = false; } - } else { throw new InvalidArgumentException("Unknown class type: " + bioEntity.getClass()); } - return result; } return true; diff --git a/converter/src/main/java/lcsb/mapviewer/converter/OverviewParser.java b/converter/src/main/java/lcsb/mapviewer/converter/OverviewParser.java index ef0849c07a451034cc2d772aec92e15753b47703..b9388ab2b7cda60cdf0849a52b72dc4dc8feb366 100644 --- a/converter/src/main/java/lcsb/mapviewer/converter/OverviewParser.java +++ b/converter/src/main/java/lcsb/mapviewer/converter/OverviewParser.java @@ -384,7 +384,7 @@ public class OverviewParser { try { oml.setxCoord(Double.valueOf(coord.split(",")[0])); oml.setyCoord(Double.valueOf(coord.split(",")[1])); - } catch (NumberFormatException e) { + } catch (NumberFormatException | ArrayIndexOutOfBoundsException e) { throw new InvalidCoordinatesFile("Problem with parsing coordinates in file \"" + COORDINATES_FILENAME + "\". Problematic text: \"" + coord + "\"", e); } try { diff --git a/model-command/src/main/java/lcsb/mapviewer/commands/CopyCommand.java b/model-command/src/main/java/lcsb/mapviewer/commands/CopyCommand.java index 30148865590f3bd8c3275ded92f250b0e09a7537..5ea871caf6bef7f802521ec6556f9b5c83da107a 100644 --- a/model-command/src/main/java/lcsb/mapviewer/commands/CopyCommand.java +++ b/model-command/src/main/java/lcsb/mapviewer/commands/CopyCommand.java @@ -176,6 +176,7 @@ public class CopyCommand extends NewModelCommand { if (alias instanceof Compartment) { Compartment copy = ((Compartment) alias).copy(); copy.getElements().clear(); + copy.setCompartment(null); result.addElement(copy); } @@ -184,21 +185,25 @@ public class CopyCommand extends NewModelCommand { for (Element alias : model.getElements()) { if (alias instanceof Species) { Species copy = ((Species) alias).copy(); - Compartment ca = copy.getCompartment(); copy.setCompartment(null); - - // the trick is that in addAlias also some connections are added, so - // lets clear info about parents - result.addElement(copy); - if (ca != null) { - ca = result.getElementByElementId(ca.getElementId()); - copy.setCompartment(ca); + Compartment parentCompartment = alias.getCompartment(); + + if (parentCompartment != null) { + parentCompartment = result.getElementByElementId(parentCompartment.getElementId()); + copy.setCompartment(parentCompartment); } + } else if (alias instanceof Compartment) { - // we already added compartment alias - continue; + + Compartment parentCompartment = alias.getCompartment(); + + if (parentCompartment != null) { + Compartment copy = result.getElementByElementId(alias.getElementId()); + parentCompartment = result.getElementByElementId(parentCompartment.getElementId()); + copy.setCompartment(parentCompartment); + } } else { throw new InvalidClassException("Don't know what to do with: " + alias.getClass()); } diff --git a/model-command/src/test/java/lcsb/mapviewer/commands/CopyCommandTest.java b/model-command/src/test/java/lcsb/mapviewer/commands/CopyCommandTest.java index 6b2c37080b2fecc6408d3fe18389a3cd5cbb87f7..cc78f07b6e85b9845474a31b1d1373231e774cb7 100644 --- a/model-command/src/test/java/lcsb/mapviewer/commands/CopyCommandTest.java +++ b/model-command/src/test/java/lcsb/mapviewer/commands/CopyCommandTest.java @@ -1,8 +1,12 @@ package lcsb.mapviewer.commands; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import java.awt.geom.Point2D; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.nio.charset.StandardCharsets; @@ -14,8 +18,11 @@ import org.junit.Test; import lcsb.mapviewer.common.exception.InvalidArgumentException; import lcsb.mapviewer.converter.ConverterParams; import lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser; +import lcsb.mapviewer.model.graphics.PolylineData; import lcsb.mapviewer.model.map.OverviewImage; import lcsb.mapviewer.model.map.OverviewModelLink; +import lcsb.mapviewer.model.map.compartment.Compartment; +import lcsb.mapviewer.model.map.compartment.SquareCompartment; import lcsb.mapviewer.model.map.layout.graphics.Layer; import lcsb.mapviewer.model.map.model.ElementSubmodelConnection; import lcsb.mapviewer.model.map.model.Model; @@ -23,9 +30,12 @@ import lcsb.mapviewer.model.map.model.ModelComparator; import lcsb.mapviewer.model.map.model.ModelFullIndexed; import lcsb.mapviewer.model.map.model.ModelSubmodelConnection; import lcsb.mapviewer.model.map.model.SubmodelType; +import lcsb.mapviewer.model.map.reaction.Product; +import lcsb.mapviewer.model.map.reaction.Reactant; import lcsb.mapviewer.model.map.reaction.Reaction; -import lcsb.mapviewer.model.map.species.Element; +import lcsb.mapviewer.model.map.reaction.type.StateTransitionReaction; import lcsb.mapviewer.model.map.species.Complex; +import lcsb.mapviewer.model.map.species.Element; import lcsb.mapviewer.model.map.species.GenericProtein; public class CopyCommandTest extends CommandTestFunctions { @@ -311,4 +321,57 @@ public class CopyCommandTest extends CommandTestFunctions { } } + @Test + public void testCopyModelReaction() throws Exception { + try { + Model model = new ModelFullIndexed(null); + + Compartment c1 = new SquareCompartment("c1"); + Compartment c2 = new SquareCompartment("c2"); + c1.setSemanticZoomLevelVisibility("2"); + c2.setSemanticZoomLevelVisibility("3"); + + model.addElement(c1); + model.addElement(c2); + + GenericProtein s1 = new GenericProtein("s1"); + s1.setCompartment(c1); + model.addElement(s1); + + GenericProtein s2 = new GenericProtein("s2"); + s2.setCompartment(c2); + model.addElement(s2); + + StateTransitionReaction reaction = new StateTransitionReaction(); + Reactant reactant = new Reactant(s1); + reactant.setLine(new PolylineData(new Point2D.Double(0, 0), new Point2D.Double(10, 10))); + reaction.addReactant(reactant); + Product product = new Product(s2); + product.setLine(new PolylineData(new Point2D.Double(10, 0), new Point2D.Double(120, 10))); + reaction.addProduct(product); + reaction.setSemanticZoomLevelVisibility("4"); + + model.addReaction(reaction); + + assertTrue(s1.equals(reaction.getReactants().get(0).getElement())); + assertTrue(s2.equals(reaction.getProducts().get(0).getElement())); + + Model model2 = new CopyCommand(model).execute(); + Reaction reaction2 = model2.getReactions().iterator().next(); + + assertTrue(s1.equals(reaction.getReactants().get(0).getElement())); + assertTrue(s2.equals(reaction.getProducts().get(0).getElement())); + + assertFalse(s1.equals(reaction2.getReactants().get(0).getElement())); + assertFalse(s2.equals(reaction2.getProducts().get(0).getElement())); + + assertNotNull(reaction2.getReactants().get(0).getElement().getCompartment()); + assertNotNull(reaction2.getProducts().get(0).getElement().getCompartment()); + + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + } + } diff --git a/model/src/main/java/lcsb/mapviewer/model/map/reaction/ReactionComparator.java b/model/src/main/java/lcsb/mapviewer/model/map/reaction/ReactionComparator.java index 38a1265d1d95e5fab8495462665e6b87e592e897..1feda50e2c6575eb81fc83ab3f6554a4b0ba5adb 100644 --- a/model/src/main/java/lcsb/mapviewer/model/map/reaction/ReactionComparator.java +++ b/model/src/main/java/lcsb/mapviewer/model/map/reaction/ReactionComparator.java @@ -95,7 +95,6 @@ public class ReactionComparator implements Comparator<Reaction> { return stringComparator.compare(arg0.getNotes(), arg1.getNotes()); } - if (stringComparator.compare(arg0.getIdReaction(), arg1.getIdReaction()) != 0) { logger.debug("IdReaction different: " + arg0.getIdReaction() + ", " + arg1.getIdReaction()); return stringComparator.compare(arg0.getIdReaction(), arg1.getIdReaction()); @@ -131,6 +130,11 @@ public class ReactionComparator implements Comparator<Reaction> { logger.debug("GeneProteinReaction different: " + arg0.getGeneProteinReaction() + ", " + arg1.getGeneProteinReaction()); return stringComparator.compare(arg0.getGeneProteinReaction(), arg1.getGeneProteinReaction()); } + if (stringComparator.compare(arg0.getSemanticZoomLevelVisibility(), arg1.getSemanticZoomLevelVisibility()) != 0) { + logger.debug( + "SemanticZoomLevelVisibility different: \"" + arg0.getSemanticZoomLevelVisibility() + "\", \"" + arg1.getSemanticZoomLevelVisibility() + "\""); + return stringComparator.compare(arg0.getSemanticZoomLevelVisibility(), arg1.getSemanticZoomLevelVisibility()); + } IntegerComparator integerComparator = new IntegerComparator(); 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 386c2995adde11c9d6870a8b9b243c87ee696007..8cfbc8cc39b3c7dd6745a6ba03ecc18fafd6e91a 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 @@ -301,6 +301,7 @@ public abstract class Element implements AnnotatedObject, Serializable { addMiriamData(original.getMiriamData()); this.abbreviation = original.getAbbreviation(); this.formula = original.getFormula(); + setSemanticZoomLevelVisibility(original.getSemanticZoomLevelVisibility()); } /** 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 5f57312dad2b67e5de11b5bd2a194c3bee34190a..4d6d35a87a27c1d514e467737f9eafa1d3ecd7ae 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 @@ -84,8 +84,9 @@ public class ElementComparator implements Comparator<Element> { } /** - * This method compares only the fields that are defined in {@link Element} class in - * inheritence tree. By the design it is called by subclass comparator. + * This method compares only the fields that are defined in {@link Element} + * class in inheritence tree. By the design it is called by subclass + * comparator. * * @param arg0 * first object to compare @@ -188,6 +189,12 @@ public class ElementComparator implements Comparator<Element> { return stringComparator.compare(arg0.getFormula(), arg1.getFormula()); } + if (stringComparator.compare(arg0.getSemanticZoomLevelVisibility(), arg1.getSemanticZoomLevelVisibility()) != 0) { + logger.debug( + "SemanticZoomLevelVisibility different: \"" + arg0.getSemanticZoomLevelVisibility() + "\", \"" + arg1.getSemanticZoomLevelVisibility() + "\""); + return stringComparator.compare(arg0.getSemanticZoomLevelVisibility(), arg1.getSemanticZoomLevelVisibility()); + } + StringSetComparator stringSetComparator = new StringSetComparator(); StringListComparator stringListComparator = new StringListComparator(); diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/Species.java b/model/src/main/java/lcsb/mapviewer/model/map/species/Species.java index 237aee82abc42b6d8ce6711067084fcf8006b1b2..62875191ca8a99293cb0a87b49e0f4069b891554 100644 --- a/model/src/main/java/lcsb/mapviewer/model/map/species/Species.java +++ b/model/src/main/java/lcsb/mapviewer/model/map/species/Species.java @@ -168,7 +168,6 @@ public abstract class Species extends Element { homodimer = original.getHomodimer(); positionToCompartment = original.getPositionToCompartment(); hypothetical = original.getHypothetical(); - setSemanticZoomLevelVisibility(original.getSemanticZoomLevelVisibility()); // don't copy reaction nodes } diff --git a/model/src/test/java/lcsb/mapviewer/model/map/reaction/ReactionTest.java b/model/src/test/java/lcsb/mapviewer/model/map/reaction/ReactionTest.java index 7ea08b523f44e85ed38eec4b8868694849b6e19e..a7d39db9e7bcbecef1e5d9226d0d35b3c53118c1 100644 --- a/model/src/test/java/lcsb/mapviewer/model/map/reaction/ReactionTest.java +++ b/model/src/test/java/lcsb/mapviewer/model/map/reaction/ReactionTest.java @@ -37,9 +37,9 @@ import lcsb.mapviewer.model.map.species.Species; public class ReactionTest extends ModelTestFunctions { - Logger logger = Logger.getLogger(ReactantTest.class); + Logger logger = Logger.getLogger(ReactantTest.class); - private Species species; + private Species species; @Before public void setUp() throws Exception { @@ -171,11 +171,7 @@ public class ReactionTest extends ModelTestFunctions { try { Reaction reaction1 = new Reaction(); - try { - assertNull(reaction1.getStringType()); - fail("Exception expected"); - } catch (NotImplementedException e) { - } + assertNotNull(reaction1.getStringType()); assertNull(reaction1.getReactionRect()); int id = 61;