This is an automated email from the ASF dual-hosted git repository.
hansva pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hop.git
The following commit(s) were added to refs/heads/main by this push:
new 12620d6945 parent variables were leaking into pipelines, fixes #7866
(#7867)
12620d6945 is described below
commit 12620d6945fb8a032364f0b7848d106285d108ea
Author: Hans Van Akelyen <[email protected]>
AuthorDate: Mon Aug 10 15:32:35 2026 +0200
parent variables were leaking into pipelines, fixes #7866 (#7867)
---
.../hop/pipeline/transform/BaseTransform.java | 12 ++++++++-
.../hop/pipeline/transform/BaseTransformTest.java | 29 ++++++++++++++++++++++
2 files changed, 40 insertions(+), 1 deletion(-)
diff --git
a/engine/src/main/java/org/apache/hop/pipeline/transform/BaseTransform.java
b/engine/src/main/java/org/apache/hop/pipeline/transform/BaseTransform.java
index f131141868..541aba2300 100644
--- a/engine/src/main/java/org/apache/hop/pipeline/transform/BaseTransform.java
+++ b/engine/src/main/java/org/apache/hop/pipeline/transform/BaseTransform.java
@@ -2937,7 +2937,11 @@ public class BaseTransform<Meta extends ITransformMeta,
Data extends ITransformD
public void setInternalVariables() {
setVariable(Const.INTERNAL_VARIABLE_TRANSFORM_NAME, transformName);
setVariable(Const.INTERNAL_VARIABLE_TRANSFORM_COPYNR,
Integer.toString(getCopy()));
- setVariable(Const.INTERNAL_VARIABLE_TRANSFORM_ID, log.getLogChannelId());
+ // The log channel isn't created yet when the constructor initializes the
variables.
+ //
+ if (log != null) {
+ setVariable(Const.INTERNAL_VARIABLE_TRANSFORM_ID, log.getLogChannelId());
+ }
}
/*
@@ -3615,6 +3619,12 @@ public class BaseTransform<Meta extends ITransformMeta,
Data extends ITransformD
@Override
public void initializeFrom(IVariables parent) {
variables.initializeFrom(parent);
+
+ // The Internal.Transform.* variables belong to this transform. The parent
space can carry
+ // values of another transform (a nested execution started from e.g. a
Pipeline or Workflow
+ // Executor passes them down), so re-apply ours after copying the parent's.
+ //
+ setInternalVariables();
}
/*
diff --git
a/engine/src/test/java/org/apache/hop/pipeline/transform/BaseTransformTest.java
b/engine/src/test/java/org/apache/hop/pipeline/transform/BaseTransformTest.java
index e1d096436f..0a1a19a057 100644
---
a/engine/src/test/java/org/apache/hop/pipeline/transform/BaseTransformTest.java
+++
b/engine/src/test/java/org/apache/hop/pipeline/transform/BaseTransformTest.java
@@ -42,6 +42,7 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.hop.core.BlockingRowSet;
+import org.apache.hop.core.Const;
import org.apache.hop.core.IRowSet;
import org.apache.hop.core.QueueRowSet;
import org.apache.hop.core.ResultFile;
@@ -61,6 +62,7 @@ import org.apache.hop.core.row.value.ValueMetaInteger;
import org.apache.hop.core.row.value.ValueMetaString;
import org.apache.hop.core.util.TestUtil;
import org.apache.hop.core.variables.IVariables;
+import org.apache.hop.core.variables.Variables;
import org.apache.hop.pipeline.Pipeline;
import org.apache.hop.pipeline.engines.local.LocalPipelineEngine;
import org.apache.hop.pipeline.transforms.mock.TransformMockHelper;
@@ -116,6 +118,33 @@ class BaseTransformTest {
assertNull(logLevel);
}
+ /**
+ * A nested execution (Pipeline/Workflow Executor) passes the calling
transform's variables down
+ * to the child pipeline, so the parent variable space can carry another
transform's
+ * Internal.Transform.* values. Initializing from that space must not
overwrite ours.
+ */
+ @Test
+ void testInitializeFromKeepsOwnInternalTransformVariables() {
+ BaseTransform<ITransformMeta, ITransformData> baseTransform =
+ new BaseTransform<>(
+ mockHelper.transformMeta,
+ mockHelper.iTransformMeta,
+ mockHelper.iTransformData,
+ 0,
+ mockHelper.pipelineMeta,
+ mockHelper.pipeline);
+
+ IVariables parent = new Variables();
+ parent.setVariable(Const.INTERNAL_VARIABLE_TRANSFORM_NAME, "some other
transform");
+ parent.setVariable(Const.INTERNAL_VARIABLE_TRANSFORM_COPYNR, "7");
+
+ baseTransform.initializeFrom(parent);
+
+ assertEquals(
+ "BASE TRANSFORM",
baseTransform.getVariable(Const.INTERNAL_VARIABLE_TRANSFORM_NAME));
+ assertEquals("0",
baseTransform.getVariable(Const.INTERNAL_VARIABLE_TRANSFORM_COPYNR));
+ }
+
@Test
void testTransformListenersConcurrentModification() throws
InterruptedException {
// Create a base transform