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 <[email protected]>
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;
}