use of org.mule.runtime.core.privileged.event.BaseEventContext in project mule by mulesoft.
the class IdempotentMessageValidatorTestCase method testIdCheckWithHash.
@Test
public void testIdCheckWithHash() throws Exception {
String dwHashExpression = "%dw 2.0\n" + "output text/plain\n" + "import dw::Crypto\n" + "---\n" + "Crypto::hashWith(payload,'SHA-256')";
String payload = "payload to be hashed";
final BaseEventContext context = mock(BaseEventContext.class);
when(context.getCorrelationId()).thenReturn("1");
Message message = of(payload);
CoreEvent event = CoreEvent.builder(context).message(message).build();
// Set DW expression to hash value
idempotent.setIdExpression(dwHashExpression);
// Evaluate DW expression outside MessageValidator
ExpressionLanguageAdaptor expressionLanguageAdaptor = new DataWeaveExpressionLanguageAdaptor(muleContext, mock(Registry.class), new WeaveDefaultExpressionLanguageFactoryService());
TypedValue hashedValue = expressionLanguageAdaptor.evaluate(dwHashExpression, event, NULL_BINDING_CONTEXT);
// This one will process the event on the target endpoint
CoreEvent processedEvent = idempotent.process(event);
assertNotNull(processedEvent);
assertEquals(idempotent.getObjectStore().retrieve(IOUtils.toString((ByteArrayBasedCursorStreamProvider) hashedValue.getValue())), "1");
// This will not process, because the message is a duplicate
message = of(payload);
event = CoreEvent.builder(context).message(message).build();
expected.expect(ValidationException.class);
processedEvent = idempotent.process(event);
}
use of org.mule.runtime.core.privileged.event.BaseEventContext in project mule by mulesoft.
the class IdempotentMessageValidatorTestCase method idempotentReceiver.
@Test
public void idempotentReceiver() throws Exception {
final BaseEventContext contextA = mock(BaseEventContext.class);
when(contextA.getCorrelationId()).thenReturn("1");
Message okMessage = InternalMessage.builder().value("OK").build();
CoreEvent event = CoreEvent.builder(contextA).message(okMessage).build();
// This one will process the event on the target endpoint
CoreEvent processedEvent = idempotent.process(event);
assertThat(processedEvent, sameInstance(event));
final BaseEventContext contextB = mock(BaseEventContext.class);
when(contextB.getCorrelationId()).thenReturn("1");
// This will not process, because the ID is a duplicate
event = CoreEvent.builder(contextB).message(okMessage).build();
expected.expect(ValidationException.class);
processedEvent = idempotent.process(event);
}
use of org.mule.runtime.core.privileged.event.BaseEventContext in project mule by mulesoft.
the class IdempotentMessageValidatorTestCase method testIdCheckWithMEL.
@Test
public void testIdCheckWithMEL() throws Exception {
String melExpression = "#[payload]";
final BaseEventContext context = mock(BaseEventContext.class);
when(context.getCorrelationId()).thenReturn("1");
Message okMessage = of("OK");
CoreEvent event = CoreEvent.builder(context).message(okMessage).build();
// Set MEL expression to hash value
idempotent.setIdExpression(melExpression);
// This one will process the event on the target endpoint
CoreEvent processedEvent = idempotent.process(event);
assertNotNull(processedEvent);
assertEquals(idempotent.getObjectStore().retrieve("OK"), "1");
// This will not process, because the message is a duplicate
okMessage = of("OK");
event = CoreEvent.builder(context).message(okMessage).build();
expected.expect(ValidationException.class);
processedEvent = idempotent.process(event);
}
use of org.mule.runtime.core.privileged.event.BaseEventContext in project mule by mulesoft.
the class IdempotentMessageValidatorTestCase method differentIdsShouldBeStored.
@Test
public void differentIdsShouldBeStored() throws Exception {
String dwHashExpression = "%dw 2.0\n" + "output text/plain\n" + "import dw::Crypto\n" + "---\n" + "Crypto::SHA1(payload)";
String payload = "payload to be hashed";
String otherPayload = "this is another payload to be hashed";
final BaseEventContext context = mock(BaseEventContext.class);
when(context.getCorrelationId()).thenReturn("1");
Message message = of(payload);
CoreEvent event = CoreEvent.builder(context).message(message).build();
// Set DW expression to hash value
idempotent.setIdExpression(dwHashExpression);
// Evaluate DW expression outside MessageValidator
ExpressionLanguageAdaptor expressionLanguageAdaptor = new DataWeaveExpressionLanguageAdaptor(muleContext, mock(Registry.class), new WeaveDefaultExpressionLanguageFactoryService());
TypedValue hashedValue = expressionLanguageAdaptor.evaluate(dwHashExpression, event, NULL_BINDING_CONTEXT);
// This one will process the event on the target endpoint
CoreEvent processedEvent = idempotent.process(event);
assertNotNull(processedEvent);
assertEquals(idempotent.getObjectStore().retrieve(IOUtils.toString((ByteArrayBasedCursorStreamProvider) hashedValue.getValue())), "1");
// This will process, because the message is a new one
Message otherMessage = of(otherPayload);
event = CoreEvent.builder(context).message(otherMessage).build();
processedEvent = idempotent.process(event);
assertNotNull(processedEvent);
}
use of org.mule.runtime.core.privileged.event.BaseEventContext in project mule by mulesoft.
the class PolicyNextActionMessageProcessor method apply.
@Override
public Publisher<CoreEvent> apply(Publisher<CoreEvent> publisher) {
return from(publisher).doOnNext(coreEvent -> logExecuteNextEvent("Before execute-next", coreEvent.getContext(), coreEvent.getMessage(), this.muleContext.getConfiguration().getId())).flatMap(event -> {
Processor nextOperation = policyStateHandler.retrieveNextOperation(event.getContext().getCorrelationId());
if (nextOperation == null) {
return error(new MuleRuntimeException(createStaticMessage("There's no next operation configured for event context id " + event.getContext().getCorrelationId())));
}
popBeforeNextFlowFlowStackElement().accept(event);
notificationHelper.notification(BEFORE_NEXT).accept(event);
return from(processWithChildContext(event, nextOperation, ofNullable(getLocation()))).doOnSuccessOrError(notificationHelper.successOrErrorNotification(AFTER_NEXT).andThen((ev, t) -> pushAfterNextFlowStackElement().accept(event))).onErrorResume(MessagingException.class, t -> {
PolicyStateId policyStateId = new PolicyStateId(event.getContext().getCorrelationId(), muleContext.getConfiguration().getId());
policyStateHandler.getLatestState(policyStateId).ifPresent(latestStateEvent -> t.setProcessedEvent(policyEventConverter.createEvent((PrivilegedEvent) t.getEvent(), (PrivilegedEvent) latestStateEvent)));
// Given we've used child context to ensure AFTER_NEXT notifications are fired at exactly the right time we need
// to propagate the error to parent context manually.
((BaseEventContext) event.getContext()).error(resolveMessagingException(t.getFailingComponent(), muleContext).apply(t));
return empty();
}).doOnNext(coreEvent -> logExecuteNextEvent("After execute-next", coreEvent.getContext(), coreEvent.getMessage(), this.muleContext.getConfiguration().getId()));
});
}
Aggregations