package io.cattle.platform.agent.impl; import io.cattle.platform.eventing.EventCallOptions; import io.cattle.platform.eventing.EventProgress; import io.cattle.platform.eventing.EventService; import io.cattle.platform.eventing.RetryCallback; import io.cattle.platform.eventing.model.Event; import io.cattle.platform.eventing.model.EventVO; import com.google.common.base.Function; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; public class EventCallProgressHelper { public static <T extends Event> ListenableFuture<T> call(final EventService eventService, final Event request, final Class<? extends T> reply, EventCallOptions options, final EventResponseMarshaller converter) { final EventProgress progress = options.getProgress(); if (progress != null) { EventProgress newProgress = new EventProgress() { @Override public void progress(Event progressEvent) { T result = converter.convert(progressEvent, reply); if (result instanceof Event) { progress.progress(result); } } }; options.setProgress(newProgress); } final RetryCallback retryCallback = options.getRetryCallback(); if (retryCallback != null) { RetryCallback newCallback = new RetryCallback() { @Override public Event beforeRetry(Event event) { Object data = event.getData(); if (data instanceof Event) { data = retryCallback.beforeRetry((Event) data); EventVO<Object> newEvent = new EventVO<Object>(event); newEvent.setData(data); event = newEvent; } return event; } }; options.setRetryCallback(newCallback); } ListenableFuture<Event> future = eventService.call(request, options); return Futures.transform(future, new Function<Event, T>() { @Override public T apply(Event input) { return converter.convert(input, reply); } }); } }