From 230acbb95967c606e7494772f54e0cb720c91d8c Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Tue, 21 Oct 2025 22:37:24 +0200 Subject: [PATCH] fixed properties with reserved keys --- .../persistence/PropertiesContainer.java | 12 ++---- .../serde/VertexDataDeserializer.java | 2 +- .../gremlin/structure/ArangoDBVertex.java | 2 + .../simple/SimplePersistenceTest.java | 40 +++++++++++++++++++ 4 files changed, 46 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/arangodb/tinkerpop/gremlin/persistence/PropertiesContainer.java b/src/main/java/com/arangodb/tinkerpop/gremlin/persistence/PropertiesContainer.java index cf8d156..0b2f85c 100644 --- a/src/main/java/com/arangodb/tinkerpop/gremlin/persistence/PropertiesContainer.java +++ b/src/main/java/com/arangodb/tinkerpop/gremlin/persistence/PropertiesContainer.java @@ -24,15 +24,15 @@ public abstract class PropertiesContainer { private final Map properties = new HashMap<>(); public Map getProperties() { - return properties; + return Collections.unmodifiableMap(properties); } public Set keySet() { - return properties.keySet(); + return Collections.unmodifiableSet(properties.keySet()); } public Collection values() { - return properties.values(); + return Collections.unmodifiableCollection(properties.values()); } public V get(String key) { @@ -47,12 +47,6 @@ public void put(String key, V value) { properties.put(key, value); } - public void putAll(Map map) { - if (map != null) { - properties.putAll(map); - } - } - public void remove(String key) { properties.remove(key); } diff --git a/src/main/java/com/arangodb/tinkerpop/gremlin/persistence/serde/VertexDataDeserializer.java b/src/main/java/com/arangodb/tinkerpop/gremlin/persistence/serde/VertexDataDeserializer.java index b754e88..e9de026 100644 --- a/src/main/java/com/arangodb/tinkerpop/gremlin/persistence/serde/VertexDataDeserializer.java +++ b/src/main/java/com/arangodb/tinkerpop/gremlin/persistence/serde/VertexDataDeserializer.java @@ -62,7 +62,7 @@ public VertexData deserialize(JsonParser p, DeserializationContext ctx) throws I if (!config.isReservedField(prop.getKey())) { VertexPropertyData pd = new VertexPropertyData(c.treeToValue(prop.getValue(), Object.class)); String key = prop.getKey(); - pd.putAll(meta.get(key)); + meta.getOrDefault(key, Collections.emptyMap()).forEach(pd::put); data.put(key, pd); } } diff --git a/src/main/java/com/arangodb/tinkerpop/gremlin/structure/ArangoDBVertex.java b/src/main/java/com/arangodb/tinkerpop/gremlin/structure/ArangoDBVertex.java index 2497e14..d8e3df6 100644 --- a/src/main/java/com/arangodb/tinkerpop/gremlin/structure/ArangoDBVertex.java +++ b/src/main/java/com/arangodb/tinkerpop/gremlin/structure/ArangoDBVertex.java @@ -18,6 +18,7 @@ import com.arangodb.tinkerpop.gremlin.persistence.VertexData; import com.arangodb.tinkerpop.gremlin.persistence.VertexPropertyData; +import com.arangodb.tinkerpop.gremlin.utils.ArangoDBUtil; import org.apache.tinkerpop.gremlin.structure.*; import org.apache.tinkerpop.gremlin.structure.util.ElementHelper; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; @@ -56,6 +57,7 @@ public VertexProperty property( } VertexPropertyData prop = new VertexPropertyData(value); + ArangoDBUtil.validateProperty(key, value, graph.config); data.put(key, prop); doUpdate(); diff --git a/src/test/java/com/arangodb/tinkerpop/gremlin/arangodb/simple/SimplePersistenceTest.java b/src/test/java/com/arangodb/tinkerpop/gremlin/arangodb/simple/SimplePersistenceTest.java index 7ada141..8c3b7a5 100644 --- a/src/test/java/com/arangodb/tinkerpop/gremlin/arangodb/simple/SimplePersistenceTest.java +++ b/src/test/java/com/arangodb/tinkerpop/gremlin/arangodb/simple/SimplePersistenceTest.java @@ -31,6 +31,7 @@ import static com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph.GRAPH_VARIABLES_COLLECTION; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.catchThrowable; @SuppressWarnings("resource") public class SimplePersistenceTest extends AbstractGremlinTest { @@ -92,6 +93,45 @@ public void vertices() { .containsEntry("meta", "metaValue"); } + @Test + @SuppressWarnings("unchecked") + public void settingKeyAsPropertyShouldFail() { + Vertex v = graph.addVertex( + T.id, "foo", + T.label, "bar" + ); + Throwable thrown = catchThrowable(() -> v.property("_key", "test")); + assertThat(thrown) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("Property key can not be a reserved key"); + } + + @Test + @SuppressWarnings("unchecked") + public void settingIdAsPropertyShouldFail() { + Vertex v = graph.addVertex( + T.id, "foo", + T.label, "bar" + ); + Throwable thrown = catchThrowable(() -> v.property("_id", "test")); + assertThat(thrown) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("Property key can not be a reserved key"); + } + + @Test + @SuppressWarnings("unchecked") + public void settingLabelAsPropertyShouldFail() { + Vertex v = graph.addVertex( + T.id, "foo", + T.label, "bar" + ); + Throwable thrown = catchThrowable(() -> v.property("type", "test")); + assertThat(thrown) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("Property key can not be a reserved key"); + } + @Test @SuppressWarnings("unchecked") public void edges() {