/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.module.extension.internal.runtime.source; import static reactor.core.publisher.Mono.just; import org.mule.runtime.api.exception.MuleException; import org.mule.runtime.api.message.Message; import org.mule.runtime.core.api.Event; import org.mule.runtime.core.api.processor.Processor; import org.mule.runtime.core.exception.MessagingException; import org.mule.runtime.core.execution.MessageProcessContext; import org.mule.runtime.core.execution.ModuleFlowProcessingPhaseTemplate; import org.mule.runtime.core.execution.ResponseCompletionCallback; import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; import org.reactivestreams.Publisher; final class ModuleFlowProcessingTemplate implements ModuleFlowProcessingPhaseTemplate { private final Message message; private final Processor messageProcessor; private final SourceCompletionHandler completionHandler; private final MessageProcessContext messageProcessorContext; ModuleFlowProcessingTemplate(Message message, Processor messageProcessor, SourceCompletionHandler completionHandler, MessageProcessContext messageProcessContext) { this.message = message; this.messageProcessor = messageProcessor; this.completionHandler = completionHandler; this.messageProcessorContext = messageProcessContext; } @Override public Function<Event, Map<String, Object>> getSuccessfulExecutionResponseParametersFunction() { return event -> completionHandler.createResponseParameters(event); } @Override public Function<Event, Map<String, Object>> getFailedExecutionResponseParametersFunction() { return event -> completionHandler.createFailureResponseParameters(event); } @Override public Message getMessage() { return message; } @Override public Event routeEvent(Event muleEvent) throws MuleException { return messageProcessor.process(muleEvent); } @Override public Publisher<Event> routeEventAsync(Event event) { return just(event).transform(messageProcessor); } @Override public void sendResponseToClient(Event event, Map<String, Object> parameters, Function<Event, Map<String, Object>> errorResponseParametersFunction, ResponseCompletionCallback responseCompletionCallback) { Consumer<MessagingException> errorResponseCallback = (messagingException) -> completionHandler .onFailure(messagingException, errorResponseParametersFunction.apply(messagingException.getEvent())); ExtensionSourceExceptionCallback exceptionCallback = new ExtensionSourceExceptionCallback(responseCompletionCallback, event, errorResponseCallback, messageProcessorContext); runAndNotify(() -> completionHandler.onCompletion(event, parameters, exceptionCallback), event, responseCompletionCallback); } @Override public void sendFailureResponseToClient(MessagingException messagingException, Map<String, Object> parameters, ResponseCompletionCallback responseCompletionCallback) { runAndNotify(() -> completionHandler.onFailure(messagingException, parameters), messagingException.getEvent(), responseCompletionCallback); } private void runAndNotify(Runnable runnable, Event event, ResponseCompletionCallback responseCompletionCallback) { try { runnable.run(); responseCompletionCallback.responseSentSuccessfully(); } catch (Exception e) { responseCompletionCallback.responseSentWithFailure(new MessagingException(event, e), event); } } }