From e0f86ff386192bbfcb46ed34361c1e5501dee621 Mon Sep 17 00:00:00 2001 From: Lucas Schons Date: Tue, 13 Aug 2019 14:25:52 +0200 Subject: [PATCH 1/4] [#1350] Escape chars in DotFileFormatSimple - introduce test which checks escaping for DotFileFormatSimple - reformat string declarations - remove DotFormat param from checkWriteOutput(). We dont need that since we escape chars for both formats fixes #1350 --- .../dot/functions/DotFileFormatSimple.java | 10 +-- .../flink/io/impl/dot/DOTDataSinkTest.java | 14 ++--- .../functions/DotFileFormatSimpleTest.java | 61 +++++++++++++++++-- 3 files changed, 67 insertions(+), 18 deletions(-) diff --git a/gradoop-flink/src/main/java/org/gradoop/flink/io/impl/dot/functions/DotFileFormatSimple.java b/gradoop-flink/src/main/java/org/gradoop/flink/io/impl/dot/functions/DotFileFormatSimple.java index bdd8e7602298..4c3106e692af 100644 --- a/gradoop-flink/src/main/java/org/gradoop/flink/io/impl/dot/functions/DotFileFormatSimple.java +++ b/gradoop-flink/src/main/java/org/gradoop/flink/io/impl/dot/functions/DotFileFormatSimple.java @@ -22,6 +22,8 @@ import org.gradoop.common.model.impl.properties.Property; import org.gradoop.flink.model.impl.layouts.transactional.tuples.GraphTransaction; +import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4; + /** * Converts a GraphTransaction to the following .dot format: *

{@code @@ -79,17 +81,17 @@ void writeLabel(StringBuilder builder, Element element) { Properties properties = element.getProperties(); if (properties != null && properties.size() > 0) { - builder.append("label=\"").append(label).append("\""); + builder.append("label=\"").append(escapeHtml4(label)).append("\""); for (Property property: properties) { builder.append(",") - .append(property.getKey()) + .append(escapeHtml4(property.getKey())) .append("=\"") - .append(property.getValue().toString()) + .append(escapeHtml4(property.getValue().toString())) .append("\""); } } else { - builder.append("label=\"").append(label).append("\""); + builder.append("label=\"").append(escapeHtml4(label)).append("\""); } } } diff --git a/gradoop-flink/src/test/java/org/gradoop/flink/io/impl/dot/DOTDataSinkTest.java b/gradoop-flink/src/test/java/org/gradoop/flink/io/impl/dot/DOTDataSinkTest.java index dc92ad6485fd..70461aac327d 100644 --- a/gradoop-flink/src/test/java/org/gradoop/flink/io/impl/dot/DOTDataSinkTest.java +++ b/gradoop-flink/src/test/java/org/gradoop/flink/io/impl/dot/DOTDataSinkTest.java @@ -65,7 +65,7 @@ public void testWriteWithHtmlFormat() throws Exception { List lines = readLinesFromEnv(); - checkWriteOutput(lines, DOTDataSink.DotFormat.HTML); + checkWriteOutput(lines); } /** @@ -86,7 +86,7 @@ public void testWriteWithSimpleFormat() throws Exception { List lines = readLinesFromEnv(); - checkWriteOutput(lines, DOTDataSink.DotFormat.SIMPLE); + checkWriteOutput(lines); } private LogicalGraph initInputGraph() throws Exception { @@ -108,7 +108,7 @@ private List readLinesFromEnv() throws Exception { .collect(); } - private void checkWriteOutput(List lines, DOTDataSink.DotFormat format) { + private void checkWriteOutput(List lines) { int countGraphLines = 0; int countLines = 0; int countSubgraphLines = 0; @@ -128,11 +128,9 @@ private void checkWriteOutput(List lines, DOTDataSink.DotFormat format) countSubgraphLines++; } - if (format == DOTDataSink.DotFormat.HTML) { - int index = line.indexOf('&'); - if (index != -1) { - assertTrue("HTML entity & should have been escaped", line.substring(index).startsWith("&")); - } + int index = line.indexOf('&'); + if (index != -1) { + assertTrue("HTML entity & should have been escaped", line.substring(index).startsWith("&")); } countLines++; } diff --git a/gradoop-flink/src/test/java/org/gradoop/flink/io/impl/dot/functions/DotFileFormatSimpleTest.java b/gradoop-flink/src/test/java/org/gradoop/flink/io/impl/dot/functions/DotFileFormatSimpleTest.java index 12fe081b4da5..182cee318fe7 100644 --- a/gradoop-flink/src/test/java/org/gradoop/flink/io/impl/dot/functions/DotFileFormatSimpleTest.java +++ b/gradoop-flink/src/test/java/org/gradoop/flink/io/impl/dot/functions/DotFileFormatSimpleTest.java @@ -54,18 +54,21 @@ public void initGraphTransactionMock() { propertiesMap1.put("name", "Tom"); propertiesMap1.put("age", 25); GradoopId idVertex1 = GradoopId.fromString("bbbbbbbbbbbbbbbbbbbbbbbb"); - EPGMVertex vertex1 = new EPGMVertexFactory().initVertex(idVertex1, "Person", Properties.createFromMap(propertiesMap1)); + EPGMVertex vertex1 = new EPGMVertexFactory().initVertex( + idVertex1, "Person", Properties.createFromMap(propertiesMap1)); // init vertex 2 Map propertiesMap2 = new HashMap<>(); propertiesMap2.put("lan", "EN"); GradoopId idVertex2 = GradoopId.fromString("cccccccccccccccccccccccc"); - EPGMVertex vertex2 = new EPGMVertexFactory().initVertex(idVertex2, "Forum", Properties.createFromMap(propertiesMap2)); + EPGMVertex vertex2 = new EPGMVertexFactory().initVertex( + idVertex2, "Forum", Properties.createFromMap(propertiesMap2)); // init vertex 3 Map propertiesMap3 = new HashMap<>(); propertiesMap3.put("name", "Anna"); propertiesMap3.put("age", 27); GradoopId idVertex3 = GradoopId.fromString("dddddddddddddddddddddddd"); - EPGMVertex vertex3 = new EPGMVertexFactory().initVertex(idVertex3, "Person", Properties.createFromMap(propertiesMap3)); + EPGMVertex vertex3 = new EPGMVertexFactory().initVertex( + idVertex3, "Person", Properties.createFromMap(propertiesMap3)); // create vertex set Set vertices = new HashSet<>(); vertices.add(vertex1); @@ -103,11 +106,57 @@ public void testFormat() { "vddddddddddddddddddddddddaaaaaaaaaaaaaaaaaaaaaaaa [label=\"Person\",name=\"Anna\",age=\"27\"];\n" + "vbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaa [label=\"Person\",name=\"Tom\",age=\"25\"];\n" + "vccccccccccccccccccccccccaaaaaaaaaaaaaaaaaaaaaaaa [label=\"Forum\",lan=\"EN\"];\n" + - "vddddddddddddddddddddddddaaaaaaaaaaaaaaaaaaaaaaaa->vbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaa [label=\"knows\"];\n" + - "vccccccccccccccccccccccccaaaaaaaaaaaaaaaaaaaaaaaa->vddddddddddddddddddddddddaaaaaaaaaaaaaaaaaaaaaaaa [label=\"hasModerator\"];\n" + - "vbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaa->vddddddddddddddddddddddddaaaaaaaaaaaaaaaaaaaaaaaa [label=\"knows\"];\n" + + "vddddddddddddddddddddddddaaaaaaaaaaaaaaaaaaaaaaaa->" + + "vbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaa [label=\"knows\"];\n" + + "vccccccccccccccccccccccccaaaaaaaaaaaaaaaaaaaaaaaa->" + + "vddddddddddddddddddddddddaaaaaaaaaaaaaaaaaaaaaaaa [label=\"hasModerator\"];\n" + + "vbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaa->" + + "vddddddddddddddddddddddddaaaaaaaaaaaaaaaaaaaaaaaa [label=\"knows\"];\n" + "}\n"; assertEquals(expected, dotFileFormat.format(transaction)); } + + /** + * Tests whether troublesome chars get escaped. + */ + @Test + public void testStringEscaping() { + EPGMGraphHead graphHead = new EPGMGraphHeadFactory() + .initGraphHead(GradoopId.fromString("aaaaaaaaaaaaaaaaaaaaaaaa"), "graph"); + + String key = "Title"; + String value = "In the books Wojo's Weapons, why was Wojo occasionally known to say \"I'm " + + "too lazy!\" when asked why he didn't play 1. d4 instead of 1. Nf3?"; + + // init vertex 1 + Map propertiesMap1 = new HashMap<>(); + propertiesMap1.put(key, value); + GradoopId idVertex1 = GradoopId.fromString("bbbbbbbbbbbbbbbbbbbbbbbb"); + EPGMVertex vertex1 = new EPGMVertexFactory().initVertex( + idVertex1, "QuestionPost", Properties.createFromMap(propertiesMap1)); + + // create vertex set + Set vertices = new HashSet<>(); + vertices.add(vertex1); + // create empty edge set + Set edges = new HashSet<>(); + + GraphTransaction transactionMock = mock(GraphTransaction.class); + when(transactionMock.getGraphHead()).thenReturn(graphHead); + when(transactionMock.getVertices()).thenReturn(vertices); + when(transactionMock.getEdges()).thenReturn(edges); + + + DotFileFormatSimple dotFileFormatSimple = new DotFileFormatSimple(true); + + String expected = "subgraph cluster_gaaaaaaaaaaaaaaaaaaaaaaaa{\n" + + "label=\"graph\";\n" + + "vbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaa [label=\"QuestionPost\",Title=" + + "\"In the books Wojo's Weapons, why was Wojo occasionally known to say "I'm too " + + "lazy!" when asked why he didn't play 1. d4 instead of 1. Nf3?\"];\n" + + "}\n"; + + assertEquals(expected, dotFileFormatSimple.format(transactionMock));; + } } From 4f2c4ea8022cc59e3e5c73161b7df3e7b2470d7b Mon Sep 17 00:00:00 2001 From: Lucas Schons Date: Thu, 15 Aug 2019 11:08:09 +0200 Subject: [PATCH 2/4] [#1350] Shorten test input - remove spurious semicolon --- .../io/impl/dot/functions/AbstractDotFileFormat.java | 2 +- .../io/impl/dot/functions/DotFileFormatSimpleTest.java | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/gradoop-flink/src/main/java/org/gradoop/flink/io/impl/dot/functions/AbstractDotFileFormat.java b/gradoop-flink/src/main/java/org/gradoop/flink/io/impl/dot/functions/AbstractDotFileFormat.java index 08de03d7cfa4..e19feb97aa48 100644 --- a/gradoop-flink/src/main/java/org/gradoop/flink/io/impl/dot/functions/AbstractDotFileFormat.java +++ b/gradoop-flink/src/main/java/org/gradoop/flink/io/impl/dot/functions/AbstractDotFileFormat.java @@ -127,7 +127,7 @@ private void writeEdges(GraphTransaction transaction, StringBuilder builder, Str .append(edge.getTargetId()) .append(suffix) .append(" ["); - // write dot attributes if existent + // write dot attributes if present writeLabel(builder, edge); builder.append("];\n"); } diff --git a/gradoop-flink/src/test/java/org/gradoop/flink/io/impl/dot/functions/DotFileFormatSimpleTest.java b/gradoop-flink/src/test/java/org/gradoop/flink/io/impl/dot/functions/DotFileFormatSimpleTest.java index 182cee318fe7..41a7c48ef223 100644 --- a/gradoop-flink/src/test/java/org/gradoop/flink/io/impl/dot/functions/DotFileFormatSimpleTest.java +++ b/gradoop-flink/src/test/java/org/gradoop/flink/io/impl/dot/functions/DotFileFormatSimpleTest.java @@ -126,8 +126,7 @@ public void testStringEscaping() { .initGraphHead(GradoopId.fromString("aaaaaaaaaaaaaaaaaaaaaaaa"), "graph"); String key = "Title"; - String value = "In the books Wojo's Weapons, why was Wojo occasionally known to say \"I'm " + - "too lazy!\" when asked why he didn't play 1. d4 instead of 1. Nf3?"; + String value = "Why was Wojo occasionally known to say \"I'm too lazy!\"?"; // init vertex 1 Map propertiesMap1 = new HashMap<>(); @@ -153,10 +152,9 @@ public void testStringEscaping() { String expected = "subgraph cluster_gaaaaaaaaaaaaaaaaaaaaaaaa{\n" + "label=\"graph\";\n" + "vbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaa [label=\"QuestionPost\",Title=" + - "\"In the books Wojo's Weapons, why was Wojo occasionally known to say "I'm too " + - "lazy!" when asked why he didn't play 1. d4 instead of 1. Nf3?\"];\n" + + "\"Why was Wojo occasionally known to say "I'm too lazy!"?\"];\n" + "}\n"; - assertEquals(expected, dotFileFormatSimple.format(transactionMock));; + assertEquals(expected, dotFileFormatSimple.format(transactionMock)); } } From e8dfa57610d593ac89450afd4a860309837c3ac9 Mon Sep 17 00:00:00 2001 From: Lucas Schons Date: Tue, 27 Aug 2019 16:14:35 +0200 Subject: [PATCH 3/4] [#1350] Create simple DotSinkExample --- .../gradoop/examples/sink/DotSinkExample.java | 55 +++++++++++++++++++ .../gradoop/examples/sink/package-info.java | 4 ++ 2 files changed, 59 insertions(+) create mode 100644 gradoop-examples/gradoop-examples-operators/src/main/java/org/gradoop/examples/sink/DotSinkExample.java create mode 100644 gradoop-examples/gradoop-examples-operators/src/main/java/org/gradoop/examples/sink/package-info.java diff --git a/gradoop-examples/gradoop-examples-operators/src/main/java/org/gradoop/examples/sink/DotSinkExample.java b/gradoop-examples/gradoop-examples-operators/src/main/java/org/gradoop/examples/sink/DotSinkExample.java new file mode 100644 index 000000000000..9bc5403b863e --- /dev/null +++ b/gradoop-examples/gradoop-examples-operators/src/main/java/org/gradoop/examples/sink/DotSinkExample.java @@ -0,0 +1,55 @@ +package org.gradoop.examples.sink; + +import org.apache.flink.api.java.ExecutionEnvironment; +import org.gradoop.common.model.api.entities.Edge; +import org.gradoop.common.model.api.entities.Vertex; +import org.gradoop.common.model.impl.id.GradoopId; +import org.gradoop.common.model.impl.pojo.EPGMEdge; +import org.gradoop.common.model.impl.pojo.EPGMEdgeFactory; +import org.gradoop.common.model.impl.pojo.EPGMVertex; +import org.gradoop.common.model.impl.pojo.EPGMVertexFactory; +import org.gradoop.common.model.impl.properties.Properties; +import org.gradoop.flink.io.api.DataSink; +import org.gradoop.flink.io.impl.dot.DOTDataSink; +import org.gradoop.flink.model.impl.epgm.LogicalGraph; +import org.gradoop.flink.util.GradoopFlinkConfig; + +import java.util.ArrayList; +import java.util.List; + +/** + * Sink example. + */ +public class DotSinkExample { + /** + * Main + * @param args arguments from cli + */ + public static void main(String[] args) throws Exception { + ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); + GradoopFlinkConfig config = GradoopFlinkConfig.createConfig(env); + + EPGMVertexFactory vertexFactory = new EPGMVertexFactory(); + EPGMEdgeFactory edgeFactory = new EPGMEdgeFactory(); + + Properties properties = Properties.create(); + properties.set("title", "In the books Wojo's Weapons, why was Wojo occasionally known to say \"I'm too lazy!\" when asked why he didn't play 1. d4 instead of 1. Nf3?"); + + EPGMVertex vertex = vertexFactory.initVertex(GradoopId.get(), "book", properties); + EPGMEdge edge = edgeFactory.createEdge("identity", vertex.getId(), vertex.getId()); + + List vertices = new ArrayList<>(); + vertices.add(vertex); + List edges = new ArrayList<>(); + edges.add(edge); + + LogicalGraph graph = config.getLogicalGraphFactory().fromCollections(vertices, edges); + + DataSink sink = new DOTDataSink("example_out.dot", true, DOTDataSink.DotFormat.HTML); + + sink.write(graph); + + env.execute(); + + } +} diff --git a/gradoop-examples/gradoop-examples-operators/src/main/java/org/gradoop/examples/sink/package-info.java b/gradoop-examples/gradoop-examples-operators/src/main/java/org/gradoop/examples/sink/package-info.java new file mode 100644 index 000000000000..651b6d112346 --- /dev/null +++ b/gradoop-examples/gradoop-examples-operators/src/main/java/org/gradoop/examples/sink/package-info.java @@ -0,0 +1,4 @@ +/** + * Package for example workflows which utilize some sort of sink. + */ +package org.gradoop.examples.sink; From 6d7dd0cb064a22ef341e832147538a031cbd52bf Mon Sep 17 00:00:00 2001 From: Lucas Schons Date: Fri, 30 Aug 2019 13:11:23 +0200 Subject: [PATCH 4/4] [#1350] Escape strings \w StringEscapeUtils.escapeJava --- .../gradoop/examples/sink/DotSinkExample.java | 55 ------------------- .../gradoop/examples/sink/package-info.java | 4 -- .../dot/functions/DotFileFormatSimple.java | 10 ++-- .../flink/io/impl/dot/DOTDataSinkTest.java | 14 +++-- .../functions/DotFileFormatSimpleTest.java | 9 ++- 5 files changed, 17 insertions(+), 75 deletions(-) delete mode 100644 gradoop-examples/gradoop-examples-operators/src/main/java/org/gradoop/examples/sink/DotSinkExample.java delete mode 100644 gradoop-examples/gradoop-examples-operators/src/main/java/org/gradoop/examples/sink/package-info.java diff --git a/gradoop-examples/gradoop-examples-operators/src/main/java/org/gradoop/examples/sink/DotSinkExample.java b/gradoop-examples/gradoop-examples-operators/src/main/java/org/gradoop/examples/sink/DotSinkExample.java deleted file mode 100644 index 9bc5403b863e..000000000000 --- a/gradoop-examples/gradoop-examples-operators/src/main/java/org/gradoop/examples/sink/DotSinkExample.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.gradoop.examples.sink; - -import org.apache.flink.api.java.ExecutionEnvironment; -import org.gradoop.common.model.api.entities.Edge; -import org.gradoop.common.model.api.entities.Vertex; -import org.gradoop.common.model.impl.id.GradoopId; -import org.gradoop.common.model.impl.pojo.EPGMEdge; -import org.gradoop.common.model.impl.pojo.EPGMEdgeFactory; -import org.gradoop.common.model.impl.pojo.EPGMVertex; -import org.gradoop.common.model.impl.pojo.EPGMVertexFactory; -import org.gradoop.common.model.impl.properties.Properties; -import org.gradoop.flink.io.api.DataSink; -import org.gradoop.flink.io.impl.dot.DOTDataSink; -import org.gradoop.flink.model.impl.epgm.LogicalGraph; -import org.gradoop.flink.util.GradoopFlinkConfig; - -import java.util.ArrayList; -import java.util.List; - -/** - * Sink example. - */ -public class DotSinkExample { - /** - * Main - * @param args arguments from cli - */ - public static void main(String[] args) throws Exception { - ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); - GradoopFlinkConfig config = GradoopFlinkConfig.createConfig(env); - - EPGMVertexFactory vertexFactory = new EPGMVertexFactory(); - EPGMEdgeFactory edgeFactory = new EPGMEdgeFactory(); - - Properties properties = Properties.create(); - properties.set("title", "In the books Wojo's Weapons, why was Wojo occasionally known to say \"I'm too lazy!\" when asked why he didn't play 1. d4 instead of 1. Nf3?"); - - EPGMVertex vertex = vertexFactory.initVertex(GradoopId.get(), "book", properties); - EPGMEdge edge = edgeFactory.createEdge("identity", vertex.getId(), vertex.getId()); - - List vertices = new ArrayList<>(); - vertices.add(vertex); - List edges = new ArrayList<>(); - edges.add(edge); - - LogicalGraph graph = config.getLogicalGraphFactory().fromCollections(vertices, edges); - - DataSink sink = new DOTDataSink("example_out.dot", true, DOTDataSink.DotFormat.HTML); - - sink.write(graph); - - env.execute(); - - } -} diff --git a/gradoop-examples/gradoop-examples-operators/src/main/java/org/gradoop/examples/sink/package-info.java b/gradoop-examples/gradoop-examples-operators/src/main/java/org/gradoop/examples/sink/package-info.java deleted file mode 100644 index 651b6d112346..000000000000 --- a/gradoop-examples/gradoop-examples-operators/src/main/java/org/gradoop/examples/sink/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Package for example workflows which utilize some sort of sink. - */ -package org.gradoop.examples.sink; diff --git a/gradoop-flink/src/main/java/org/gradoop/flink/io/impl/dot/functions/DotFileFormatSimple.java b/gradoop-flink/src/main/java/org/gradoop/flink/io/impl/dot/functions/DotFileFormatSimple.java index 4c3106e692af..c5edd2d3b900 100644 --- a/gradoop-flink/src/main/java/org/gradoop/flink/io/impl/dot/functions/DotFileFormatSimple.java +++ b/gradoop-flink/src/main/java/org/gradoop/flink/io/impl/dot/functions/DotFileFormatSimple.java @@ -22,7 +22,7 @@ import org.gradoop.common.model.impl.properties.Property; import org.gradoop.flink.model.impl.layouts.transactional.tuples.GraphTransaction; -import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4; +import static org.apache.commons.lang3.StringEscapeUtils.escapeJava; /** * Converts a GraphTransaction to the following .dot format: @@ -81,17 +81,17 @@ void writeLabel(StringBuilder builder, Element element) { Properties properties = element.getProperties(); if (properties != null && properties.size() > 0) { - builder.append("label=\"").append(escapeHtml4(label)).append("\""); + builder.append("label=\"").append(escapeJava(label)).append("\""); for (Property property: properties) { builder.append(",") - .append(escapeHtml4(property.getKey())) + .append(escapeJava(property.getKey())) .append("=\"") - .append(escapeHtml4(property.getValue().toString())) + .append(escapeJava(property.getValue().toString())) .append("\""); } } else { - builder.append("label=\"").append(escapeHtml4(label)).append("\""); + builder.append("label=\"").append(escapeJava(label)).append("\""); } } } diff --git a/gradoop-flink/src/test/java/org/gradoop/flink/io/impl/dot/DOTDataSinkTest.java b/gradoop-flink/src/test/java/org/gradoop/flink/io/impl/dot/DOTDataSinkTest.java index 70461aac327d..02edd4a9689e 100644 --- a/gradoop-flink/src/test/java/org/gradoop/flink/io/impl/dot/DOTDataSinkTest.java +++ b/gradoop-flink/src/test/java/org/gradoop/flink/io/impl/dot/DOTDataSinkTest.java @@ -65,7 +65,7 @@ public void testWriteWithHtmlFormat() throws Exception { List lines = readLinesFromEnv(); - checkWriteOutput(lines); + checkWriteOutput(lines, DOTDataSink.DotFormat.HTML); } /** @@ -86,7 +86,7 @@ public void testWriteWithSimpleFormat() throws Exception { List lines = readLinesFromEnv(); - checkWriteOutput(lines); + checkWriteOutput(lines, DOTDataSink.DotFormat.SIMPLE); } private LogicalGraph initInputGraph() throws Exception { @@ -108,7 +108,7 @@ private List readLinesFromEnv() throws Exception { .collect(); } - private void checkWriteOutput(List lines) { + private void checkWriteOutput(List lines, DOTDataSink.DotFormat format) { int countGraphLines = 0; int countLines = 0; int countSubgraphLines = 0; @@ -128,9 +128,11 @@ private void checkWriteOutput(List lines) { countSubgraphLines++; } - int index = line.indexOf('&'); - if (index != -1) { - assertTrue("HTML entity & should have been escaped", line.substring(index).startsWith("&")); + if (format.equals(DOTDataSink.DotFormat.HTML)) { + int index = line.indexOf('&'); + if (index != -1) { + assertTrue("HTML entity & should have been escaped", line.substring(index).startsWith("&")); + } } countLines++; } diff --git a/gradoop-flink/src/test/java/org/gradoop/flink/io/impl/dot/functions/DotFileFormatSimpleTest.java b/gradoop-flink/src/test/java/org/gradoop/flink/io/impl/dot/functions/DotFileFormatSimpleTest.java index 41a7c48ef223..484321ad1821 100644 --- a/gradoop-flink/src/test/java/org/gradoop/flink/io/impl/dot/functions/DotFileFormatSimpleTest.java +++ b/gradoop-flink/src/test/java/org/gradoop/flink/io/impl/dot/functions/DotFileFormatSimpleTest.java @@ -118,7 +118,7 @@ public void testFormat() { } /** - * Tests whether troublesome chars get escaped. + * Tests whether label and property value strings are being escaped according to java string rules. */ @Test public void testStringEscaping() { @@ -133,7 +133,7 @@ public void testStringEscaping() { propertiesMap1.put(key, value); GradoopId idVertex1 = GradoopId.fromString("bbbbbbbbbbbbbbbbbbbbbbbb"); EPGMVertex vertex1 = new EPGMVertexFactory().initVertex( - idVertex1, "QuestionPost", Properties.createFromMap(propertiesMap1)); + idVertex1, "weird\nlabe\"l", Properties.createFromMap(propertiesMap1)); // create vertex set Set vertices = new HashSet<>(); @@ -146,13 +146,12 @@ public void testStringEscaping() { when(transactionMock.getVertices()).thenReturn(vertices); when(transactionMock.getEdges()).thenReturn(edges); - DotFileFormatSimple dotFileFormatSimple = new DotFileFormatSimple(true); String expected = "subgraph cluster_gaaaaaaaaaaaaaaaaaaaaaaaa{\n" + "label=\"graph\";\n" + - "vbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaa [label=\"QuestionPost\",Title=" + - "\"Why was Wojo occasionally known to say "I'm too lazy!"?\"];\n" + + "vbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaa [label=\"weird\\nlabe\\\"l\"," + + "Title=\"Why was Wojo occasionally known to say \\\"I'm too lazy!\\\"?\"];\n" + "}\n"; assertEquals(expected, dotFileFormatSimple.format(transactionMock));