package com.aol.micro.server.events;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import com.aol.micro.server.rest.jackson.JacksonUtil;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import cyclops.collections.MapX;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Builder;
public class RequestTypes<T> {
@Getter
private final Map<String, RequestsBeingExecuted> map = new ConcurrentHashMap<>();;
private final EventBus bus;
public RequestTypes(EventBus bus, boolean queryCapture) {
this.bus = bus;
if (queryCapture)
bus.register(this);
}
@Override
public String toString() {
Map result = toMap();
return JacksonUtil.serializeToJson(result);
}
public Map toMap() {
return MapX.fromMap(map)
.bimap(k -> k, v -> v.toMap());
}
@Subscribe
public void finished(RemoveQuery<T> data) {
String key = data.getData().type;
map.computeIfAbsent(key, k -> new RequestsBeingExecuted<T>(
bus, k)).events.finished(buildId(data.getData()));
}
@Subscribe
public void processing(AddQuery<T> data) {
String id = buildId(data.getData());
String key = data.getData().type;
map.computeIfAbsent(key, k -> new RequestsBeingExecuted<T>(
bus, k)).events.active(id, data.getData());
}
private String buildId(RequestData data) {
String id = "" + data.correlationId;
return id;
}
public static class AddQuery<T> extends AddEvent<RequestData<T>> {
public AddQuery(RequestData<T> data) {
super(
data);
}
}
public static class RemoveQuery<T> extends RemoveEvent<RequestData<T>> {
public RemoveQuery(RequestData data) {
super(
data);
}
}
@AllArgsConstructor
@Builder
@XmlAccessorType(XmlAccessType.FIELD)
@Getter
public static class RequestData<T> extends BaseEventInfo {
private final long correlationId;
private final T query;
private final String type;
private final Object additionalData;
}
}