diff --git a/org.knime.core/.settings/.api_filters b/org.knime.core/.settings/.api_filters
index 95db648945..aca26314d6 100644
--- a/org.knime.core/.settings/.api_filters
+++ b/org.knime.core/.settings/.api_filters
@@ -8,4 +8,12 @@
+
+
+
+
+
+
+
+
diff --git a/org.knime.core/src/eclipse/org/knime/core/node/workflow/NodeExecutionJob.java b/org.knime.core/src/eclipse/org/knime/core/node/workflow/NodeExecutionJob.java
index 47f1e1b73f..423b464dfb 100644
--- a/org.knime.core/src/eclipse/org/knime/core/node/workflow/NodeExecutionJob.java
+++ b/org.knime.core/src/eclipse/org/knime/core/node/workflow/NodeExecutionJob.java
@@ -57,7 +57,6 @@
import org.knime.core.node.port.PortObject;
import org.knime.core.node.port.PortType;
import org.knime.core.node.util.StringFormat;
-import org.knime.core.node.workflow.execresult.NodeContainerExecutionResult;
import org.knime.core.node.workflow.execresult.NodeContainerExecutionStatus;
import org.knime.core.util.ThreadPool;
@@ -245,9 +244,9 @@ private static boolean checkForTryCatchScope(final SingleNodeContainer snc,
// failure inside an active try-catch:
// make node inactive and preserve error message(s)
if (snc.setInactive()) {
- String errorMessage = (status instanceof NodeContainerExecutionResult)
- ? ((NodeContainerExecutionResult)status).getNodeMessage().getMessage() : status.toString();
- snc.setNodeMessage(NodeMessage.newError("Execution failed in Try-Catch block: " + errorMessage));
+ final NodeMessage msg = status.getNodeMessage().prependMessage("Execution failed in Try-Catch block: ");
+ String errorMessage = msg.getMessage();
+ snc.setNodeMessage(msg);
// and store information such that the catch-node can report it
tcslc.setErrorToFlowObjectStack(snc.getName(), errorMessage, null, null,
snc.getOutgoingFlowObjectStack());
diff --git a/org.knime.core/src/eclipse/org/knime/core/node/workflow/SubNodeContainer.java b/org.knime.core/src/eclipse/org/knime/core/node/workflow/SubNodeContainer.java
index fef11e6958..47b984551a 100644
--- a/org.knime.core/src/eclipse/org/knime/core/node/workflow/SubNodeContainer.java
+++ b/org.knime.core/src/eclipse/org/knime/core/node/workflow/SubNodeContainer.java
@@ -1554,7 +1554,7 @@ public Boolean call() throws Exception {
.filter(m -> NodeMessage.Type.RESET != m.getMessageType()) //
.orElse(NodeMessage.newError(""));
setNodeMessage(nodeMessage);
- return NodeContainerExecutionStatus.newFailure(nodeMessage.getMessage());
+ return NodeContainerExecutionStatus.newFailure(nodeMessage);
}
return allExecuted ? NodeContainerExecutionStatus.SUCCESS : NodeContainerExecutionStatus.FAILURE;
} finally {
diff --git a/org.knime.core/src/eclipse/org/knime/core/node/workflow/execresult/NodeContainerExecutionResult.java b/org.knime.core/src/eclipse/org/knime/core/node/workflow/execresult/NodeContainerExecutionResult.java
index 4b66ead8ba..42c7cb6598 100644
--- a/org.knime.core/src/eclipse/org/knime/core/node/workflow/execresult/NodeContainerExecutionResult.java
+++ b/org.knime.core/src/eclipse/org/knime/core/node/workflow/execresult/NodeContainerExecutionResult.java
@@ -86,6 +86,7 @@ protected NodeContainerExecutionResult(final NodeContainerExecutionResult toCopy
/** Get a node message that was set during execution.
* @return The node message. */
@JsonProperty("nodeMessage")
+ @Override
public NodeMessage getNodeMessage() {
return m_message;
}
diff --git a/org.knime.core/src/eclipse/org/knime/core/node/workflow/execresult/NodeContainerExecutionStatus.java b/org.knime.core/src/eclipse/org/knime/core/node/workflow/execresult/NodeContainerExecutionStatus.java
index 8773f37af1..ff8f871f31 100644
--- a/org.knime.core/src/eclipse/org/knime/core/node/workflow/execresult/NodeContainerExecutionStatus.java
+++ b/org.knime.core/src/eclipse/org/knime/core/node/workflow/execresult/NodeContainerExecutionStatus.java
@@ -48,6 +48,7 @@
package org.knime.core.node.workflow.execresult;
import org.knime.core.node.workflow.NodeID;
+import org.knime.core.node.workflow.NodeMessage;
import org.knime.core.node.workflow.SingleNodeContainer;
/**
@@ -74,6 +75,12 @@ public interface NodeContainerExecutionStatus {
*/
public boolean isSuccess();
+ /** The node's message, corresponding to the node's execution status.
+ * @return the message, not null.
+ * @since 5.12
+ */
+ NodeMessage getNodeMessage();
+
/** Query the execution status for a child given its
* {@linkplain NodeID#getIndex() node id suffix}. If the child is unknown,
* the implementation should return {@link #FAILURE}.
@@ -85,8 +92,19 @@ public interface NodeContainerExecutionStatus {
/** Convenience shortcut to create failure with no children but custom error message.
* @param message the message
* @return a new failure with a custom message.
- * @since 3.0 */
- static public NodeContainerExecutionStatus newFailure(final String message) {
+ * @since 3.0
+ * @deprecated Use {@link #newFailure(NodeMessage)} instead.
+ */
+ @Deprecated(since = "5.12", forRemoval = true)
+ static NodeContainerExecutionStatus newFailure(final String message) {
+ return newFailure(new NodeMessage(NodeMessage.Type.ERROR, message));
+ }
+
+ /** Convenience shortcut to create failure with no children but custom error message.
+ * @param message the message
+ * @return a new failure with a custom message.
+ * @since 5.12 */
+ static NodeContainerExecutionStatus newFailure(final NodeMessage message) {
return new NodeContainerExecutionStatus() {
/**
@@ -98,6 +116,12 @@ public NodeContainerExecutionStatus getChildStatus(final int idSuffix) {
return this;
}
+
+ @Override
+ public NodeMessage getNodeMessage() {
+ return message;
+ }
+
/** @return false */
@Override
public boolean isSuccess() {
@@ -107,7 +131,7 @@ public boolean isSuccess() {
/** {@inheritDoc} */
@Override
public String toString() {
- return message;
+ return message.getMessage();
}
};
}
@@ -129,6 +153,11 @@ public NodeContainerExecutionStatus getChildStatus(
return SUCCESS;
}
+ @Override
+ public NodeMessage getNodeMessage() {
+ return NodeMessage.NONE;
+ }
+
/** @return true */
@Override
public boolean isSuccess() {