package org.robotframework.services.event; import java.util.HashMap; import java.util.Map; import org.eclipse.e4.core.services.events.IEventBroker; import com.google.common.base.Preconditions; public class RedEventBroker { public static interface EventBroadcastingStepOne { EventBroadcastingStepTwo additionallyBinding(String additionalDataKey); <T> void send(String topic, T data); <T> void post(String topic, T data); } public static interface EventBroadcastingStepTwo { <T> EventBroadcastingStepOne to(T additionalData); } private RedEventBroker() { // hiding constructor } public static EventBroadcastingStepOne using(final IEventBroker broker) { return new BuildingSteps(broker); } private static class BuildingSteps implements EventBroadcastingStepOne, EventBroadcastingStepTwo { private final IEventBroker broker; private final Map<String, Object> eventData = new HashMap<>(); private String additionalDataKey; public BuildingSteps(final IEventBroker broker) { Preconditions.checkNotNull(broker); this.broker = broker; } @Override public EventBroadcastingStepTwo additionallyBinding(final String additionalDataKey) { Preconditions.checkNotNull(additionalDataKey); this.additionalDataKey = additionalDataKey; return this; } @Override public <T> EventBroadcastingStepOne to(final T additionalData) { eventData.put(additionalDataKey, additionalData); additionalDataKey = null; return this; } @Override public <T> void send(final String topic, final T data) { if (eventData.isEmpty()) { broker.send(topic, data); } else { eventData.put(IEventBroker.DATA, data); broker.send(topic, eventData); } } @Override public <T> void post(final String topic, final T data) { if (eventData.isEmpty()) { broker.post(topic, data); } else { eventData.put(IEventBroker.DATA, data); broker.post(topic, eventData); } } } }