package io.cattle.platform.eventing.impl; import io.cattle.platform.async.retry.Retry; import io.cattle.platform.eventing.EventListener; import io.cattle.platform.eventing.EventProgress; import io.cattle.platform.eventing.PoolSpecificListener; import io.cattle.platform.eventing.exception.EventExecutionException; import io.cattle.platform.eventing.model.Event; import io.cattle.platform.eventing.model.EventVO; import com.google.common.util.concurrent.SettableFuture; public class FutureEventListener implements EventListener, PoolSpecificListener { AbstractEventService eventService; String replyTo; SettableFuture<Event> future; EventProgress progress; Event event; boolean failed; Retry retry; public FutureEventListener(AbstractEventService eventService, String replyTo) { super(); this.replyTo = replyTo; this.eventService = eventService; } @Override public synchronized void onEvent(Event reply) { if (future != null && event != null) { String[] previous = reply.getPreviousIds(); if (previous != null && previous.length > 0 && previous[0].equals(event.getId())) { EventVO<Object> replyWithName = new EventVO<Object>(reply); replyWithName.setName(appendReply(event.getName())); String transitioning = replyWithName.getTransitioning(); if (transitioning == null || Event.TRANSITIONING_NO.equals(transitioning)) { future.set(replyWithName); } else if (Event.TRANSITIONING_ERROR.equals(transitioning)) { future.setException(EventExecutionException.fromEvent(replyWithName)); } else if (progress != null) { if (retry != null) { retry.setKeepalive(true); } progress.progress(replyWithName); } } } } protected String appendReply(String name) { int i = name.indexOf(";"); if (i == -1) { return name + Event.REPLY_SUFFIX; } else { return name.substring(0, i) + Event.REPLY_SUFFIX + name.substring(i); } } public synchronized void reset() { future = null; event = null; progress = null; retry = null; } public SettableFuture<Event> getFuture() { return future; } public void setFuture(SettableFuture<Event> future) { this.future = future; } public boolean isFailed() { return failed; } public void setFailed(boolean failed) { this.failed = failed; } public Event getEvent() { return event; } public void setEvent(Event event) { this.event = event; } public String getReplyTo() { return replyTo; } @Override public String getPoolKey() { return "reply"; } public EventProgress getProgress() { return progress; } public void setProgress(EventProgress progress) { this.progress = progress; } public Retry getRetry() { return retry; } public void setRetry(Retry retry) { this.retry = retry; } }