/* * 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.core.routing; import static java.util.Optional.of; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import org.mule.runtime.api.exception.MuleException; import org.mule.runtime.api.message.Message; import org.mule.runtime.core.DefaultEventContext; import org.mule.runtime.core.api.Event; import org.mule.runtime.core.api.EventContext; import org.mule.runtime.core.api.MuleContext; import org.mule.runtime.core.api.MuleSession; import org.mule.runtime.core.api.construct.Flow; import org.mule.runtime.api.store.ObjectStoreException; import org.mule.runtime.core.routing.correlation.EventCorrelatorCallback; import org.mule.runtime.core.session.DefaultMuleSession; import org.mule.tck.junit4.AbstractMuleContextTestCase; import org.mule.tck.testmodels.fruit.Apple; import java.util.Iterator; import org.junit.Test; public class AggregatorTestCase extends AbstractMuleContextTestCase { public AggregatorTestCase() { setStartContext(true); } @Test public void testMessageAggregator() throws Exception { Flow flow = getTestFlowWithComponent("test", Apple.class); MuleSession session = new DefaultMuleSession(); TestEventAggregator router = new TestEventAggregator(3); router.setMuleContext(muleContext); router.setFlowConstruct(flow); router.initialise(); EventContext context = DefaultEventContext.create(flow, TEST_CONNECTOR_LOCATION, "foo"); Message message1 = Message.of("test event A"); Message message2 = Message.of("test event B"); Message message3 = Message.of("test event C"); Event event1 = Event.builder(context).message(message1).flow(flow).session(session).build(); Event event2 = Event.builder(context).message(message2).flow(flow).session(session).build(); Event event3 = Event.builder(context).message(message3).flow(flow).session(session).build(); assertNull(router.process(event1)); assertNull(router.process(event2)); Event result = router.process(event3); assertNotNull(result); assertTrue(result.getMessageAsString(muleContext).contains("test event A")); assertTrue(result.getMessageAsString(muleContext).contains("test event B")); assertTrue(result.getMessageAsString(muleContext).contains("test event C")); assertTrue(result.getMessageAsString(muleContext).matches("test event [A,B,C] test event [A,B,C] test event [A,B,C] ")); } public static class TestEventAggregator extends AbstractAggregator { protected final int eventThreshold; protected int eventCount = 0; public TestEventAggregator(int eventThreshold) { this.eventThreshold = eventThreshold; } @Override protected EventCorrelatorCallback getCorrelatorCallback(final MuleContext muleContext) { return new EventCorrelatorCallback() { @Override public boolean shouldAggregateEvents(EventGroup events) { eventCount++; if (eventCount == eventThreshold) { eventCount = 0; return true; } return false; } @Override public EventGroup createEventGroup(Event event, Object groupId) { return new EventGroup(groupId, muleContext, of(eventThreshold), storePrefix); } @Override public Event aggregateEvents(EventGroup events) throws AggregationException { if (events.size() != eventThreshold) { throw new IllegalStateException("eventThreshold not yet reached?"); } StringBuilder newPayload = new StringBuilder(80); try { for (Iterator iterator = events.iterator(false); iterator.hasNext();) { Event event = (Event) iterator.next(); try { newPayload.append(event.getMessageAsString(muleContext)).append(" "); } catch (MuleException e) { throw new AggregationException(events, next, e); } } } catch (ObjectStoreException e) { throw new AggregationException(events, next, e); } return Event.builder(events.getMessageCollectionEvent()).message(Message.of(newPayload.toString())).build(); } }; } } }