Abort an Experience Manager Action
Introduction
Goal
Abort a Experience manager action using a channel event listener.
Summary
Channel event listeners that use the HST internal event bus mechanism can abort Experience manager actions by setting an exception on the event object. This can be useful in case some requirement is not met or the post-processing fails. Two different exceptions - RuntimeException and ClientException - can be used, each with a different effect:
- A RuntimeException's message will be logged in the server log and the Experience manager UI will render a generic, localized message informing the user that the action failed.
- A ClientException has the option to add a custom message to be rendered in the Experience manager UI.
This page explains how to achieve the intended behavior using each exception type.
Abort with a Generic Error Message Using a RuntimeException
The most straightforward way to abort a Experience manager action in an event listener is by setting a RuntimException on the event object as in the following example:
@Subscribe public void onEvent(ChannelEvent event) { if (event.getException() != null) { return; } event.setException(new RuntimeException("This will abort the action")); }
This will render a generic error message in the Experience manager UI, informing the user that the action failed. For example, Failed to publish changes.
It will also cause a message to be logged similar to the the one below, followed by a stacktrace of the exception.
08.04.2019 11:09:26 WARN http-nio-8080-exec-3 [AbstractConfigResource.logAndReturnServerError:184] java.lang.RuntimeException: This will abort the action
Abort and Provide a Custom Feedback Message Using a ClientException
A more user-friendly way to abort a Experience manager action is by providing a custom feedback message using a ClientException as in the following example:
@Subscribe public void onEvent(ChannelEvent event) { if (event.getException() != null) { return; } final Map<String, String> parameterMap = new HashMap<>(); parameterMap.put("userMessage", "Channel {{channel}} can't be published after 9 PM"); parameterMap.put("channel", event.getEditingPreviewSite().getName()); final String techDetails = "add technical details here"; event.setException(new ClientException(techDetails, ClientError.UNKNOWN, parameterMap)); }
This will render the userMessage in the Experience manager UI.