From 87f6bfbdfb98b59df65e91858cca83afeb322082 Mon Sep 17 00:00:00 2001 From: Piotr Gawron Date: Fri, 28 Feb 2020 09:45:22 +0100 Subject: [PATCH 1/3] when there is a problem log info --- .../converter/model/sbgnml/SbgnmlXmlConverter.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlConverter.java b/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlConverter.java index 71eb72f5a..1292b46c4 100644 --- a/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlConverter.java +++ b/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlConverter.java @@ -9,6 +9,8 @@ import javax.xml.transform.stream.StreamSource; import org.apache.commons.io.output.ByteArrayOutputStream; import org.apache.commons.text.StringEscapeUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.LogEvent; import org.sbgn.SbgnUtil; import org.sbgn.bindings.Sbgn; @@ -22,6 +24,8 @@ import lcsb.mapviewer.model.map.model.Model; @Component public class SbgnmlXmlConverter extends Converter { + private static Logger logger = LogManager.getLogger(); + @Override public Model createModel(ConverterParams params) throws InvalidInputDataExecption, ConverterException { SbgnmlXmlParser parser = new SbgnmlXmlParser(); @@ -43,7 +47,8 @@ public class SbgnmlXmlConverter extends Converter { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - // Use the factory to create a template containing the xsl file that deals with these issues: + // Use the factory to create a template containing the xsl file that deals with + // these issues: // https://github.com/iVis-at-Bilkent/newt/issues/536 // https://git-r3lab.uni.lu/minerva/core/issues/1127 Templates template = factory @@ -88,6 +93,7 @@ public class SbgnmlXmlConverter extends Converter { if (notes.length() > 0) { int position = xml.indexOf("" + -- GitLab From 9bbf3ae2c9067ed5453c71b8fe603696f8b14368 Mon Sep 17 00:00:00 2001 From: Piotr Gawron Date: Fri, 28 Feb 2020 11:08:22 +0100 Subject: [PATCH 2/3] handle reaction staring and ending in the same point in cell designer --- CHANGELOG | 2 + .../CellDesignerLineTransformation.java | 42 +- .../CellDesignerXmlParserTest.java | 12 + .../CellDesignerLineTransformationTest.java | 26 +- .../reaction_start_and_end_are_equal.xml | 160 ++++ .../converter/model/sbml/SbmlParserTest.java | 8 + .../testFiles/problem_with_export_to_cd.xml | 869 ++++++++++++++++++ 7 files changed, 1100 insertions(+), 19 deletions(-) create mode 100644 converter-CellDesigner/testFiles/problematic/reaction_start_and_end_are_equal.xml create mode 100644 converter-sbml/testFiles/problem_with_export_to_cd.xml diff --git a/CHANGELOG b/CHANGELOG index 1c7ea17cb..93fc09f21 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -7,6 +7,8 @@ minerva (15.0.0~beta.2) stable; urgency=medium * Bug fix: antisenseRNA shape is infered from SBGN when antisenseRNA text is present in glyph label (#1114) * Bug fix: export to SBGN sometimes crashed due to concurrency issues (#1126) + * Bug fix: CellDesigner models where start and end point of reaction was the + same were not handled properly (#1131) -- Piotr Gawron Wed, 27 Feb 2020 14:00:00 +0200 diff --git a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/geometry/helper/CellDesignerLineTransformation.java b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/geometry/helper/CellDesignerLineTransformation.java index dc82b6b5f..a67189cd1 100644 --- a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/geometry/helper/CellDesignerLineTransformation.java +++ b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/geometry/helper/CellDesignerLineTransformation.java @@ -7,6 +7,7 @@ import java.util.List; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import lcsb.mapviewer.common.Configuration; import lcsb.mapviewer.common.exception.InvalidArgumentException; import lcsb.mapviewer.common.geometry.LineTransformation; import lcsb.mapviewer.common.geometry.PointTransformation; @@ -67,6 +68,15 @@ public class CellDesignerLineTransformation extends LineTransformation { double dx2 = -dy1; double dy2 = dx1; + double distDx = dx1 * dx1 + dy1 * dy1; + + // this is special case if end and start point are equal then CellDesigner uses + // relative coordinates + if (distDx <= Configuration.EPSILON) { + dx1 = 1; + dy2 = 1; + } + result.add(new Point2D.Double(startPoint.getX(), startPoint.getY())); if (midPoints != null) { @@ -74,6 +84,7 @@ public class CellDesignerLineTransformation extends LineTransformation { if (!pt.isValidPoint(p)) { throw new InvalidArgumentException("Invalid point: " + p); } + double x = startPoint.getX() + dx1 * p.getX() + dx2 * p.getY(); double y = startPoint.getY() + dy1 * p.getX() + dy2 * p.getY(); result.add(new Point2D.Double(x, y)); @@ -86,8 +97,8 @@ public class CellDesignerLineTransformation extends LineTransformation { } /** - * Transform line of typical xy coordinates into coordinates used by - * celldesigner. + * Transform line of typical x,y coordinates into coordinates used by + * CellDesigner. * * CellDesigner format stores coordinates of a line in a different base. In this * base we have two points that define a base: vector between these points is 1 @@ -120,19 +131,24 @@ public class CellDesignerLineTransformation extends LineTransformation { List result = new ArrayList(); if (dy * dy + dx * dx == 0) { - throw new InvalidArgumentException("First and last point in the line must differ but found: " - + line.getBeginPoint() + ", " + line.getEndPoint()); - } + // this is special case - if start and end point are equals then cell designer + // requires relative coordinates + for (int i = 1; i < line.getPoints().size() - 1; i++) { + double ox = line.getPoints().get(i).getX(); + double oy = line.getPoints().get(i).getY(); - for (int i = 1; i < line.getPoints().size() - 1; i++) { - double ox = line.getPoints().get(i).getX(); - double oy = line.getPoints().get(i).getY(); - - double py = (dy * (ax - ox) + dx * (oy - ay)) / (dy * dy + dx * dx); - double px = (dx * (ox - ax) + dy * (oy - ay)) / (dx * dx + dy * dy); - result.add(new Point2D.Double(px, py)); + result.add(new Point2D.Double(ox - ax, oy - ay)); + } + } else { + for (int i = 1; i < line.getPoints().size() - 1; i++) { + double ox = line.getPoints().get(i).getX(); + double oy = line.getPoints().get(i).getY(); + + double py = (dy * (ax - ox) + dx * (oy - ay)) / (dy * dy + dx * dx); + double px = (dx * (ox - ax) + dy * (oy - ay)) / (dx * dx + dy * dy); + result.add(new Point2D.Double(px, py)); + } } - return result; } } 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 6f3f15354..958002846 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 @@ -429,6 +429,18 @@ public class CellDesignerXmlParserTest extends CellDesignerTestFunctions { assertNotNull(model); } + @Test + public void testReactionStartAndEndEqual() throws Exception { + CellDesignerXmlParser parser = new CellDesignerXmlParser(); + Model model = parser + .createModel(new ConverterParams().filename("testFiles/problematic/reaction_start_and_end_are_equal.xml").sizeAutoAdjust(false)); + testXmlSerialization(model); + Reaction r = model.getReactions().iterator().next(); + assertTrue(r.getReactants().get(0).getLine().length() > 0); + assertTrue(r.getProducts().get(0).getLine().length() > 0); + assertTrue(r.getLine().length() > 0); + } + @Test(expected = InvalidInputDataExecption.class) public void testInvalidModifierType() throws Exception { CellDesignerXmlParser parser = new CellDesignerXmlParser(); diff --git a/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/geometry/helper/CellDesignerLineTransformationTest.java b/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/geometry/helper/CellDesignerLineTransformationTest.java index 44e0f1629..8989511ea 100644 --- a/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/geometry/helper/CellDesignerLineTransformationTest.java +++ b/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/geometry/helper/CellDesignerLineTransformationTest.java @@ -10,6 +10,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.*; +import lcsb.mapviewer.common.Configuration; import lcsb.mapviewer.common.exception.InvalidArgumentException; import lcsb.mapviewer.common.geometry.PointTransformation; import lcsb.mapviewer.converter.model.celldesigner.CellDesignerTestFunctions; @@ -186,11 +187,24 @@ public class CellDesignerLineTransformationTest extends CellDesignerTestFunction lineTransformation.getPointsFromLine(new PolylineData()); } - @Test(expected = InvalidArgumentException.class) - public void testGetPointsFromInvalidLine3() { - PolylineData line = new PolylineData(); - line.getPoints().add(new Point2D.Double()); - line.getPoints().add(new Point2D.Double()); - lineTransformation.getPointsFromLine(line); + @Test + public void testGetPointsFromLineStartingAndEndingInTheSamePoint() { + Point2D startPoint = new Point2D.Double(1, 5); + Point2D endPoint = new Point2D.Double(1, 5); + + List points = new ArrayList(); + points.add(new Point2D.Double(1.5, 2.5)); + points.add(new Point2D.Double(12, 13)); + points.add(new Point2D.Double(30, 40)); + + PolylineData line = new PolylineData(lineTransformation.getLinePointsFromPoints(startPoint, endPoint, points)); + + for (int i = 0; i < points.size(); i++) { + Point2D point = line.getPoints().get(i + 1); + + assertEquals(startPoint.getX() + points.get(i).getX(), point.getX(), Configuration.EPSILON); + assertEquals(startPoint.getY() + points.get(i).getY(), point.getY(), Configuration.EPSILON); + } } + } diff --git a/converter-CellDesigner/testFiles/problematic/reaction_start_and_end_are_equal.xml b/converter-CellDesigner/testFiles/problematic/reaction_start_and_end_are_equal.xml new file mode 100644 index 000000000..39c4624e1 --- /dev/null +++ b/converter-CellDesigner/testFiles/problematic/reaction_start_and_end_are_equal.xml @@ -0,0 +1,160 @@ + + + + + +4.0 + + + + + +inactive + + + + + + + + + + + + + + + + + + +inactive + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +inside + +ION +s1 + + + + + + + +inside + +ION +s2 + + + + + + + + + +STATE_TRANSITION + + + + + + + + + + + + + + + + + +0.0,-47.5 80.0,-37.5 + + + + + + + +sa1 + + + + + + + + +sa2 + + + + + + + + diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlParserTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlParserTest.java index 7f5dd7cc7..5e54dc11e 100644 --- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlParserTest.java +++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlParserTest.java @@ -13,6 +13,7 @@ import org.junit.Test; import lcsb.mapviewer.commands.CreateHierarchyCommand; import lcsb.mapviewer.common.Configuration; import lcsb.mapviewer.converter.*; +import lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser; import lcsb.mapviewer.model.map.compartment.Compartment; import lcsb.mapviewer.model.map.model.Model; import lcsb.mapviewer.model.map.reaction.*; @@ -238,4 +239,11 @@ public class SbmlParserTest extends SbmlTestFunctions { assertNotNull(xml); } + @Test + public void testProblemWithCellDesignerExport() throws Exception{ + Model m = parser.createModel(new ConverterParams().filename("testFiles/problem_with_export_to_cd.xml")); + String xml = new CellDesignerXmlParser().model2String(m); + assertNotNull(xml); + } + } diff --git a/converter-sbml/testFiles/problem_with_export_to_cd.xml b/converter-sbml/testFiles/problem_with_export_to_cd.xml new file mode 100644 index 000000000..eb8b0f6fd --- /dev/null +++ b/converter-sbml/testFiles/problem_with_export_to_cd.xml @@ -0,0 +1,869 @@ + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file -- GitLab From f66c2e0e69e1b565c669b29c0041268134d9e6a5 Mon Sep 17 00:00:00 2001 From: Piotr Gawron Date: Fri, 28 Feb 2020 12:04:22 +0100 Subject: [PATCH 3/3] export to sbgn crashed due to prblem with appending warnings --- .../model/sbgnml/SbgnmlXmlConverter.java | 60 ++++++++++++++----- 1 file changed, 44 insertions(+), 16 deletions(-) diff --git a/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlConverter.java b/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlConverter.java index 1292b46c4..9f20c7308 100644 --- a/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlConverter.java +++ b/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlConverter.java @@ -2,23 +2,26 @@ package lcsb.mapviewer.converter.model.sbgnml; import java.io.*; -import javax.xml.bind.JAXBException; +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.*; +import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.apache.commons.io.output.ByteArrayOutputStream; -import org.apache.commons.text.StringEscapeUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.LogEvent; import org.sbgn.SbgnUtil; import org.sbgn.bindings.Sbgn; import org.springframework.stereotype.Component; +import org.w3c.dom.*; -import lcsb.mapviewer.common.MimeType; -import lcsb.mapviewer.common.MinervaLoggerAppender; +import lcsb.mapviewer.common.*; import lcsb.mapviewer.converter.*; +import lcsb.mapviewer.model.LogMarker; +import lcsb.mapviewer.model.ProjectLogEntry; import lcsb.mapviewer.model.map.model.Model; @Component @@ -79,7 +82,18 @@ public class SbgnmlXmlConverter extends Converter { if (!appender.getWarnings().isEmpty()) { for (LogEvent event : appender.getWarnings()) { notes.append("\n"); - notes.append(event.getMessage().getFormattedMessage()); + String entry = null; + if (event.getMarker() != null) { + if (event.getMarker() instanceof LogMarker) { + ProjectLogEntry e = ((LogMarker) event.getMarker()).getEntry(); + entry = "[" + e.getObjectClass() + " " + e.getObjectIdentifier() + "]\t" + event.getMessage().getFormattedMessage(); + } + } + if (entry == null) { + entry = event.getMessage().getFormattedMessage(); + } + + notes.append(entry); } } } finally { @@ -89,19 +103,33 @@ public class SbgnmlXmlConverter extends Converter { ByteArrayOutputStream baos = new ByteArrayOutputStream(); SbgnUtil.writeTo(exportedData, baos); - String xml = new String(baos.toByteArray(), "UTF-8"); + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + Document input = factory + .newDocumentBuilder() + .parse(baos.toInputStream()); + if (notes.length() > 0) { - int position = xml.indexOf("" + - StringEscapeUtils.escapeXml10(notes.toString()) + "\n "; - xml = xml.substring(0, position) + notesNode + xml.substring(position); + Element bodyNode = input.createElement("body"); + // bodyNode.setAttribute("xmlns","http://www.w3.org/1999/xhtml"); + bodyNode.setTextContent(notes.toString()); + + Node notesNode = input.createElement("notes"); + notesNode.appendChild(bodyNode); + + input.getFirstChild().appendChild(notesNode); } - return xml; - } catch (IOException | JAXBException e) { + + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + Transformer xformer = transformerFactory.newTransformer(); + xformer.setOutputProperty(OutputKeys.INDENT, "yes"); + StringWriter output = new StringWriter(); + xformer.transform(new DOMSource(input), new StreamResult(output)); + + return output.toString(); + } catch (Exception e) { throw new ConverterException(e); } } -- GitLab