This is an automated email from the ASF dual-hosted git repository.

colegreer pushed a commit to branch 3.8-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git


The following commit(s) were added to refs/heads/3.8-dev by this push:
     new e8b011f308 CTR Fix overrides of clone() in GValue, GValueManager, 
GValueConstantTraversal, and StepPlaceholder classes
e8b011f308 is described below

commit e8b011f30881cd4b85072dfe4a2eb04da4a90764
Author: Cole-Greer <cole.gr...@improving.com>
AuthorDate: Tue Sep 23 10:12:13 2025 -0700

    CTR Fix overrides of clone() in GValue, GValueManager, 
GValueConstantTraversal, and StepPlaceholder classes
---
 .../gremlin/process/traversal/GValueManager.java   |  3 +-
 .../traversal/lambda/AbstractLambdaTraversal.java  |  1 +
 .../traversal/lambda/GValueConstantTraversal.java  | 10 ++-----
 .../gremlin/process/traversal/step/GValue.java     |  4 +--
 .../traversal/step/filter/RangeGlobalStep.java     |  2 --
 .../step/filter/RangeGlobalStepPlaceholder.java    |  8 ++----
 .../step/filter/RangeLocalStepPlaceholder.java     |  8 ++----
 .../step/filter/TailGlobalStepPlaceholder.java     |  2 ++
 .../step/filter/TailLocalStepPlaceholder.java      |  1 +
 .../map/AbstractAddElementStepPlaceholder.java     |  6 +---
 .../map/AbstractMergeElementStepPlaceholder.java   |  6 +---
 .../traversal/step/map/CallStepPlaceholder.java    |  1 +
 .../traversal/step/map/GraphStepPlaceholder.java   | 12 +++++++-
 .../traversal/step/map/VertexStepPlaceholder.java  | 13 ++++++++-
 .../sideEffect/AddPropertyStepPlaceholder.java     | 32 ++++++++++++++++++++--
 15 files changed, 69 insertions(+), 40 deletions(-)

diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/GValueManager.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/GValueManager.java
index 6ef7c1db71..381f690fa6 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/GValueManager.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/GValueManager.java
@@ -141,10 +141,9 @@ public final class GValueManager implements Serializable, 
Cloneable {
      * Creates a deep copy of this GValueManager with cloned GValue instances.
      *
      * @return a new GValueManager instance with cloned state
-     * @throws CloneNotSupportedException if cloning fails
      */
     @Override
-    public GValueManager clone() throws CloneNotSupportedException {
+    public GValueManager clone() {
         final Map<String, GValue<?>> clonedRegistry = new HashMap<>();
         for (final Map.Entry<String, GValue<?>> entry : 
gValueRegistry.entrySet()) {
             // clone each gValue
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java
index 5003006634..247daac73d 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java
@@ -145,6 +145,7 @@ public abstract class AbstractLambdaTraversal<S, E> 
implements Traversal.Admin<S
     public Traversal.Admin<S, E> clone() {
         try {
             final AbstractLambdaTraversal<S, E> clone = 
(AbstractLambdaTraversal<S, E>) super.clone();
+            clone.gValueManager = this.gValueManager.clone();
             if (null != this.bypassTraversal)
                 clone.bypassTraversal = this.bypassTraversal.clone();
             return clone;
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/GValueConstantTraversal.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/GValueConstantTraversal.java
index 414c842658..f1c9f827cf 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/GValueConstantTraversal.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/GValueConstantTraversal.java
@@ -60,13 +60,9 @@ public final class GValueConstantTraversal<S, E> extends 
AbstractLambdaTraversal
     @Override
     public GValueConstantTraversal<S, E> clone() {
         GValueConstantTraversal<S, E> clone = (GValueConstantTraversal<S, E>) 
super.clone();
-        try {
-            clone.end = this.end.clone();
-            clone.constantTraversal = (ConstantTraversal<S, E>) 
this.constantTraversal.clone();
-            clone.setGValueManager(this.getGValueManager().clone());
-        } catch (CloneNotSupportedException e) { //TODO:: handle properly
-            throw new RuntimeException(e);
-        }
+        clone.end = this.end.clone();
+        clone.constantTraversal = (ConstantTraversal<S, E>) 
this.constantTraversal.clone();
+        clone.setGValueManager(this.getGValueManager().clone());
         return clone;
     }
 
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/GValue.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/GValue.java
index 769986fcdd..35dda09348 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/GValue.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/GValue.java
@@ -39,7 +39,7 @@ import java.util.stream.Stream;
  * the name is not given, the value was provided literally in the traversal. 
The value of the variable can be any
  * object.
  */
-public class GValue<V> implements Serializable {
+public class GValue<V> implements Serializable, Cloneable {
     private final String name;
     private final V value;
 
@@ -107,7 +107,7 @@ public class GValue<V> implements Serializable {
     }
 
     @Override
-    public GValue<V> clone() throws CloneNotSupportedException {
+    public GValue<V> clone() {
         if (this.value == null) {
             return new GValue<>(this.name, null);
         }
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
index 9df56e91df..e5095bb74b 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
@@ -24,11 +24,9 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequire
 import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
 import 
org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
 import java.io.Serializable;
 import java.util.Collections;
-import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.function.BinaryOperator;
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepPlaceholder.java
index 0b910c7464..27596a1fec 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepPlaceholder.java
@@ -159,12 +159,8 @@ public class RangeGlobalStepPlaceholder<S> extends 
FilterStep<S> implements Rang
     public RangeGlobalStepPlaceholder<S> clone() {
         RangeGlobalStepPlaceholder<S> clone = (RangeGlobalStepPlaceholder<S>) 
super.clone();
         clone.bypass = this.bypass;
-        try {
-            clone.low = this.low.clone(); //TODO:: cleanup unnecessary 
try-catch
-            clone.high = this.high.clone();
-        } catch (CloneNotSupportedException e) {
-            throw new RuntimeException(e);
-        }
+        clone.low = this.low.clone();
+        clone.high = this.high.clone();
         return clone;
     }
 
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeLocalStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeLocalStepPlaceholder.java
index cc345ea566..72fdcfe870 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeLocalStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeLocalStepPlaceholder.java
@@ -144,12 +144,8 @@ public class RangeLocalStepPlaceholder<S> extends 
ScalarMapStep<S,S> implements
     @Override
     public RangeLocalStepPlaceholder<S> clone() {
         RangeLocalStepPlaceholder<S> clone = (RangeLocalStepPlaceholder<S>) 
super.clone();
-        try {
-            clone.low = this.low.clone(); //TODO:: cleanup unnecessary 
try-catch
-            clone.high = this.high.clone();
-        } catch (CloneNotSupportedException e) {
-            throw new RuntimeException(e);
-        }
+        clone.low = this.low.clone();
+        clone.high = this.high.clone();
         return clone;
     }
 }
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepPlaceholder.java
index 6aac6e6f0b..8c56ca149d 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepPlaceholder.java
@@ -67,6 +67,8 @@ public final class TailGlobalStepPlaceholder<S> extends 
AbstractStep<S, S> imple
     @Override
     public TailGlobalStepPlaceholder<S> clone() {
         final TailGlobalStepPlaceholder<S> clone = 
(TailGlobalStepPlaceholder<S>) super.clone();
+        clone.limit = this.limit.clone();
+        clone.bypass = this.bypass;
         return clone;
     }
 
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailLocalStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailLocalStepPlaceholder.java
index d4f62ef597..29d8bf6da0 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailLocalStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailLocalStepPlaceholder.java
@@ -54,6 +54,7 @@ public final class TailLocalStepPlaceholder<S> extends 
ScalarMapStep<S, S> imple
     @Override
     public TailLocalStepPlaceholder<S> clone() {
         final TailLocalStepPlaceholder<S> clone = 
(TailLocalStepPlaceholder<S>) super.clone();
+        clone.limit = this.limit.clone();
         return clone;
     }
 
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java
index dbd391023b..4083168269 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java
@@ -355,11 +355,7 @@ public abstract class AbstractAddElementStepPlaceholder<S, 
E extends Element, X
                 if (v instanceof Traversal) {
                     newValues.add(((Traversal<?, ?>) v).asAdmin().clone());
                 } else if (v instanceof GValue) {
-                    try {
-                        newValues.add(((GValue) v).clone());
-                    } catch (CloneNotSupportedException e) {
-                        throw new RuntimeException(e);
-                    }
+                    newValues.add(((GValue) v).clone());
                 } else {
                     newValues.add(v);
                 }
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractMergeElementStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractMergeElementStepPlaceholder.java
index 135c5fcee4..da0de4e300 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractMergeElementStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractMergeElementStepPlaceholder.java
@@ -83,11 +83,7 @@ public abstract class AbstractMergeElementStepPlaceholder<S, 
E> extends FlatMapS
                 if (v instanceof Traversal) {
                     newValues.add(((Traversal<?, ?>) v).asAdmin().clone());
                 } else if (v instanceof GValue) {
-                    try {
-                        newValues.add(((GValue) v).clone());
-                    } catch (CloneNotSupportedException e) {
-                        throw new RuntimeException(e);
-                    }
+                    newValues.add(((GValue) v).clone());
                 } else {
                     newValues.add(v);
                 }
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepPlaceholder.java
index 3e96bed777..da31839d84 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepPlaceholder.java
@@ -217,6 +217,7 @@ public final class CallStepPlaceholder<S, E> extends 
AbstractStep<S, E> implemen
     @Override
     public CallStepPlaceholder<S, E> clone() {
         final CallStepPlaceholder<S, E> clone = (CallStepPlaceholder<S, E>) 
super.clone();
+        clone.staticParams = staticParams != null ? staticParams.clone() : 
null;
         clone.mapTraversal = mapTraversal != null ? mapTraversal.clone() : 
null;
         clone.parameters = parameters.clone();
         return clone;
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepPlaceholder.java
index 91997e4254..06d523c5fd 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepPlaceholder.java
@@ -27,7 +27,6 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.CloseableIterator;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 
 import java.util.Arrays;
@@ -165,4 +164,15 @@ public class GraphStepPlaceholder<S, E extends Element> 
extends AbstractStep<S,
         }
         return gValues;
     }
+
+    @Override
+    public GraphStepPlaceholder<S, E> clone() {
+        GraphStepPlaceholder<S, E> clone = (GraphStepPlaceholder<S, E>) 
super.clone();
+        clone.onGraphComputer = this.onGraphComputer;
+        clone.ids = new GValue<?>[this.ids.length];
+        for (int i = 0; i < this.ids.length; i++) {
+            clone.ids[i] = this.ids[i].clone();
+        }
+        return clone;
+    }
 }
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepPlaceholder.java
index 63b85c2f3d..cc78590b49 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepPlaceholder.java
@@ -48,7 +48,7 @@ import java.util.stream.Collectors;
  */
 public class VertexStepPlaceholder<E extends Element> extends 
FlatMapStep<Vertex, E> implements GValueHolder<Vertex, E>, 
VertexStepContract<E> {
 
-    private final GValue<String>[] edgeLabels;
+    private GValue<String>[] edgeLabels;
     private Direction direction;
     private final Class<E> returnClass;
 
@@ -148,6 +148,17 @@ public class VertexStepPlaceholder<E extends Element> 
extends FlatMapStep<Vertex
         return result;
     }
 
+    @Override
+    public VertexStepPlaceholder<E> clone() {
+        VertexStepPlaceholder<E> clone = (VertexStepPlaceholder<E>) 
super.clone();
+        clone.direction = this.direction;
+        clone.edgeLabels = new GValue[this.edgeLabels.length];
+        for (int i = 0; i < this.edgeLabels.length; i++) {
+            clone.edgeLabels[i] = this.edgeLabels[i].clone();
+        }
+        return clone;
+    }
+
     @Override
     public Set<TraverserRequirement> getRequirements() {
         return Collections.singleton(TraverserRequirement.OBJECT);
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepPlaceholder.java
index ca0efef7a0..c1835b0b9d 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepPlaceholder.java
@@ -172,9 +172,35 @@ public class AddPropertyStepPlaceholder<S extends Element> 
extends SideEffectSte
     public AddPropertyStepPlaceholder<S> clone() {
         final AddPropertyStepPlaceholder<S> clone = 
(AddPropertyStepPlaceholder<S>) super.clone();
         clone.cardinality = cardinality;
-        clone.key = key;
-        clone.value = value;
-        clone.properties.putAll(properties);
+        clone.value = value.clone();
+
+        // Attempt to deep clone keys for Traversal and GValue. Shallow copy 
is fine if key is a String or enum
+        if (this.key instanceof Traversal) {
+            clone.key = ((Traversal<?, ?>) this.key).asAdmin().clone();
+        } else if (this.key instanceof GValue) {
+            clone.key = ((GValue<?>) this.key).clone();
+        } else {
+            clone.key = this.key;
+        }
+
+        // deep clone properties
+        clone.properties = new HashMap<>();
+        for (Map.Entry<Object, List<Object>> entry : 
this.properties.entrySet()) {
+            final Object key = entry.getKey();
+            final List<Object> oldValues = entry.getValue();
+            final List<Object> newValues = new ArrayList<>(oldValues.size());
+            for (Object v : oldValues) {
+                if (v instanceof Traversal) {
+                    newValues.add(((Traversal<?, ?>) v).asAdmin().clone());
+                } else if (v instanceof GValue) {
+                    newValues.add(((GValue) v).clone());
+                } else {
+                    newValues.add(v);
+                }
+            }
+            clone.properties.put(key, newValues);
+        }
+
         return clone;
     }
 

Reply via email to