@Override public CoreEvent process(CoreEvent event) throws MuleException { try { Message msg; Error error = null; String payload = ((InternalEvent) event).getMessageAsString(muleContext); if (payload.indexOf(rejectIfMatches) >= 0) { throw new DefaultMuleException("Saw " + rejectIfMatches); } else if (payload.toLowerCase().indexOf(rejectIfMatches) >= 0) { Exception exception = new Exception(); error = createErrorMock(exception); msg = InternalMessage.builder().nullValue().exceptionPayload(new DefaultExceptionPayload(exception)).build(); } else { msg = of("No " + rejectIfMatches); } CoreEvent muleEvent = eventBuilder(muleContext).message(msg).error(error).build(); return muleEvent; } catch (Exception e) { throw new DefaultMuleException(e); } } }
@Override protected void doSetUp() throws Exception { super.doSetUp(); sensingMessageProcessor = getSensingNullMessageProcessor(); List<Processor> processors = new ArrayList<>(); processors.add(new StringAppendTransformer("a")); processors.add(new StringAppendTransformer("b")); processors.add(new StringAppendTransformer("c")); processors.add(event -> CoreEvent.builder(event).addVariable("thread", currentThread()).build()); processors.add(sensingMessageProcessor); flow = (DefaultFlow) Flow.builder(FLOW_NAME, muleContext) .source(directInboundMessageSource) .processors(processors) .build(); stoppedFlow = (DefaultFlow) Flow.builder(FLOW_NAME, muleContext) .source(directInboundMessageSource) .processors(processors) .initialState(INITIAL_STATE_STOPPED) .build(); }
@Test public void securityContextSerialization() throws Exception { Transformer transformer = createSerializableToByteArrayTransformer(); transformer.setMuleContext(muleContext); CoreEvent event = CoreEvent.builder(testEvent()).securityContext(createTestAuthentication()).build(); Serializable serialized = (Serializable) createSerializableToByteArrayTransformer().transform(event); assertNotNull(serialized); ByteArrayToObject trans = new ByteArrayToObject(); trans.setMuleContext(muleContext); CoreEvent deserialized = (CoreEvent) trans.transform(serialized); assertThat(deserialized.getSecurityContext().getAuthentication().getPrincipal(), is(event.getSecurityContext().getAuthentication().getPrincipal())); assertThat(deserialized.getSecurityContext().getAuthentication().getProperties().get("key1"), is(event.getSecurityContext().getAuthentication().getProperties().get("key1"))); assertThat(deserialized.getSecurityContext().getAuthentication().getCredentials(), is(event.getSecurityContext().getAuthentication().getCredentials())); }
builder.addVariable(counterVariableName, correlationSequence); builder.groupCorrelation(Optional .of(count != null ? GroupCorrelation.of(correlationSequence, count) : GroupCorrelation.of(correlationSequence))); initEventBuilder(messageSequence.next(), originalEvent, builder, resolvePropagatedFlowVars(lastResult)); CoreEvent resultEvent = processToApplyWithChildContext(builder.build(), applyNext()); if (resultEvent != null) { resultEvents.add(builder(originalEvent.getContext(), resultEvent).build()); lastResult = resultEvent;
System.arraycopy(data, pos, buffer, 0, buffer.length); pos += len; final CoreEvent childEvent = CoreEvent.builder(event).message(Message.builder(message).value(buffer).build()) .groupCorrelation(Optional.of(of(count, parts))).build();
/** * If the {@code value} is a {@link Message}, then a new one is created merging the contents of the returned value with the ones * of the input message. The merging criteria is as follows: * <li> * <ul> * The {@code value}'s payload and DataType is set on the output message * </ul> * <ul> * If the {@code value} has a not {@code null} output for {@link Message#getAttributes()}, then that value is set on the * outbound message. Otherwise, whatever value the input message had is maintained * </ul> * </li> * <p> * If the {@code value} is of any other type, then it's set as the payload of the outgoing message {@inheritDoc} */ @Override public CoreEvent asReturnValue(Object value, ExecutionContextAdapter operationContext) { return value instanceof EventedResult ? ((EventedResult) value).getEvent() : CoreEvent.builder(operationContext.getEvent()) .securityContext(operationContext.getSecurityContext()) .message(toMessage(value, operationContext)).build(); } }
@Override public final CompletableFuture<Event> execute(Event event) { CoreEvent internalEvent; BaseEventContext child = createChildEventContext(event.getContext()); if (event instanceof CoreEvent) { internalEvent = builder(child, (CoreEvent) event).build(); } else { internalEvent = CoreEvent.builder(createEventContext(null)) .message(event.getMessage()) .error(event.getError().orElse(null)) .variables(event.getVariables()) .build(); } return from(MessageProcessors.process(internalEvent, getExecutableFunction())) .onErrorMap(throwable -> { MessagingException messagingException = (MessagingException) throwable; CoreEvent messagingExceptionEvent = messagingException.getEvent(); return new ComponentExecutionException(messagingExceptionEvent.getError().get().getCause(), messagingExceptionEvent); }) .map(r -> builder(event.getContext(), r).build()) .cast(Event.class) .toFuture(); }
@Override public CoreEvent process(CoreEvent event) throws MuleException { try { Message msg; Error error = null; String payload = ((InternalEvent) event).getMessageAsString(muleContext); if (payload.indexOf(rejectIfMatches) >= 0) { throw new DefaultMuleException("Saw " + rejectIfMatches); } else if (payload.toLowerCase().indexOf(rejectIfMatches) >= 0) { Exception exception = new Exception(); error = createErrorMock(exception); msg = InternalMessage.builder().nullValue().exceptionPayload(new DefaultExceptionPayload(exception)).build(); } else { msg = of("No " + rejectIfMatches); } CoreEvent muleEvent = eventBuilder(muleContext).message(msg).error(error).build(); return muleEvent; } catch (Exception e) { throw new DefaultMuleException(e); } } }
/** * Unlike other {@link MessageProcessorChain MessageProcessorChains}, modules could contain error mappings that need to be * considered when resolving exceptions. */ private MessagingException handleSubChainException(MessagingException messagingException, CoreEvent originalRequest) { final CoreEvent.Builder builder = CoreEvent.builder(originalRequest).error(messagingException.getEvent().getError().get()); List<ErrorMapping> errorMappings = getErrorMappings(this); if (!errorMappings.isEmpty()) { Error error = messagingException.getEvent().getError().get(); ErrorType errorType = error.getErrorType(); ErrorType resolvedType = errorMappings.stream() .filter(m -> m.match(errorType)) .findFirst() .map(ErrorMapping::getTarget) .orElse(errorType); if (!resolvedType.equals(errorType)) { builder.error(ErrorBuilder.builder(error).errorType(resolvedType).build()); } } messagingException.setProcessedEvent(builder.build()); return messagingException; }
/** * Create new {@link CoreEvent} with {@link org.mule.runtime.api.message.Error} instance set. * * @param currentEvent event when error occured. * @param obj message processor/source. * @param me messaging exception. * @param locator the mule context. * @return new {@link CoreEvent} with relevant {@link org.mule.runtime.api.message.Error} set. */ public static CoreEvent createErrorEvent(CoreEvent currentEvent, Component obj, MessagingException me, ErrorTypeLocator locator) { Throwable cause = me.getCause() != null ? me.getCause() : me; List<ErrorMapping> errorMappings = getErrorMappings(obj); if (!errorMappings.isEmpty() || isMessagingExceptionCause(me, cause)) { Error newError = getErrorFromFailingProcessor(currentEvent, obj, cause, locator); CoreEvent newEvent = CoreEvent.builder(me.getEvent()).error(newError).build(); me.setProcessedEvent(newEvent); return newEvent; } else { return currentEvent; } }
private Mono<Void> sendErrorResponse(MessagingException messagingException, Function<CoreEvent, Map<String, Object>> errorParameters, final PhaseContext ctx, FlowConstruct flowConstruct) { CoreEvent event = messagingException.getEvent(); if (messagingException.inErrorHandler()) { return error(new SourceErrorException(event, sourceErrorResponseGenerateErrorType, messagingException.getCause(), messagingException)); } else { try { return from(ctx.template .sendFailureResponseToClient(messagingException, errorParameters.apply(event))) .onErrorMap(e -> new SourceErrorException(builder(messagingException.getEvent()) .error(builder(e).errorType(sourceErrorResponseSendErrorType).build()).build(), sourceErrorResponseSendErrorType, e)); } catch (Exception e) { return error(new SourceErrorException(event, sourceErrorResponseGenerateErrorType, e, messagingException)); } } }
@Test public void securityContextSerialization() throws Exception { Transformer transformer = createSerializableToByteArrayTransformer(); transformer.setMuleContext(muleContext); CoreEvent event = CoreEvent.builder(testEvent()).securityContext(createTestAuthentication()).build(); Serializable serialized = (Serializable) createSerializableToByteArrayTransformer().transform(event); assertNotNull(serialized); ByteArrayToObject trans = new ByteArrayToObject(); trans.setMuleContext(muleContext); CoreEvent deserialized = (CoreEvent) trans.transform(serialized); assertThat(deserialized.getSecurityContext().getAuthentication().getPrincipal(), is(event.getSecurityContext().getAuthentication().getPrincipal())); assertThat(deserialized.getSecurityContext().getAuthentication().getProperties().get("key1"), is(event.getSecurityContext().getAuthentication().getProperties().get("key1"))); assertThat(deserialized.getSecurityContext().getAuthentication().getCredentials(), is(event.getSecurityContext().getAuthentication().getCredentials())); }
@Override public final CompletableFuture<ExecutionResult> execute(InputEvent inputEvent) { CompletableFuture completableFuture = new CompletableFuture(); CoreEvent.Builder builder = CoreEvent.builder(createEventContext(of(completableFuture))); CoreEvent event = builder.message(inputEvent.getMessage()) .error(inputEvent.getError().orElse(null)) .variables(inputEvent.getVariables()) .build(); return from(MessageProcessors.process(event, getExecutableFunction())) .onErrorMap(throwable -> { MessagingException messagingException = (MessagingException) throwable; CoreEvent messagingExceptionEvent = messagingException.getEvent(); return new ComponentExecutionException(messagingExceptionEvent.getError().get().getCause(), messagingExceptionEvent); }) .<ExecutionResult>map(result -> new ExecutionResultImplementation(result, completableFuture)) .toFuture(); }
@Test public void testResponseEventsCleanedUp() throws Exception { RelaxedAsyncReplyMP mp = new RelaxedAsyncReplyMP(muleContext); try { CoreEvent event = eventBuilder(muleContext).message(of("message1")).groupCorrelation(Optional.of(GroupCorrelation.of(0, 3))).build(); SensingNullMessageProcessor listener = getSensingNullMessageProcessor(); mp.setListener(listener); mp.setReplySource(listener.getMessageSource()); mp.process(event); Map<String, PrivilegedEvent> responseEvents = mp.getResponseEvents(); assertThat(responseEvents.entrySet(), empty()); } finally { mp.stop(); } }
public MessagingException toMessagingException(Collection<ExceptionContextProvider> exceptionContextProviders, MessageSource messageSource) { MessagingException messagingException = new MessagingException(CoreEvent.builder(getEvent()) .error(ErrorBuilder.builder(getCause()) .errorType(getErrorType()) .build()) .build(), getCause()); EnrichedNotificationInfo notificationInfo = createInfo(messagingException.getEvent(), messagingException, null); exceptionContextProviders.forEach(cp -> { cp.getContextInfo(notificationInfo, messageSource).forEach((k, v) -> messagingException.getInfo().putIfAbsent(k, v)); }); return messagingException; }
private Function<RoutingPair, RoutingPair> addSequence(AtomicInteger count) { return pair -> of(builder(pair.getEvent()).groupCorrelation(Optional.of(GroupCorrelation.of(count.getAndIncrement()))) .build(), pair.getRoute()); }