This is an automated email from the ASF dual-hosted git repository.
mattcasters 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 ef9d6484e2 issue #7582 : fix IT write permissions and ExecProcess
single-command exec (#7584)
ef9d6484e2 is described below
commit ef9d6484e2e3e7afb1184b25132e29f85019b58d
Author: Matt Casters <[email protected]>
AuthorDate: Mon Jul 20 17:26:57 2026 +0200
issue #7582 : fix IT write permissions and ExecProcess single-command exec
(#7584)
* issue #7582 : fix IT write permissions and ExecProcess single-command exec
Harden integration-test Docker prep so project output/, files/, and roots
are writable under the container UID, and move generated spreadsheet/MDI/
parquet/http artifacts into world-writable output/ paths (with golden data
and gitignore updates). Also restore Runtime.exec(String) for ExecProcess
single-command mode so command lines are tokenized again (#7565 regression).
* issue #7582 : adopt StringTokenizer-based ExecProcess fix from #7581
Use explicit whitespace tokenization before Runtime.exec(String[]) for
single-command mode (avoids the deprecated String overload), and add a
unit test for tokenizeCommandLine. Credit: @leehaut in #7581.
---
.gitignore | 14 ++-
integration-tests/http/files/http-action-output | 29 ------
.../http/main-0006-https-trustore.hwf | 2 +-
integration-tests/mdi/0016-excelwriter-parent.hpl | 2 +-
integration-tests/mdi/0016-excelwriter-verify.hpl | 2 +-
integration-tests/mdi/0017-json-output-parent.hpl | 2 +-
integration-tests/mdi/0017-json-output-verify.hpl | 2 +-
.../mdi/files/excelwriter-mdi-test.xlsx | Bin 3310 -> 0 bytes
.../mdi/files/jsonoutput-mdi-test_0.json | 1 -
integration-tests/mdi/main-0016-excelwriter.hwf | 2 +-
integration-tests/mdi/main-0017-json-output.hwf | 2 +-
integration-tests/scripts/run-tests-docker.sh | 99 ++++++++++++++++++---
integration-tests/scripts/run-tests.sh | 11 ++-
integration-tests/spreadsheet/0003-write-xlsx.hpl | 2 +-
.../spreadsheet/0004-test-header-check.hpl | 2 +-
integration-tests/spreadsheet/0004-test-header.hpl | 2 +-
.../spreadsheet/0005-check-multiple-files.hpl | 2 +-
.../spreadsheet/0005-write-multiple-files.hpl | 14 +--
.../0006-multi-part-fixed-name-check.hpl | 2 +-
.../spreadsheet/0006-multi-part-fixed-name.hpl | 2 +-
.../spreadsheet/0007-append-to-xlsx-validate.hpl | 2 +-
.../spreadsheet/0007-append-to-xlsx.hpl | 2 +-
.../datasets/golden-multi-file-excel.csv | 14 +--
.../spreadsheet/main-0007-append-file.hwf | 6 +-
.../transforms/0072-prepare-parquet-file.hpl | 2 +-
.../transforms/0072-read-parquet-file.hpl | 2 +-
.../main-0072-parquet-input-test-delete.hwf | 2 +-
27 files changed, 143 insertions(+), 81 deletions(-)
diff --git a/.gitignore b/.gitignore
index ef3a8dc1f6..64433a06aa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -46,6 +46,7 @@ docs/.pnp.js
tmp/images
integration-tests/mail/output/
+# Generated spreadsheet writer outputs (under files/ historically; now also
under output/)
integration-tests/spreadsheet/files/exel-part-001.xlsx
integration-tests/spreadsheet/files/exel-part-002.xlsx
integration-tests/spreadsheet/files/exel-header-test.xlsx
@@ -55,10 +56,20 @@ integration-tests/spreadsheet/files/exel-multi-part_1.xlsx
integration-tests/spreadsheet/files/exel-multi-part_2.xlsx
integration-tests/spreadsheet/files/exel-multi-part_3.xlsx
integration-tests/spreadsheet/files/exel-multi-part_4.xlsx
+/integration-tests/spreadsheet/files/exelwriter-testfile
+integration-tests/spreadsheet/output/
integration-tests/json/output
integration-tests/mdi/files/excelwriter-mdi-test.xlsx
+integration-tests/mdi/files/jsonoutput-mdi-test_0.json
+integration-tests/mdi/output/
+integration-tests/http/files/http-action-output
+integration-tests/http/output/
integration-tests/spreadsheet/files/sample-file-append.xlsx
+integration-tests/spreadsheet/files/sample-file-append-test.xlsx
integration-tests/spark-native/output
+integration-tests/transforms/files/parquet-test*.parquet
+# MDI may still leave injected pipelines in the project root on older paths
+integration-tests/mdi/*-injected.hpl
assemblies/debug/audit
@@ -71,5 +82,4 @@ screenshots/
# Docker script leaving audit data
docker/local-data/
-
-/integration-tests/spreadsheet/files/exelwriter-testfile
+/docker/marketplace-nexus/.env
diff --git a/integration-tests/http/files/http-action-output
b/integration-tests/http/files/http-action-output
deleted file mode 100644
index ec80ada209..0000000000
--- a/integration-tests/http/files/http-action-output
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements. See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
--->
-
-<!DOCTYPE html>
-<html>
- <head>
- <title>Example</title>
- </head>
- <body>
- <p>This is an example of a simple HTML page.</p>
- </body>
-</html>
diff --git a/integration-tests/http/main-0006-https-trustore.hwf
b/integration-tests/http/main-0006-https-trustore.hwf
index 83c8bad79f..3c48b4dd21 100644
--- a/integration-tests/http/main-0006-https-trustore.hwf
+++ b/integration-tests/http/main-0006-https-trustore.hwf
@@ -82,7 +82,7 @@ limitations under the License.
<type>HTTP</type>
<attributes/>
<url>${HTTPS_TEST_URL}</url>
- <targetfilename>${PROJECT_HOME}/files/http-action-output</targetfilename>
+
<targetfilename>${PROJECT_HOME}/output/http-action-output</targetfilename>
<file_appended>N</file_appended>
<date_time_added>N</date_time_added>
<targetfilename_extension/>
diff --git a/integration-tests/mdi/0016-excelwriter-parent.hpl
b/integration-tests/mdi/0016-excelwriter-parent.hpl
index 0724edcfc8..ed6a26651a 100644
--- a/integration-tests/mdi/0016-excelwriter-parent.hpl
+++ b/integration-tests/mdi/0016-excelwriter-parent.hpl
@@ -173,7 +173,7 @@ limitations under the License.
</fields>
<data>
<line>
- <item>${PROJECT_HOME}/files/excelwriter-mdi-test</item>
+ <item>${PROJECT_HOME}/output/excelwriter-mdi-test</item>
<item>xlsx</item>
</line>
</data>
diff --git a/integration-tests/mdi/0016-excelwriter-verify.hpl
b/integration-tests/mdi/0016-excelwriter-verify.hpl
index 3a47e4dffd..0cd0259a27 100644
--- a/integration-tests/mdi/0016-excelwriter-verify.hpl
+++ b/integration-tests/mdi/0016-excelwriter-verify.hpl
@@ -139,7 +139,7 @@ limitations under the License.
<accept_field/>
<accept_transform_name/>
<file>
- <name>${PROJECT_HOME}/files/excelwriter-mdi-test.xlsx</name>
+ <name>${PROJECT_HOME}/output/excelwriter-mdi-test.xlsx</name>
<filemask/>
<exclude_filemask/>
<file_required>N</file_required>
diff --git a/integration-tests/mdi/0017-json-output-parent.hpl
b/integration-tests/mdi/0017-json-output-parent.hpl
index 1de26514b7..cee5362027 100644
--- a/integration-tests/mdi/0017-json-output-parent.hpl
+++ b/integration-tests/mdi/0017-json-output-parent.hpl
@@ -197,7 +197,7 @@ limitations under the License.
</fields>
<data>
<line>
- <item>${PROJECT_HOME}/files/jsonoutput-mdi-test</item>
+ <item>${PROJECT_HOME}/output/jsonoutput-mdi-test</item>
<item>json</item>
</line>
</data>
diff --git a/integration-tests/mdi/0017-json-output-verify.hpl
b/integration-tests/mdi/0017-json-output-verify.hpl
index 0e58e6ce70..a7a9b1cd7c 100644
--- a/integration-tests/mdi/0017-json-output-verify.hpl
+++ b/integration-tests/mdi/0017-json-output-verify.hpl
@@ -79,7 +79,7 @@ limitations under the License.
<defaultPathLeafToNull>Y</defaultPathLeafToNull>
<rownum_field/>
<file>
- <name>${PROJECT_HOME}/files/jsonoutput-mdi-test_0.json</name>
+ <name>${PROJECT_HOME}/output/jsonoutput-mdi-test_0.json</name>
<filemask/>
<exclude_filemask/>
<file_required>N</file_required>
diff --git a/integration-tests/mdi/files/excelwriter-mdi-test.xlsx
b/integration-tests/mdi/files/excelwriter-mdi-test.xlsx
deleted file mode 100644
index 89dc9f1333..0000000000
Binary files a/integration-tests/mdi/files/excelwriter-mdi-test.xlsx and
/dev/null differ
diff --git a/integration-tests/mdi/files/jsonoutput-mdi-test_0.json
b/integration-tests/mdi/files/jsonoutput-mdi-test_0.json
deleted file mode 100644
index 4e6a7c4636..0000000000
--- a/integration-tests/mdi/files/jsonoutput-mdi-test_0.json
+++ /dev/null
@@ -1 +0,0 @@
-{"data":[{"foo":"bar"}]}
\ No newline at end of file
diff --git a/integration-tests/mdi/main-0016-excelwriter.hwf
b/integration-tests/mdi/main-0016-excelwriter.hwf
index 8479522e44..20c7b64140 100644
--- a/integration-tests/mdi/main-0016-excelwriter.hwf
+++ b/integration-tests/mdi/main-0016-excelwriter.hwf
@@ -53,7 +53,7 @@ limitations under the License.
<description/>
<type>DELETE_FILE</type>
<attributes/>
- <filename>${PROJECT_HOME}/files/excelwriter-mdi-test.xlsx</filename>
+ <filename>${PROJECT_HOME}/output/excelwriter-mdi-test.xlsx</filename>
<fail_if_file_not_exists>N</fail_if_file_not_exists>
<parallel>N</parallel>
<xloc>272</xloc>
diff --git a/integration-tests/mdi/main-0017-json-output.hwf
b/integration-tests/mdi/main-0017-json-output.hwf
index 30d5dfa8ae..65a2a0b3d5 100644
--- a/integration-tests/mdi/main-0017-json-output.hwf
+++ b/integration-tests/mdi/main-0017-json-output.hwf
@@ -53,7 +53,7 @@ limitations under the License.
<description/>
<type>DELETE_FILE</type>
<attributes/>
- <filename>${PROJECT_HOME}/files/jsonoutput-mdi-test.json</filename>
+ <filename>${PROJECT_HOME}/output/jsonoutput-mdi-test.json</filename>
<fail_if_file_not_exists>N</fail_if_file_not_exists>
<parallel>N</parallel>
<xloc>208</xloc>
diff --git a/integration-tests/scripts/run-tests-docker.sh
b/integration-tests/scripts/run-tests-docker.sh
index 1d56361d10..f6ebeac88b 100755
--- a/integration-tests/scripts/run-tests-docker.sh
+++ b/integration-tests/scripts/run-tests-docker.sh
@@ -112,14 +112,29 @@ fi
# Detect a real Google Cloud service-account key. The dummy file is a license
comment, not
# JSON; spreadsheet Google Sheets ITs need a real key (Jenkins: credentials
gcp-access-hop).
+# Require non-empty file + type=service_account + JSON-looking content so a
corrupt/empty
+# secret still skips cleanly. When python3 is available, also require
parseable JSON.
SKIP_GOOGLE_SHEETS="false"
+GCP_KEY_OK="true"
if [ ! -f "${GCP_KEY_FILE}" ] \
|| [[ "${GCP_KEY_FILE}" == *dummyfile* ]] \
- || ! grep -qE '"type"[[:space:]]*:[[:space:]]*"service_account"'
"${GCP_KEY_FILE}" 2>/dev/null; then
+ || [ ! -s "${GCP_KEY_FILE}" ] \
+ || ! grep -qE '"type"[[:space:]]*:[[:space:]]*"service_account"'
"${GCP_KEY_FILE}" 2>/dev/null \
+ || ! grep -qE '\{' "${GCP_KEY_FILE}" 2>/dev/null; then
+ GCP_KEY_OK="false"
+elif command -v python3 >/dev/null 2>&1; then
+ if ! python3 -c "import json,sys; json.load(open(sys.argv[1]))"
"${GCP_KEY_FILE}" 2>/dev/null; then
+ GCP_KEY_OK="false"
+ fi
+fi
+if [ "${GCP_KEY_OK}" = "true" ]; then
+ echo "GCP service-account JSON present at GCP_KEY_FILE=${GCP_KEY_FILE};
Google Sheets ITs will run"
+else
SKIP_GOOGLE_SHEETS="true"
echo "No valid GCP service-account JSON at GCP_KEY_FILE=${GCP_KEY_FILE};
spreadsheet Google Sheets tests will be skipped"
fi
export SKIP_GOOGLE_SHEETS
+echo "SKIP_GOOGLE_SHEETS=${SKIP_GOOGLE_SHEETS}"
if [ -z "${HOP_OPTIONS}" ] ; then
HOP_OPTIONS="${HOP_OPTIONS}
-Djavax.net.ssl.keyStore=./docker/integration-tests/resource/keystore.jks
-Djavax.net.ssl.keyStorePassword=password
-Djavax.net.ssl.trustStore=./docker/integration-tests/resource/mail/conf/keystore
"
@@ -142,31 +157,52 @@ fi
mkdir -p "${CURRENT_DIR}"/../surefire-reports/
chmod 777 "${CURRENT_DIR}"/../surefire-reports/
-# Pre-create project output/ dirs on the host and make them world-writable.
+# Pre-create project write dirs on the host and make them world-writable.
# ASF Jenkins passes a container UID that matches the agent workspace owner,
so ownership
-# alone is enough there. World-writable output/ is a belt-and-suspenders for:
+# alone is often enough. World-writable dirs are belt-and-suspenders for:
# - local runs where someone overrides JENKINS_UID to a fixed value
# - compose files that hardcode build-arg UIDs when not using this script's
--build-arg
-# Pipelines that write temp artifacts (Excel/ODS writer, Spark CSV, etc.) use
-# ${PROJECT_HOME}/output.
+# - residual files from a previous container UID that the host cannot
delete/overwrite
+#
+# Many ITs write under ${PROJECT_HOME}/output (Excel/ODS, Spark CSV, mail),
under
+# ${PROJECT_HOME}/files (HTTP download, spreadsheet Excel writer, MDI JSON,
parquet),
+# and some MDI tests write *-injected.hpl into the project root itself.
#
# Spark/Spark-native leave untracked part-*.csv / .crc trees under
output/<case>/ owned by
-# the previous container UID (often 755). Later runs with a different
JENKINS_UID cannot
-# delete them. Only remove *untracked* residual files — never wipe git-tracked
content
+# the previous container UID. Later runs with a different JENKINS_UID cannot
delete them.
+# Only remove *untracked* residual files under output/ — never wipe
git-tracked content
# (ldap stores setup pipelines under output/*.hpl).
REPO_ROOT="$(cd "${CURRENT_DIR}/../.." && pwd)"
+IT_ROOT="$(cd "${CURRENT_DIR}/.." && pwd)"
+
+# Best-effort: re-own the whole integration-tests tree as the container user
so bind-mount
+# writes succeed even when a previous run left root/other-UID residuals (needs
Docker).
+# Ownership only — do not chmod -R the tree (that dirties git file modes on
644 fixtures).
+if docker info >/dev/null 2>&1; then
+ echo "Ensuring integration-tests/ is owned by ${JENKINS_UID}:${JENKINS_GID}
(container identity)"
+ docker run --rm -v "${IT_ROOT}:/files" alpine:3.19 \
+ sh -c "chown -R ${JENKINS_UID}:${JENKINS_GID} /files 2>/dev/null; true" \
+ 2>/dev/null || true
+fi
+
for d in "${CURRENT_DIR}"/../${PROJECT_NAME}/; do
if [[ "$d" != *"scripts/" ]] && [[ "$d" != *"surefire-reports/" ]] && [[
"$d" != *"hopweb/" ]]; then
if [ -d "$d" ] && [ ! -f "$d/disabled.txt" ]; then
- mkdir -p "$d/output"
- chmod 777 "$d/output" 2>/dev/null || true
+ # Project root: MDI target_file=…-injected.hpl writes here.
+ chmod a+rwx "$d" 2>/dev/null || true
+
+ mkdir -p "$d/output" "$d/files"
+ chmod 777 "$d/output" "$d/files" 2>/dev/null || true
+
abs_out="$(cd "$d/output" && pwd)"
rel_out="${abs_out#"${REPO_ROOT}"/}"
+ abs_files="$(cd "$d/files" && pwd)"
+ rel_files="${abs_files#"${REPO_ROOT}"/}"
- # 1) Untracked leftovers only when the host can delete them (safe for
ldap/*.hpl).
+ # 1) Untracked leftovers under output/ only when the host can delete
them (safe for ldap/*.hpl).
git -C "${REPO_ROOT}" clean -fd -- "${rel_out}" 2>/dev/null || true
- # 2) Other-UID Spark residuals: chmod as root, then host git clean again.
+ # 2) Other-UID residuals under output/: chmod as root, then host git
clean again.
# Never blanket-delete under output/ (that wiped ldap/output/*.hpl).
if find "$d/output" \( -name 'part-*' -o -name '_SUCCESS' -o -name
'*.crc' \) 2>/dev/null | grep -q .; then
echo "Fixing permissions on Spark residual files under ${rel_out}"
@@ -178,6 +214,47 @@ for d in "${CURRENT_DIR}"/../${PROJECT_NAME}/; do
sh -c 'find /out \( -name "part-*" -o -name "_SUCCESS" -o -name
"*.crc" \) -exec rm -rf {} + 2>/dev/null; find /out -type d -empty -delete
2>/dev/null; true' \
2>/dev/null || true
fi
+
+ # 3) files/ must stay writable for overwrite (HopVfs deletes then
recreates).
+ # Re-assert modes; do not wipe fixtures. Only remove *untracked*
generated leftovers
+ # (never rm a path that is still in git — e.g.
http/files/exel-part-001.xlsx is a fixture).
+ if [ -d "$d/files" ]; then
+ chmod 777 "$d/files" 2>/dev/null || true
+ for residual in \
+ http-action-output \
+ jsonoutput-mdi-test_0.json \
+ excelwriter-mdi-test.xlsx \
+ exelwriter-testfile \
+ exelwriter-testfile.xls \
+ exel-header-test.xlsx \
+ exel-part-001.xlsx \
+ exel-part-002.xlsx \
+ exel-multi-part_0.xlsx \
+ exel-multi-part_1.xlsx \
+ exel-multi-part_2.xlsx \
+ exel-multi-part_3.xlsx \
+ exel-multi-part_4.xlsx \
+ sample-file-append-test.xlsx \
+ parquet-test-00-0001.parquet; do
+ residual_path="$d/files/${residual}"
+ residual_rel="${residual_path#"${REPO_ROOT}"/}"
+ # Skip if tracked by git (fixture), only drop untracked leftovers
+ if [ -e "${residual_path}" ] \
+ && ! git -C "${REPO_ROOT}" ls-files --error-unmatch
"${residual_rel}" >/dev/null 2>&1; then
+ rm -f "${residual_path}" 2>/dev/null || true
+ fi
+ done
+ # If host still cannot write into files/, force a+rwx via root.
+ if ! touch "$d/files/.hop-it-write-check" 2>/dev/null; then
+ echo "Fixing permissions on ${rel_files} (container/host UID
mismatch)"
+ docker run --rm -v "${abs_files}:/filesdir" alpine:3.19 \
+ sh -c 'chmod -R a+rwx /filesdir 2>/dev/null; true' 2>/dev/null ||
true
+ else
+ rm -f "$d/files/.hop-it-write-check" 2>/dev/null || true
+ fi
+ chmod 777 "$d/files" 2>/dev/null || true
+ fi
+
chmod 777 "$d/output" 2>/dev/null || true
fi
fi
diff --git a/integration-tests/scripts/run-tests.sh
b/integration-tests/scripts/run-tests.sh
index a63d2e8933..de7da572ba 100755
--- a/integration-tests/scripts/run-tests.sh
+++ b/integration-tests/scripts/run-tests.sh
@@ -255,15 +255,20 @@ for d in "${CURRENT_DIR}"/../${PROJECT_NAME}/; do
# Create New Project
export HOP_CONFIG_FOLDER="$d"
- # Project output/ is often written by pipelines (CSV, Excel/ODS temp
files, etc.).
+ # Project output/ and files/ are written by pipelines (CSV, Excel/ODS,
HTTP downloads,
+ # MDI JSON, parquet, etc.). MDI also writes *-injected.hpl into the
project root.
# On ASF Jenkins the container UID matches the agent workspace owner
(Jenkinsfile.daily
- # passes id -u / id -g), so writes succeed by ownership. When UIDs
differ, output/ is
+ # passes id -u / id -g), so writes succeed by ownership. When UIDs
differ, dirs are
# pre-created and chmod'd world-writable by run-tests-docker.sh on the
host; here we
# only best-effort reinforce that (mkdir/chmod may no-op if not owner).
- mkdir -p "$d/output" 2>/dev/null || true
+ chmod a+rwx "$d" 2>/dev/null || true
+ mkdir -p "$d/output" "$d/files" 2>/dev/null || true
if [ -d "$d/output" ]; then
chmod 777 "$d/output" 2>/dev/null || true
fi
+ if [ -d "$d/files" ]; then
+ chmod 777 "$d/files" 2>/dev/null || true
+ fi
# Default pipeline run configuration name used by hop-run and the suite
runner.
# Beam projects name their Beam engine "local" and keep a native Local
engine as "hop-local".
diff --git a/integration-tests/spreadsheet/0003-write-xlsx.hpl
b/integration-tests/spreadsheet/0003-write-xlsx.hpl
index 06de996bae..e5956600d0 100644
--- a/integration-tests/spreadsheet/0003-write-xlsx.hpl
+++ b/integration-tests/spreadsheet/0003-write-xlsx.hpl
@@ -130,7 +130,7 @@ limitations under the License.
<appendLines>N</appendLines>
<add_to_result_filenames>Y</add_to_result_filenames>
<file>
- <name>${PROJECT_HOME}/files/exelwriter-testfile</name>
+ <name>${PROJECT_HOME}/output/exelwriter-testfile</name>
<extention>xlsx</extention>
<do_not_open_newfile_init>N</do_not_open_newfile_init>
<split>N</split>
diff --git a/integration-tests/spreadsheet/0004-test-header-check.hpl
b/integration-tests/spreadsheet/0004-test-header-check.hpl
index 6b0730d59c..13d6819016 100644
--- a/integration-tests/spreadsheet/0004-test-header-check.hpl
+++ b/integration-tests/spreadsheet/0004-test-header-check.hpl
@@ -222,7 +222,7 @@ limitations under the License.
<accept_field/>
<accept_transform_name/>
<file>
- <name>${PROJECT_HOME}/files/exel-header-test.xlsx</name>
+ <name>${PROJECT_HOME}/output/exel-header-test.xlsx</name>
<filemask/>
<exclude_filemask/>
<file_required>N</file_required>
diff --git a/integration-tests/spreadsheet/0004-test-header.hpl
b/integration-tests/spreadsheet/0004-test-header.hpl
index 78a8f92780..d76b419f36 100644
--- a/integration-tests/spreadsheet/0004-test-header.hpl
+++ b/integration-tests/spreadsheet/0004-test-header.hpl
@@ -113,7 +113,7 @@ limitations under the License.
<date_time_format/>
<do_not_open_newfile_init>N</do_not_open_newfile_init>
<extension>xlsx</extension>
- <name>${PROJECT_HOME}/files/exel-header-test</name>
+ <name>${PROJECT_HOME}/output/exel-header-test</name>
<filename_field/>
<filename_in_field>N</filename_in_field>
<if_file_exists>reuse</if_file_exists>
diff --git a/integration-tests/spreadsheet/0005-check-multiple-files.hpl
b/integration-tests/spreadsheet/0005-check-multiple-files.hpl
index 90ce641e83..191f9b557e 100644
--- a/integration-tests/spreadsheet/0005-check-multiple-files.hpl
+++ b/integration-tests/spreadsheet/0005-check-multiple-files.hpl
@@ -90,7 +90,7 @@ limitations under the License.
<accept_field/>
<accept_transform_name/>
<file>
- <name>${PROJECT_HOME}/files/</name>
+ <name>${PROJECT_HOME}/output/</name>
<filemask>^exel-part-.*</filemask>
<exclude_filemask/>
<file_required>N</file_required>
diff --git a/integration-tests/spreadsheet/0005-write-multiple-files.hpl
b/integration-tests/spreadsheet/0005-write-multiple-files.hpl
index 56332beb8f..76f5fbb05c 100644
--- a/integration-tests/spreadsheet/0005-write-multiple-files.hpl
+++ b/integration-tests/spreadsheet/0005-write-multiple-files.hpl
@@ -76,31 +76,31 @@ limitations under the License.
<data>
<line>
<item>a</item>
- <item>${PROJECT_HOME}/files/exel-part-001</item>
+ <item>${PROJECT_HOME}/output/exel-part-001</item>
</line>
<line>
<item>b</item>
- <item>${PROJECT_HOME}/files/exel-part-001</item>
+ <item>${PROJECT_HOME}/output/exel-part-001</item>
</line>
<line>
<item>d</item>
- <item>${PROJECT_HOME}/files/exel-part-002</item>
+ <item>${PROJECT_HOME}/output/exel-part-002</item>
</line>
<line>
<item>e</item>
- <item>${PROJECT_HOME}/files/exel-part-002</item>
+ <item>${PROJECT_HOME}/output/exel-part-002</item>
</line>
<line>
<item>f</item>
- <item>${PROJECT_HOME}/files/exel-part-002</item>
+ <item>${PROJECT_HOME}/output/exel-part-002</item>
</line>
<line>
<item>c</item>
- <item>${PROJECT_HOME}/files/exel-part-001</item>
+ <item>${PROJECT_HOME}/output/exel-part-001</item>
</line>
<line>
<item>g</item>
- <item>${PROJECT_HOME}/files/exel-part-002</item>
+ <item>${PROJECT_HOME}/output/exel-part-002</item>
</line>
</data>
<attributes/>
diff --git a/integration-tests/spreadsheet/0006-multi-part-fixed-name-check.hpl
b/integration-tests/spreadsheet/0006-multi-part-fixed-name-check.hpl
index c897ee2996..b250b73171 100644
--- a/integration-tests/spreadsheet/0006-multi-part-fixed-name-check.hpl
+++ b/integration-tests/spreadsheet/0006-multi-part-fixed-name-check.hpl
@@ -126,7 +126,7 @@ limitations under the License.
<accept_field/>
<accept_transform_name/>
<file>
- <name>${PROJECT_HOME}/files/</name>
+ <name>${PROJECT_HOME}/output/</name>
<filemask>^exel-multi-part.*</filemask>
<exclude_filemask/>
<file_required>N</file_required>
diff --git a/integration-tests/spreadsheet/0006-multi-part-fixed-name.hpl
b/integration-tests/spreadsheet/0006-multi-part-fixed-name.hpl
index f3828676f1..2169151415 100644
--- a/integration-tests/spreadsheet/0006-multi-part-fixed-name.hpl
+++ b/integration-tests/spreadsheet/0006-multi-part-fixed-name.hpl
@@ -130,7 +130,7 @@ limitations under the License.
<date_time_format/>
<do_not_open_newfile_init>Y</do_not_open_newfile_init>
<extension>xlsx</extension>
- <name>${PROJECT_HOME}/files/exel-multi-part</name>
+ <name>${PROJECT_HOME}/output/exel-multi-part</name>
<filename_field/>
<filename_in_field>N</filename_in_field>
<if_file_exists>new</if_file_exists>
diff --git a/integration-tests/spreadsheet/0007-append-to-xlsx-validate.hpl
b/integration-tests/spreadsheet/0007-append-to-xlsx-validate.hpl
index 3829b3ce4d..6f0959d80d 100644
--- a/integration-tests/spreadsheet/0007-append-to-xlsx-validate.hpl
+++ b/integration-tests/spreadsheet/0007-append-to-xlsx-validate.hpl
@@ -207,7 +207,7 @@ limitations under the License.
<file_required>N</file_required>
<filemask/>
<include_subfolders>N</include_subfolders>
- <name>${PROJECT_HOME}/files/sample-file-append-test.xlsx</name>
+ <name>${PROJECT_HOME}/output/sample-file-append-test.xlsx</name>
</file>
<filefield/>
<header>Y</header>
diff --git a/integration-tests/spreadsheet/0007-append-to-xlsx.hpl
b/integration-tests/spreadsheet/0007-append-to-xlsx.hpl
index e06dd39c69..e1fe963066 100644
--- a/integration-tests/spreadsheet/0007-append-to-xlsx.hpl
+++ b/integration-tests/spreadsheet/0007-append-to-xlsx.hpl
@@ -203,7 +203,7 @@ limitations under the License.
<filename_in_field>N</filename_in_field>
<if_file_exists>reuse</if_file_exists>
<if_sheet_exists>reuse</if_sheet_exists>
- <name>${PROJECT_HOME}/files/sample-file-append-test</name>
+ <name>${PROJECT_HOME}/output/sample-file-append-test</name>
<password/>
<protect_sheet>N</protect_sheet>
<protected_by/>
diff --git a/integration-tests/spreadsheet/datasets/golden-multi-file-excel.csv
b/integration-tests/spreadsheet/datasets/golden-multi-file-excel.csv
index 1ca551cfc1..f748c27df9 100644
--- a/integration-tests/spreadsheet/datasets/golden-multi-file-excel.csv
+++ b/integration-tests/spreadsheet/datasets/golden-multi-file-excel.csv
@@ -1,8 +1,8 @@
value,filename
-a,${PROJECT_HOME}/files/exel-part-001
-b,${PROJECT_HOME}/files/exel-part-001
-c,${PROJECT_HOME}/files/exel-part-001
-d,${PROJECT_HOME}/files/exel-part-002
-e,${PROJECT_HOME}/files/exel-part-002
-f,${PROJECT_HOME}/files/exel-part-002
-g,${PROJECT_HOME}/files/exel-part-002
+a,${PROJECT_HOME}/output/exel-part-001
+b,${PROJECT_HOME}/output/exel-part-001
+c,${PROJECT_HOME}/output/exel-part-001
+d,${PROJECT_HOME}/output/exel-part-002
+e,${PROJECT_HOME}/output/exel-part-002
+f,${PROJECT_HOME}/output/exel-part-002
+g,${PROJECT_HOME}/output/exel-part-002
diff --git a/integration-tests/spreadsheet/main-0007-append-file.hwf
b/integration-tests/spreadsheet/main-0007-append-file.hwf
index a572f54f47..94b8b82c7a 100644
--- a/integration-tests/spreadsheet/main-0007-append-file.hwf
+++ b/integration-tests/spreadsheet/main-0007-append-file.hwf
@@ -106,7 +106,7 @@ limitations under the License.
<type>DELETE_FILE</type>
<attributes/>
<fail_if_file_not_exists>N</fail_if_file_not_exists>
- <filename>${PROJECT_HOME}/files/sample-file-append-test.xlsx</filename>
+ <filename>${PROJECT_HOME}/output/sample-file-append-test.xlsx</filename>
<parallel>N</parallel>
<xloc>880</xloc>
<yloc>48</yloc>
@@ -124,12 +124,12 @@ limitations under the License.
<remove_source_files>N</remove_source_files>
<add_result_filesname>N</add_result_filesname>
<destination_is_a_file>Y</destination_is_a_file>
- <create_destination_folder>N</create_destination_folder>
+ <create_destination_folder>Y</create_destination_folder>
<fields>
<field>
<source_filefolder>EMPTY_SOURCE_URL-0-${PROJECT_HOME}/files/sample-file-append.xlsx</source_filefolder>
<source_configuration_name>STATIC-SOURCE-FILE-0</source_configuration_name>
-
<destination_filefolder>EMPTY_DEST_URL-0-${PROJECT_HOME}/files/sample-file-append-test.xlsx</destination_filefolder>
+
<destination_filefolder>EMPTY_DEST_URL-0-${PROJECT_HOME}/output/sample-file-append-test.xlsx</destination_filefolder>
<destination_configuration_name>STATIC-DEST-FILE-0</destination_configuration_name>
<wildcard/>
</field>
diff --git a/integration-tests/transforms/0072-prepare-parquet-file.hpl
b/integration-tests/transforms/0072-prepare-parquet-file.hpl
index 30e45d33b3..4756294b29 100644
--- a/integration-tests/transforms/0072-prepare-parquet-file.hpl
+++ b/integration-tests/transforms/0072-prepare-parquet-file.hpl
@@ -259,7 +259,7 @@ limitations under the License.
<target_field>Int_Number</target_field>
</field>
</fields>
- <filename_base>${PROJECT_HOME}/files/parquet-test</filename_base>
+ <filename_base>${PROJECT_HOME}/output/parquet-test</filename_base>
<filename_create_parent_folders>Y</filename_create_parent_folders>
<filename_datetime_format>yyyyMMdd-HHmmss</filename_datetime_format>
<filename_ext>parquet</filename_ext>
diff --git a/integration-tests/transforms/0072-read-parquet-file.hpl
b/integration-tests/transforms/0072-read-parquet-file.hpl
index 49d0c63168..ec58354513 100644
--- a/integration-tests/transforms/0072-read-parquet-file.hpl
+++ b/integration-tests/transforms/0072-read-parquet-file.hpl
@@ -133,7 +133,7 @@ limitations under the License.
<group/>
<length>-1</length>
<name>file</name>
- <nullif>files/parquet-test-00-0001.parquet</nullif>
+ <nullif>output/parquet-test-00-0001.parquet</nullif>
<precision>-1</precision>
<set_empty_string>N</set_empty_string>
<type>String</type>
diff --git
a/integration-tests/transforms/main-0072-parquet-input-test-delete.hwf
b/integration-tests/transforms/main-0072-parquet-input-test-delete.hwf
index 8ad4d17b97..81f5f5f60b 100644
--- a/integration-tests/transforms/main-0072-parquet-input-test-delete.hwf
+++ b/integration-tests/transforms/main-0072-parquet-input-test-delete.hwf
@@ -106,7 +106,7 @@ limitations under the License.
<type>DELETE_FILE</type>
<attributes/>
<fail_if_file_not_exists>N</fail_if_file_not_exists>
- <filename>${PROJECT_HOME}/files/parquet-test-00-0001.parquet</filename>
+ <filename>${PROJECT_HOME}/output/parquet-test-00-0001.parquet</filename>
<parallel>N</parallel>
<xloc>864</xloc>
<yloc>192</yloc>