package org.rakam.plugin; import com.google.common.collect.ImmutableList; import io.netty.handler.codec.http.HttpHeaders; import io.netty.handler.codec.http.cookie.Cookie; import org.rakam.collection.Event; import org.rakam.collection.EventList; import org.rakam.collection.FieldDependencyBuilder; import java.net.InetAddress; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.concurrent.CompletableFuture; public interface EventMapper { CompletableFuture<List<Cookie>> COMPLETED_EMPTY_FUTURE = CompletableFuture.completedFuture(null); CompletableFuture<List<Cookie>> mapAsync(Event event, RequestParams requestParams, InetAddress sourceAddress, HttpHeaders responseHeaders); default CompletableFuture<List<Cookie>> mapAsync(EventList events, RequestParams requestParams, InetAddress sourceAddress, HttpHeaders responseHeaders) { List<Cookie> cookies = new ArrayList<>(); CompletableFuture[] futures = null; int futureIndex = 0; for (int i = 0; i < events.events.size(); i++) { Event event = events.events.get(i); CompletableFuture<List<Cookie>> map = mapAsync(event, requestParams, sourceAddress, responseHeaders); if (map == null || map.equals(COMPLETED_EMPTY_FUTURE)) { continue; } CompletableFuture<List<Cookie>> future = map.thenApply(value -> { cookies.addAll(value); return cookies; }); if (futures == null) { futures = new CompletableFuture[events.events.size() - i]; } futures[futureIndex++] = future; } if (futures == null) { return COMPLETED_EMPTY_FUTURE; } else { return CompletableFuture.allOf(futures).thenApply(val -> cookies); } } default void addFieldDependency(FieldDependencyBuilder builder) { } default void init() {} interface RequestParams { RequestParams EMPTY_PARAMS = new RequestParams() { @Override public Collection<Cookie> cookies() { return ImmutableList.of(); } @Override public HttpHeaders headers() { return HttpHeaders.EMPTY_HEADERS; } }; default Collection<Cookie> cookies() { return ImmutableList.of(); } HttpHeaders headers(); } }