package com.navercorp.pinpoint.web.calltree.span;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.navercorp.pinpoint.common.server.bo.SpanEventBo;
public class SpanAsyncEventMap {
final Map<Integer, Map<Short, List<SpanEventBo>>> map = new HashMap<>();
public boolean add(final SpanEventBo spanEvent) {
if (!spanEvent.isAsync()) {
return false;
}
final int id = spanEvent.getAsyncId();
Map<Short, List<SpanEventBo>> subMap = map.get(id);
if (subMap == null) {
subMap = new HashMap<>();
map.put(id, subMap);
}
final short sequence = spanEvent.getAsyncSequence();
List<SpanEventBo> list = subMap.get(sequence);
if (list == null) {
list = new ArrayList<>();
list.add(spanEvent);
subMap.put(sequence, list);
} else {
list.add(spanEvent);
}
return true;
}
public void sort() {
for (Map<Short, List<SpanEventBo>> subMap : map.values()) {
for (List<SpanEventBo> list : subMap.values()) {
Collections.sort(list, new Comparator<SpanEventBo>() {
public int compare(SpanEventBo source, SpanEventBo target) {
return source.getSequence() - target.getSequence();
}
});
}
}
}
public Collection<List<SpanEventBo>> get(final int asyncId) {
final Map<Short, List<SpanEventBo>> subMap = map.get(asyncId);
if (subMap != null) {
return subMap.values();
}
return Collections.emptyList();
}
}