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

mcasters 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 0868c90386 issues #6381, #6947 (data set as variable) (#6949)
0868c90386 is described below

commit 0868c903865e6df2ae55a8faf2402b26f91d5020
Author: Matt Casters <[email protected]>
AuthorDate: Fri Apr 3 15:20:22 2026 +0200

    issues #6381, #6947 (data set as variable) (#6949)
    
    * issue #6381 (CSV Input Dialog fix for get fields dialog)
    
    * issue #6381 (Pipeline Unit Test fails to execute when Input Dataset is 
defined as a variable)
    
    * issue #6950 (When clicking on a dataset in a pipeline extra windows show)
---
 .../java/org/apache/hop/core/gui/BasePainter.java  |   4 +
 .../transforms/common/ICsvInputAwareMeta.java      |   3 +-
 .../org/apache/hop/testing/PipelineUnitTest.java   |   7 +-
 .../org/apache/hop/testing/util/DataSetConst.java  |   4 +-
 .../org/apache/hop/testing/util/UnitTestUtil.java  |   2 +-
 .../xp/LocationMouseDoubleClickExtensionPoint.java |   1 +
 .../xp/ValidatePipelineUnitTestExtensionPoint.java |   2 +-
 .../transforms/csvinput/CsvInputField.java         |  53 +++++++++-
 .../pipeline/transforms/csvinput/CsvInputMeta.java | 111 ++++++++++++++++++++-
 .../common/IGetFieldsCapableTransformDialog.java   |   1 -
 10 files changed, 173 insertions(+), 15 deletions(-)

diff --git a/engine/src/main/java/org/apache/hop/core/gui/BasePainter.java 
b/engine/src/main/java/org/apache/hop/core/gui/BasePainter.java
index 012b3bd1cc..b7c88214c4 100644
--- a/engine/src/main/java/org/apache/hop/core/gui/BasePainter.java
+++ b/engine/src/main/java/org/apache/hop/core/gui/BasePainter.java
@@ -33,6 +33,7 @@ import org.apache.hop.core.gui.IGc.ELineStyle;
 import org.apache.hop.core.util.Utils;
 import org.apache.hop.core.variables.IVariables;
 import org.apache.hop.i18n.BaseMessages;
+import org.apache.hop.metadata.api.IHopMetadataProvider;
 import org.apache.hop.pipeline.transform.stream.StreamIcon;
 
 @Getter
@@ -86,6 +87,9 @@ public abstract class BasePainter<Hop extends BaseHopMeta<?>, 
Part extends IBase
    */
   protected boolean showOriginBoundary;
 
