From aff2037b5973c62c0292ab3065761e923899aa57 Mon Sep 17 00:00:00 2001 From: Justin Chu <15710241+justinchuch@users.noreply.github.com> Date: Fri, 21 Sep 2018 15:12:26 -0400 Subject: [PATCH 1/2] Apply StringEscapeUtils in GroovyTranslator#convertToString(String) --- .../groovy/jsr223/GroovyTranslatorTest.java | 69 +++++++++++++++++++ .../groovy/jsr223/GroovyTranslator.java | 4 +- 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslatorTest.java b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslatorTest.java index 56f969952d6..942f1a577af 100644 --- a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslatorTest.java +++ b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslatorTest.java @@ -30,7 +30,10 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy; import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.TranslationStrategy; import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy; +import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Vertex; +import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedEdge; +import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex; import org.apache.tinkerpop.gremlin.util.function.Lambda; import org.junit.Test; @@ -116,6 +119,17 @@ public void shouldSupportStringSupplierLambdas() throws Exception { assertEquals(7, sacks.get(5).intValue()); // assertEquals(24, t.getSideEffects().get("lengthSum").intValue()); + + final String script = GroovyTranslator.of("g").translate(t.getBytecode()); + assertEquals("g.withSideEffect(\"lengthSum\",(int) 0).withSack((int) 1)" + + ".V()" + + ".filter({it.get().label().equals('person')})" + + ".flatMap({it.get().vertices(Direction.OUT)})" + + ".map({it.get().value('name').length()})" + + ".sideEffect({ x -> x.sideEffects(\"lengthSum\", x.sideEffects('lengthSum') + x.get()) })" + + ".order().by({a,b -> a <=> b})" + + ".sack({ a,b -> a + b })", + script); } @Test @@ -141,4 +155,59 @@ public void shouldHandleEmptyMaps() { public void shouldHaveValidToString() { assertEquals("translator[h:gremlin-groovy]", GroovyTranslator.of("h").toString()); } + + @Test + public void shouldEscapeStrings() { + final GraphTraversalSource g = graph.traversal(); + final String script = GroovyTranslator.of("g").translate(g.addV("customer") + .property("customer_id", 501L) + .property("name", "Foo\u0020Bar") + .property("age", 25) + .property("special", "`~!@#$%^&*()-_=+[{]}\\|;:'\",<.>/?") + .asAdmin().getBytecode()); + + assertEquals("g.addV(\"customer\")" + + ".property(\"customer_id\",501L)" + + ".property(\"name\",\"Foo Bar\")" + + ".property(\"age\",(int) 25)" + + ".property(\"special\",\"\"\"`~!@#\\$%^&*()-_=+[{]}\\\\|;:'\\\",<.>/?\"\"\")", + script); + } + + @Test + public void shouldHandleVertexAndEdge() { + final GraphTraversalSource g = graph.traversal(); + + final Object id1 = "customer:10:foo\u0020bar\u0020\u0024100#90"; // customer:10:foo bar $100#90 + final Vertex vertex1 = DetachedVertex.build().setLabel("customer").setId(id1) + .create(); + final String script1 = GroovyTranslator.of("g").translate(g.V(vertex1).asAdmin().getBytecode()); + assertEquals("g.V(new org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex(" + + "\"customer:10:foo bar \\$100#90\"," + + "\"customer\", Collections.emptyMap()))", + script1); + + final Object id2 = "user:20:foo\\u0020bar\\u005c\\u0022mr\\u005c\\u0022\\u00241000#50"; // user:20:foo\u0020bar\u005c\u0022mr\u005c\u0022\u00241000#50 + final Vertex vertex2 = DetachedVertex.build().setLabel("user").setId(id2) + .create(); + final String script2 = GroovyTranslator.of("g").translate(g.V(vertex2).asAdmin().getBytecode()); + assertEquals("g.V(new org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex(" + + "\"user:20:foo\\\\u0020bar\\\\u005c\\\\u0022mr\\\\u005c\\\\u0022\\\\u00241000#50\"," + + "\"user\", Collections.emptyMap()))", + script2); + + final Object id3 = "knows:30:foo\u0020bar\u0020\u0024100:\\u0020\\u0024500#70"; + final Edge edge = DetachedEdge.build().setLabel("knows").setId(id3) + .setOutV((DetachedVertex) vertex1) + .setInV((DetachedVertex) vertex2) + .create(); + final String script3 = GroovyTranslator.of("g").translate(g.E(edge).asAdmin().getBytecode()); + assertEquals("g.E(new org.apache.tinkerpop.gremlin.structure.util.detached.DetachedEdge(" + + "\"knows:30:foo bar \\$100:\\\\u0020\\\\u0024500#70\"," + + "\"knows\",Collections.emptyMap()," + + "\"customer:10:foo bar \\$100#90\",\"customer\"," + + "\"user:20:foo\\\\u0020bar\\\\u005c\\\\u0022mr\\\\u005c\\\\u0022\\\\u00241000#50\",\"user\"))", + script3); + } + } diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java index 6e86ce9c10b..0452e0b65f8 100644 --- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java +++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java @@ -19,6 +19,7 @@ package org.apache.tinkerpop.gremlin.groovy.jsr223; +import groovy.json.StringEscapeUtils; import org.apache.commons.configuration.ConfigurationConverter; import org.apache.tinkerpop.gremlin.process.traversal.Bytecode; import org.apache.tinkerpop.gremlin.process.traversal.P; @@ -115,7 +116,8 @@ else if (object instanceof Bytecode) else if (object instanceof Traversal) return convertToString(((Traversal) object).asAdmin().getBytecode()); else if (object instanceof String) { - return (((String) object).contains("\"") ? "\"\"\"" + object + "\"\"\"" : "\"" + object + "\"").replace("$", "\\$"); + return (((String) object).contains("\"") ? "\"\"\"" + StringEscapeUtils.escapeJava((String) object) + "\"\"\"" : "\"" + StringEscapeUtils.escapeJava((String) object) + "\"") + .replace("$", "\\$"); } else if (object instanceof Set) { final Set set = new HashSet<>(((Set) object).size()); for (final Object item : (Set) object) { From 94416200fdc01b51f64f85348c05d326977d0062 Mon Sep 17 00:00:00 2001 From: Justin Chu <15710241+justinchuch@users.noreply.github.com> Date: Mon, 24 Sep 2018 12:44:17 -0400 Subject: [PATCH 2/2] Remove unused imports and adjust test cases for tp33 --- .../gremlin/groovy/jsr223/GroovyTranslator.java | 1 - .../groovy/jsr223/GroovyTranslatorTest.java | 16 +++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java index 0128b1bb9a0..8024590a2e9 100644 --- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java +++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java @@ -26,7 +26,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions; import org.apache.tinkerpop.gremlin.process.traversal.Translator; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; -import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource; import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy; import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent; import org.apache.tinkerpop.gremlin.process.traversal.strategy.TraversalStrategyProxy; diff --git a/gremlin-groovy/src/test/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslatorTest.java b/gremlin-groovy/src/test/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslatorTest.java index 547fa201b9c..057f2f1095a 100644 --- a/gremlin-groovy/src/test/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslatorTest.java +++ b/gremlin-groovy/src/test/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslatorTest.java @@ -30,10 +30,10 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Vertex; -import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory; -import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph; import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedEdge; import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex; +import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory; +import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph; import org.apache.tinkerpop.gremlin.util.function.Lambda; import org.junit.Test; @@ -121,7 +121,8 @@ public void shouldSupportStringSupplierLambdas() throws Exception { assertEquals(24, t.getSideEffects().get("lengthSum").intValue()); final String script = GroovyTranslator.of("g").translate(t.getBytecode()); - assertEquals("g.withSideEffect(\"lengthSum\",(int) 0).withSack((int) 1)" + + assertEquals("g.withStrategies(org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.TranslationStrategy.instance())" + + ".withSideEffect(\"lengthSum\",(int) 0).withSack((int) 1)" + ".V()" + ".filter({it.get().label().equals('person')})" + ".flatMap({it.get().vertices(Direction.OUT)})" + @@ -211,6 +212,15 @@ public void shouldHandleVertexAndEdge() { "\"customer:10:foo bar \\$100#90\",\"customer\"," + "\"user:20:foo\\\\u0020bar\\\\u005c\\\\u0022mr\\\\u005c\\\\u0022\\\\u00241000#50\",\"user\"))", script3); + + final String script4 = GroovyTranslator.of("g").translate( + g.addE("knows").from(vertex1).to(vertex2).property("when", "2018/09/21") + .asAdmin().getBytecode()); + assertEquals("g.addE(\"knows\")" + + ".from(new org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex(\"customer:10:foo bar \\$100#90\",\"customer\", Collections.emptyMap()))" + + ".to(new org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex(\"user:20:foo\\\\u0020bar\\\\u005c\\\\u0022mr\\\\u005c\\\\u0022\\\\u00241000#50\",\"user\", Collections.emptyMap()))" + + ".property(\"when\",\"2018/09/21\")", + script4); } }