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() {