This is an automated email from the ASF dual-hosted git repository.
asf-gitbox-commits pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/hop-website.git
The following commit(s) were added to refs/heads/asf-site by this push:
new 75088d3faf Website updated to 2ff35d7
75088d3faf is described below
commit 75088d3faffa6e86929836bde720bef17c8a045f
Author: jenkins <[email protected]>
AuthorDate: Sun Oct 25 00:00:20 2026 +0000
Website updated to 2ff35d7
---
dev-manual/next/metadata-serialization.html | 41 ++++++++++++++++++++++
manual/next/pipeline/transforms/metainject.html | 8 +++++
.../next/workflow/actions/addresultfilenames.html | 2 +-
manual/next/workflow/actions/createfolder.html | 14 +-------
manual/next/workflow/actions/deletefile.html | 14 +-------
.../workflow/actions/deleteresultfilenames.html | 14 +-------
manual/next/workflow/actions/unzip.html | 2 +-
7 files changed, 54 insertions(+), 41 deletions(-)
diff --git a/dev-manual/next/metadata-serialization.html
b/dev-manual/next/metadata-serialization.html
index ec3a04c98a..9bdcfc60a0 100644
--- a/dev-manual/next/metadata-serialization.html
+++ b/dev-manual/next/metadata-serialization.html
@@ -634,6 +634,7 @@
<li><a href="#_string_encoder">String encoder</a></li>
</ul>
</li>
+<li><a href="#_legacy_and_renamed_keys">Legacy and renamed keys</a></li>
<li><a href="#_lists">Lists</a></li>
<li><a href="#_maps">Maps</a></li>
<li><a href="#_sub_elements">Sub-elements</a></li>
@@ -938,6 +939,46 @@ Since this isn’t very meaningful, we offer the
ability to specify an <code
</div>
</div>
<div class="sect1">
+<h2 id="_legacy_and_renamed_keys"><a class="link"
href="#_legacy_and_renamed_keys">Legacy and renamed keys</a></h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>When a property is renamed or a field changes type, existing serialized
files still carry the old key. To keep reading them you can mark a method with
<code>@OnUnknownDeserializationProperty</code>. The serializers invoke it once
for every property encountered during deserialization that does not map to any
<code>@HopMetadataProperty</code> field.</p>
+</div>
+<div class="paragraph">
+<p>This is the recommended way to translate a legacy or renamed key into a
current field. It works for both XML and JSON serialization.</p>
+</div>
+<div class="paragraph">
+<p>From <code>MetaInjectMeta.java</code>, where the legacy boolean
<code>allow_empty_stream_on_execution</code> was replaced by the
<code>ConditionStreamBehavior</code> enum:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<div class="code-lang" data-pagefind-ignore>java</div><pre class="highlightjs
highlight is-highlighted"><code class="language-java hljs"
data-lang="java"><span
class="hljs-meta">@OnUnknownDeserializationProperty</span>
+<span class="hljs-keyword">public</span> <span class="hljs-type">void</span>
<span class="hljs-title function_">onUnknownDeserializationProperty</span><span
class="hljs-params">(UnknownProperty property)</span> {
+ <span class="hljs-comment">// Only translate the legacy boolean when the
current condition_stream_behavior enum was not</span>
+ <span class="hljs-comment">// part of the file. When both are present the
current enum wins, so a file that mixes the</span>
+ <span class="hljs-comment">// two can still represent ALWAYS.</span>
+ <span class="hljs-keyword">if</span> (<span
class="hljs-string">"allow_empty_stream_on_execution"</span>.equals(property.getName())
+ && !conditionStreamBehaviorSet) {
+ conditionStreamBehavior =
ConditionStreamBehavior.fromLegacyBoolean(property.getValue());
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The serializers set annotated fields before firing this callback, and the
<code>conditionStreamBehaviorSet</code> flag (raised whenever the current enum
value is set, including during deserialization) therefore tells the callback
whether a file that contains both the old boolean and the new enum really
carries the new value. The legacy boolean is written only when the current tag
was absent.</p>
+</div>
+<div class="paragraph">
+<p>The callback method must be <code>public</code> and take exactly one
parameter of type <code>UnknownProperty</code>, which exposes
<code>getName()</code> (the key as found in the serialized data) and
<code>getValue()</code> (its raw textual value). You may declare several such
methods; they are all invoked for each unknown property.</p>
+</div>
+<div class="paragraph">
+<p>Discovery is based on <code>Class.getMethods()</code>, so private and
protected methods are ignored, and a public override in a subtype replaces the
inherited method (only the most-derived declaration is invoked, the overridden
parent method is not called). Any annotated method that does not take exactly
one <code>UnknownProperty</code> parameter raises an
<code>IllegalArgumentException</code>.</p>
+</div>
+<div class="paragraph">
+<p>If you prefer, you can still read the raw serialized node directly in a
<code>convertLegacyXml(Node)</code> override for XML-only conversions.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
<h2 id="_lists"><a class="link" href="#_lists">Lists</a></h2>
<div class="sectionbody">
<div class="paragraph">
diff --git a/manual/next/pipeline/transforms/metainject.html
b/manual/next/pipeline/transforms/metainject.html
index 301e958011..4b0b5759b3 100644
--- a/manual/next/pipeline/transforms/metainject.html
+++ b/manual/next/pipeline/transforms/metainject.html
@@ -3223,6 +3223,14 @@ The resulting pipeline will be your template pipeline
with the metadata already
<td class="tableblock halign-left valign-top"><p class="tableblock">Select to
inject metadata and run the template pipeline.
If this option is not selected, metadata injection occurs, but the template
pipeline does not run.</p></td>
</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">When to
run the resulting pipeline</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Controls
whether the injected template pipeline runs when one or more of the input
streams are empty.
+* <strong>Run only when every input stream is not empty</strong> - execution
is skipped if any input stream has no rows.
+* <strong>Run when at least one input stream is not empty</strong> - execution
runs as soon as one input stream has rows, even if other streams are empty.
+* <strong>Run even when every input stream is empty</strong> - execution runs
even when all input streams are empty (useful for templates that can run from
constant mappings alone).
+This replaces the legacy <strong>Allow empty stream to run the resulting
pipeline</strong> checkbox.</p></td>
+</tr>
</tbody>
</table>
<div class="paragraph">
diff --git a/manual/next/workflow/actions/addresultfilenames.html
b/manual/next/workflow/actions/addresultfilenames.html
index 76faa09edf..37631f795e 100644
--- a/manual/next/workflow/actions/addresultfilenames.html
+++ b/manual/next/workflow/actions/addresultfilenames.html
@@ -3039,7 +3039,7 @@ You can add a different file or folder and wildcard on
each line.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Result
rows</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Passed on
unchanged. With <strong>Copy previous results to args?</strong>, the file or
folder comes from the first field and the wildcard from the second field of
each result row, and the list in the dialog is not used, also when there are no
result rows. A result row with only one field stops the workflow with an error,
and no hop is followed.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Passed on
unchanged. With <strong>Copy previous results to args?</strong>, the file or
folder comes from the first field and the wildcard from the second field of
each result row, and the list in the dialog is not used, also when there are no
result rows. A result row with only one field adds all the files of that
folder, as with an empty wildcard.</p></td>
</tr>
</tbody>
</table>
diff --git a/manual/next/workflow/actions/createfolder.html
b/manual/next/workflow/actions/createfolder.html
index 392835ebc4..6c956ce37e 100644
--- a/manual/next/workflow/actions/createfolder.html
+++ b/manual/next/workflow/actions/createfolder.html
@@ -3012,7 +3012,7 @@
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p
class="tableblock">False</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The folder
already exists and <strong>Fail if folder exists</strong> is selected, or no
folder name is set: the number of errors is 0. The folder could not be created,
for example because of missing permissions: the number of errors is 1.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The folder
already exists and <strong>Fail if folder exists</strong> is selected, a file
exists with the folder name, or no folder name is set: the number of errors is
0. The folder could not be created, for example because of missing permissions:
the number of errors is 1.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Result
files</p></td>
@@ -3024,18 +3024,6 @@
</tr>
</tbody>
</table>
-<div class="admonitionblock note">
-<table>
-<tr>
-<td class="icon">
-<i class="fa icon-note" title="Note"></i>
-</td>
-<td class="content">
-When a file exists with the folder name, no folder is created. The action is
true, or false when <strong>Fail if folder exists</strong> is selected.
-</td>
-</tr>
-</table>
-</div>
</div>
</div>
</article>
diff --git a/manual/next/workflow/actions/deletefile.html
b/manual/next/workflow/actions/deletefile.html
index 3bcc8f1ce0..fad01b3628 100644
--- a/manual/next/workflow/actions/deletefile.html
+++ b/manual/next/workflow/actions/deletefile.html
@@ -3013,7 +3013,7 @@ The default is off.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p
class="tableblock">False</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The file
doesn’t exist and <strong>Fail if file doesn’t exist</strong> is
selected, or no file name is set: the number of errors is 0. The file could not
be deleted, for example because of missing permissions: the number of errors is
1.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The file
doesn’t exist and <strong>Fail if file doesn’t exist</strong> is
selected, or no file name is set: the number of errors is 0. The file could not
be deleted, for example because of missing permissions or because it is a
folder that is not empty: the number of errors is 1.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Result
files</p></td>
@@ -3025,18 +3025,6 @@ The default is off.</p></td>
</tr>
</tbody>
</table>
-<div class="admonitionblock note">
-<table>
-<tr>
-<td class="icon">
-<i class="fa icon-note" title="Note"></i>
-</td>
-<td class="content">
-A folder that is not empty is not deleted, but the action is still true, with
1 error.
-</td>
-</tr>
-</table>
-</div>
</div>
</div>
</article>
diff --git a/manual/next/workflow/actions/deleteresultfilenames.html
b/manual/next/workflow/actions/deleteresultfilenames.html
index 33b94d4b1a..dff9a65dde 100644
--- a/manual/next/workflow/actions/deleteresultfilenames.html
+++ b/manual/next/workflow/actions/deleteresultfilenames.html
@@ -3012,7 +3012,7 @@
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p
class="tableblock">True</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The result
files were removed: all of them, or with <strong>Limit action to</strong>,
those whose whole file name, without the folder, matches <strong>Wildcard
(RegExp)</strong> and not <strong>Exclude wildcard (RegExp)</strong>. With
<strong>Limit action to</strong> and an empty <strong>Wildcard
(RegExp)</strong>, all of them are removed.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The result
files were removed: all of them, or with <strong>Limit action to</strong>,
those whose whole file name, without the folder, matches <strong>Wildcard
(RegExp)</strong> and not <strong>Exclude wildcard (RegExp)</strong>, also when
the file no longer exists on disk. With <strong>Limit action to</strong> and an
empty <strong>Wildcard (RegExp)</strong>, all of them are removed.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p
class="tableblock">False</p></td>
@@ -3028,18 +3028,6 @@
</tr>
</tbody>
</table>
-<div class="admonitionblock note">
-<table>
-<tr>
-<td class="icon">
-<i class="fa icon-note" title="Note"></i>
-</td>
-<td class="content">
-With <strong>Limit action to</strong>, a result file that no longer exists on
disk is not removed from the result files, even when its name matches.
-</td>
-</tr>
-</table>
-</div>
</div>
</div>
</article>
diff --git a/manual/next/workflow/actions/unzip.html
b/manual/next/workflow/actions/unzip.html
index de83d8f906..db8307b810 100644
--- a/manual/next/workflow/actions/unzip.html
+++ b/manual/next/workflow/actions/unzip.html
@@ -3157,7 +3157,7 @@
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
-With <strong>Nr errors less than</strong>, the action stops and is false as
soon as the number of errors reaches <strong>Limit files</strong> while result
rows are left to process, but when the last row brings it to that number, the
action is still true. For the files of a single zip file or folder, it is still
true when the number of errors equals <strong>Limit files</strong>, and false
only when it is higher. A zip file that can’t be read, or that
can’t be deleted after ext [...]
+With <strong>Nr errors less than</strong>, the action stops and is false as
soon as the number of errors reaches <strong>Limit files</strong> while result
rows are left to process, but when the last row brings it to that number, the
action is still true. For the files of a single zip file or folder, it is still
true when the number of errors equals <strong>Limit files</strong>, and false
only when it is higher. A zip file that can’t be read, or that
can’t be deleted after ext [...]
</td>
</tr>
</table>