+  /** In case we want to use metadata objects to help with drawing on the 
pipeline or workflow */
+  protected IHopMetadataProvider metadataProvider;
+
   public BasePainter(
       IGc gc,
       IVariables variables,
diff --git 
a/engine/src/main/java/org/apache/hop/pipeline/transforms/common/ICsvInputAwareMeta.java
 
b/engine/src/main/java/org/apache/hop/pipeline/transforms/common/ICsvInputAwareMeta.java
index f1eb43c56a..99ae4a5b72 100644
--- 
a/engine/src/main/java/org/apache/hop/pipeline/transforms/common/ICsvInputAwareMeta.java
+++ 
b/engine/src/main/java/org/apache/hop/pipeline/transforms/common/ICsvInputAwareMeta.java
@@ -19,6 +19,7 @@ package org.apache.hop.pipeline.transforms.common;
 
 import java.util.List;
 import org.apache.commons.vfs2.FileObject;
+import org.apache.hop.core.exception.HopFileException;
 import org.apache.hop.core.exception.HopTransformException;
 import org.apache.hop.core.fileinput.InputFile;
 import org.apache.hop.core.gui.ITextFileInputField;
@@ -66,7 +67,7 @@ public interface ICsvInputAwareMeta<T extends 
ITextFileInputField> {
    * @param variables the {@link PipelineMeta}
    * @return null if the {@link FileObject} cannot be created.
    */
-  FileObject getHeaderFileObject(final IVariables variables);
+  FileObject getHeaderFileObject(final IVariables variables) throws 
HopFileException;
 
   /**
    * Gets the fields.
diff --git 
a/plugins/misc/testing/src/main/java/org/apache/hop/testing/PipelineUnitTest.java
 
b/plugins/misc/testing/src/main/java/org/apache/hop/testing/PipelineUnitTest.java
index da22825da5..b4634ca3e5 100644
--- 
a/plugins/misc/testing/src/main/java/org/apache/hop/testing/PipelineUnitTest.java
+++ 
b/plugins/misc/testing/src/main/java/org/apache/hop/testing/PipelineUnitTest.java
@@ -143,11 +143,14 @@ public class PipelineUnitTest extends HopMetadataBase 
implements Cloneable, IHop
    * @throws HopException
    */
   public DataSet getGoldenDataSet(
-      ILogChannel log, IHopMetadataProvider metadataProvider, 
PipelineUnitTestSetLocation location)
+      ILogChannel log,
+      IHopMetadataProvider metadataProvider,
+      IVariables variables,
+      PipelineUnitTestSetLocation location)
       throws HopException {
 
     String transformName = location.getTransformName();
-    String goldenDataSetName = location.getDataSetName();
+    String goldenDataSetName = variables.resolve(location.getDataSetName());
 
     try {
       // Look in the golden data sets list for the mentioned transform name
diff --git 
a/plugins/misc/testing/src/main/java/org/apache/hop/testing/util/DataSetConst.java
 
b/plugins/misc/testing/src/main/java/org/apache/hop/testing/util/DataSetConst.java
index 54f3ace28d..4340b18954 100644
--- 
a/plugins/misc/testing/src/main/java/org/apache/hop/testing/util/DataSetConst.java
+++ 
b/plugins/misc/testing/src/main/java/org/apache/hop/testing/util/DataSetConst.java
@@ -31,6 +31,7 @@ import org.apache.hop.core.logging.ILogChannel;
 import org.apache.hop.core.row.IRowMeta;
 import org.apache.hop.core.row.IValueMeta;
 import org.apache.hop.core.row.RowMeta;
+import org.apache.hop.core.variables.IVariables;
 import org.apache.hop.i18n.BaseMessages;
 import org.apache.hop.metadata.api.IHopMetadataProvider;
 import org.apache.hop.pipeline.PipelineMeta;
@@ -99,6 +100,7 @@ public class DataSetConst {
       IPipelineEngine<PipelineMeta> pipeline,
       PipelineUnitTest unitTest,
       IHopMetadataProvider metadataProvider,
+      IVariables variables,
       List<UnitTestResult> results)
       throws HopException {
     int nrErrors = 0;
@@ -166,7 +168,7 @@ public class DataSetConst {
               + "', fields: "
               + resultRowMeta.toString());
 
-      DataSet goldenDataSet = unitTest.getGoldenDataSet(log, metadataProvider, 
location);
+      DataSet goldenDataSet = unitTest.getGoldenDataSet(log, metadataProvider, 
variables, location);
       List<Object[]> goldenRows = goldenDataSet.getAllRows(pipeline, log, 
location);
       IRowMeta goldenRowMeta = 
goldenDataSet.getMappedDataSetFieldsRowMeta(location);
 
diff --git 
a/plugins/misc/testing/src/main/java/org/apache/hop/testing/util/UnitTestUtil.java
 
b/plugins/misc/testing/src/main/java/org/apache/hop/testing/util/UnitTestUtil.java
index 6977bf063e..16c31432c1 100644
--- 
a/plugins/misc/testing/src/main/java/org/apache/hop/testing/util/UnitTestUtil.java
+++ 
b/plugins/misc/testing/src/main/java/org/apache/hop/testing/util/UnitTestUtil.java
@@ -120,7 +120,7 @@ public class UnitTestUtil {
 
       List<UnitTestResult> testResults = new ArrayList<>();
       DataSetConst.validateTransformResultAgainstUnitTest(
-          testPipeline, test, metadataProvider, testResults);
+          testPipeline, test, metadataProvider, variables, testResults);
       testResultsEvaluator.evaluateTestResults(testPipeline, testResults);
     } catch (HopException e) {
       exceptionEvaluator.evaluateTestException(test, testPipelineMeta, e);
diff --git 
a/plugins/misc/testing/src/main/java/org/apache/hop/testing/xp/LocationMouseDoubleClickExtensionPoint.java
 
b/plugins/misc/testing/src/main/java/org/apache/hop/testing/xp/LocationMouseDoubleClickExtensionPoint.java
index acff5b569a..e816c46299 100644
--- 
a/plugins/misc/testing/src/main/java/org/apache/hop/testing/xp/LocationMouseDoubleClickExtensionPoint.java
+++ 
b/plugins/misc/testing/src/main/java/org/apache/hop/testing/xp/LocationMouseDoubleClickExtensionPoint.java
@@ -59,6 +59,7 @@ public class LocationMouseDoubleClickExtensionPoint
       throws HopException {
     HopGuiPipelineGraph pipelineGraph = 
pipelineGraphExtension.getPipelineGraph();
     PipelineMeta pipelineMeta = pipelineGraph.getPipelineMeta();
+    pipelineGraphExtension.setPreventingDefault(true);
 
     PipelineUnitTest unitTest = 
TestingGuiPlugin.getCurrentUnitTest(pipelineMeta);
     if (unitTest == null) {
diff --git 
a/plugins/misc/testing/src/main/java/org/apache/hop/testing/xp/ValidatePipelineUnitTestExtensionPoint.java
 
b/plugins/misc/testing/src/main/java/org/apache/hop/testing/xp/ValidatePipelineUnitTestExtensionPoint.java
index 8fea276cb9..586def91f8 100644
--- 
a/plugins/misc/testing/src/main/java/org/apache/hop/testing/xp/ValidatePipelineUnitTestExtensionPoint.java
+++ 
b/plugins/misc/testing/src/main/java/org/apache/hop/testing/xp/ValidatePipelineUnitTestExtensionPoint.java
@@ -83,7 +83,7 @@ public class ValidatePipelineUnitTestExtensionPoint
       //
       int errors =
           DataSetConst.validateTransformResultAgainstUnitTest(
-              pipeline, unitTest, metadataProvider, results);
+              pipeline, unitTest, metadataProvider, variables, results);
       if (errors == 0) {
         log.logBasic("Unit test '" + unitTest.getName() + "' passed 
successfully");
       } else {
diff --git 
a/plugins/transforms/textfile/src/main/java/org/apache/hop/pipeline/transforms/csvinput/CsvInputField.java
 
b/plugins/transforms/textfile/src/main/java/org/apache/hop/pipeline/transforms/csvinput/CsvInputField.java
index 09f39b39e7..14b3a8ae8d 100644
--- 
a/plugins/transforms/textfile/src/main/java/org/apache/hop/pipeline/transforms/csvinput/CsvInputField.java
+++ 
b/plugins/transforms/textfile/src/main/java/org/apache/hop/pipeline/transforms/csvinput/CsvInputField.java
@@ -28,16 +28,18 @@ import lombok.Setter;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.hop.core.Const;
 import org.apache.hop.core.exception.HopPluginException;
+import org.apache.hop.core.gui.ITextFileInputField;
 import org.apache.hop.core.row.IValueMeta;
 import org.apache.hop.core.row.value.ValueMetaBase;
 import org.apache.hop.core.row.value.ValueMetaFactory;
 import org.apache.hop.core.variables.IVariables;
 import org.apache.hop.metadata.api.HopMetadataProperty;
+import org.jspecify.annotations.NonNull;
 
 /** Describes a single field in a text file */
 @Getter
 @Setter
-public class CsvInputField {
+public class CsvInputField implements ITextFileInputField {
   @HopMetadataProperty(key = "name", injectionKey = "INPUT_NAME")
   private String name;
 
@@ -96,8 +98,8 @@ public class CsvInputField {
     this(null, -9, -9);
   }
 
-  public CsvInputField(String fieldname, int position, int length) {
-    this.name = fieldname;
+  public CsvInputField(String fieldName, int position, int length) {
+    this.name = fieldName;
     this.length = length;
     this.type = IValueMeta.TYPE_STRING;
     this.format = "";
@@ -426,8 +428,18 @@ public class CsvInputField {
     return -1;
   }
 
-  public CsvInputField createNewInstance(String newFieldname, int x, int 
newlength) {
-    return new CsvInputField(newFieldname, x, newlength);
+  @Override
+  public int getPosition() {
+    return -1;
+  }
+
+  public CsvInputField createNewInstance(String newFieldName, int position, 
int newLength) {
+    return new CsvInputField(newFieldName, position, newLength);
+  }
+
+  @Override
+  public void setNullString(String nullString) {
+    // Ignore this option
   }
 
   public IValueMeta toValueMeta(String fieldOriginTransformName, IVariables 
variables)
@@ -449,4 +461,35 @@ public class CsvInputField {
     v.setTrimType(getTrimType());
     return v;
   }
+
+  @Override
+  public boolean isRepeated() {
+    return false;
+  }
+
+  @Override
+  public String getNullString() {
+    return "";
+  }
+
+  @Override
+  public String getIfNullValue() {
+    return "";
+  }
+
+  @Override
+  public boolean isIgnored() {
+    return false;
+  }
+
+  @Override
+  public int compareTo(@NonNull ITextFileInputField iTextFileInputField) {
+    if (!(iTextFileInputField instanceof CsvInputField field)) {
+      return -9;
+    }
+    if (name == null) {
+      return 9;
+    }
+    return name.compareTo(field.getName());
+  }
 }
diff --git 
a/plugins/transforms/textfile/src/main/java/org/apache/hop/pipeline/transforms/csvinput/CsvInputMeta.java
 
b/plugins/transforms/textfile/src/main/java/org/apache/hop/pipeline/transforms/csvinput/CsvInputMeta.java
index d38d1bc7b3..f15d4a4560 100644
--- 
a/plugins/transforms/textfile/src/main/java/org/apache/hop/pipeline/transforms/csvinput/CsvInputMeta.java
+++ 
b/plugins/transforms/textfile/src/main/java/org/apache/hop/pipeline/transforms/csvinput/CsvInputMeta.java
@@ -22,13 +22,16 @@ import java.util.List;
 import java.util.Map;
 import lombok.Getter;
 import lombok.Setter;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.vfs2.FileObject;
 import org.apache.hop.core.CheckResult;
 import org.apache.hop.core.ICheckResult;
 import org.apache.hop.core.annotations.Transform;
 import org.apache.hop.core.exception.HopException;
+import org.apache.hop.core.exception.HopFileException;
 import org.apache.hop.core.exception.HopPluginException;
 import org.apache.hop.core.exception.HopTransformException;
+import org.apache.hop.core.fileinput.InputFile;
 import org.apache.hop.core.injection.Injection;
 import org.apache.hop.core.row.IRowMeta;
 import org.apache.hop.core.row.IValueMeta;
@@ -45,6 +48,9 @@ import org.apache.hop.metadata.api.IHopMetadataProvider;
 import org.apache.hop.pipeline.PipelineMeta;
 import org.apache.hop.pipeline.transform.BaseTransformMeta;
 import org.apache.hop.pipeline.transform.TransformMeta;
+import org.apache.hop.pipeline.transforms.common.ICsvInputAwareMeta;
+import org.apache.hop.pipeline.transforms.file.BaseFileErrorHandling;
+import org.apache.hop.pipeline.transforms.fileinput.text.TextFileInputMeta;
 import org.apache.hop.resource.IResourceNaming;
 import org.apache.hop.resource.ResourceDefinition;
 import org.apache.hop.resource.ResourceEntry;
@@ -63,7 +69,8 @@ import org.apache.hop.staticschema.util.SchemaDefinitionUtil;
     documentationUrl = "/pipeline/transforms/csvinput.html")
 @Getter
 @Setter
-public class CsvInputMeta extends BaseTransformMeta<CsvInput, CsvInputData> {
+public class CsvInputMeta extends BaseTransformMeta<CsvInput, CsvInputData>
+    implements ICsvInputAwareMeta<CsvInputField> {
 
   private static final Class<?> PKG = CsvInput.class;
 
@@ -320,6 +327,46 @@ public class CsvInputMeta extends 
BaseTransformMeta<CsvInput, CsvInputData> {
     }
   }
 
+  @Override
+  public BaseFileErrorHandling getErrorHandling() {
+    return null;
+  }
+
+  @Override
+  public String getErrorCountField() {
+    return "";
+  }
+
+  @Override
+  public String getErrorFieldsField() {
+    return "";
+  }
+
+  @Override
+  public String getErrorTextField() {
+    return "";
+  }
+
+  @Override
+  public boolean isErrorLineSkipped() {
+    return false;
+  }
+
+  @Override
+  public boolean isIncludeFilename() {
+    return false;
+  }
+
+  @Override
+  public boolean isIncludeRowNumber() {
+    return false;
+  }
+
+  @Override
+  public String getLength() {
+    return "";
+  }
+
   @Override
   public void check(
       List<ICheckResult> remarks,
@@ -392,8 +439,8 @@ public class CsvInputMeta extends 
BaseTransformMeta<CsvInput, CsvInputData> {
 
   /**
    * @param variables the variable variables to use
-   * @param definitions
-   * @param iResourceNaming
+   * @param definitions The definitions
+   * @param iResourceNaming The resource naming to use
    * @param metadataProvider the metadataProvider in which non-hop metadata 
could reside.
    * @return the filename of the exported resource
    */
@@ -435,4 +482,62 @@ public class CsvInputMeta extends 
BaseTransformMeta<CsvInput, CsvInputData> {
   public boolean supportsErrorHandling() {
     return true;
   }
+
+  @Override
+  public String getFileType() {
+    return "CSV";
+  }
+
+  @Override
+  public List<InputFile> getInputFiles() {
+    if (StringUtils.isNotEmpty(filenameField) || 
StringUtils.isEmpty(filename)) {
+      return List.of();
+    }
+    List<InputFile> inputFiles = new ArrayList<>();
+    InputFile inputFile = new InputFile();
+    inputFiles.add(inputFile);
+    inputFile.setFileName(filename);
+    return inputFiles;
+  }
+
+  @Override
+  public String getEscapeCharacter() {
+    return "";
+  }
+
+  @Override
+  public boolean isBreakInEnclosureAllowed() {
+    return false;
+  }
+
+  @Override
+  public int getFileFormatTypeNr() {
+    return TextFileInputMeta.FILE_FORMAT_MIXED;
+  }
+
+  @Override
+  public boolean hasHeader() {
+    return isHeaderPresent();
+  }
+
+  @Override
+  public int getNrHeaderLines() {
+    return isHeaderPresent() ? 1 : 0;
+  }
+
+  /**
+   * This is the file to get the header from for the "Get Fields" button.
+   *
+   * @param variables the {@link PipelineMeta}
+   * @return The header file object
+   */
+  @Override
+  public FileObject getHeaderFileObject(IVariables variables) throws 
HopFileException {
+    List<InputFile> inputFiles = getInputFiles();
+    if (inputFiles.isEmpty()) {
+      return null;
+    }
+    String headerFileName = 
variables.resolve(inputFiles.getFirst().getFileName());
+    return HopVfs.getFileObject(headerFileName, variables);
+  }
 }
diff --git 
a/ui/src/main/java/org/apache/hop/ui/pipeline/transform/common/IGetFieldsCapableTransformDialog.java
 
b/ui/src/main/java/org/apache/hop/ui/pipeline/transform/common/IGetFieldsCapableTransformDialog.java
index fca7507576..0beb3caa80 100644
--- 
a/ui/src/main/java/org/apache/hop/ui/pipeline/transform/common/IGetFieldsCapableTransformDialog.java
+++ 
b/ui/src/main/java/org/apache/hop/ui/pipeline/transform/common/IGetFieldsCapableTransformDialog.java
@@ -107,7 +107,6 @@ public interface 
IGetFieldsCapableTransformDialog<TransformMetaType extends Base
   }
 
   default void getFields(final TransformMetaType meta) {
-
     final String[] incomingFieldNames = getFieldNames(meta);
     final List<String> newFieldNames = getNewFieldNames(incomingFieldNames);
 

Reply via email to