package me.osm.gazetter.join.util;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.atomic.AtomicInteger;
import me.osm.osmdoc.model.Feature;
import me.osm.osmdoc.model.Tag;
import me.osm.osmdoc.model.Tag.Val;
import me.osm.osmdoc.read.tagvalueparsers.TagValueParser;
import me.osm.osmdoc.read.tagvalueparsers.TagsStatisticCollector;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONObject;
public class ExportTagsStatisticCollector implements TagsStatisticCollector {
private static final String PATH_SEPARATOR = "/";
private static final Map<String, AtomicInteger> stat = new HashMap<String, AtomicInteger>();
private static final Object MUTEX = new Object();
@Override
public void success(Object pv, Tag tag, Val val, String rawValue,
TagValueParser parser, List<Feature> poiClassess) {
for(Feature f : poiClassess) {
String key = getKey(f.getName(), tag.getKey().getValue(), getValueString(pv));
increment(key);
}
}
@Override
public void failed(Tag tag, String rawValue, TagValueParser parser,
List<Feature> poiClassess) {
for(Feature f : poiClassess) {
String key = getKey(f.getName(), tag.getKey().getValue(), "_error");
increment(key);
}
}
private void increment(String key) {
if(stat.get(key) == null) {
synchronized (MUTEX) {
if(stat.get(key) == null) {
stat.put(key, new AtomicInteger());
}
}
}
stat.get(key).getAndIncrement();
}
private String getKey(String fname, String key, String valueString) {
StringBuilder sb = new StringBuilder();
sb.append(PATH_SEPARATOR).append(fname).append(PATH_SEPARATOR).append(key);
if(StringUtils.isNotBlank(valueString)) {
sb.append(PATH_SEPARATOR).append(valueString);
}
return sb.toString();
}
private String getValueString(Object pv) {
if(pv instanceof String) {
return (String) pv;
}
else if(pv instanceof Boolean) {
return pv.toString();
}
//wh
else if(pv instanceof JSONObject) {
if(((JSONObject)pv).optBoolean("24_7")) {
return "24_7";
}
return "_total";
}
return "_total";
}
public Collection<JSONObject> asJson() {
Map<String, JSONObject> res = new HashMap<>();
for(Entry<String, AtomicInteger> entry : stat.entrySet()) {
String[] split = StringUtils.split(entry.getKey(), PATH_SEPARATOR);
if(!res.containsKey(split[0])) {
JSONObject obj = new JSONObject();
obj.put("name", split[0]);
obj.put("tags_info", new JSONObject());
res.put(split[0], obj);
}
JSONObject tagInfo = res.get(split[0]).getJSONObject("tags_info").optJSONObject(split[1]);
if(tagInfo == null) {
tagInfo = new JSONObject();
res.get(split[0]).getJSONObject("tags_info").put(split[1], tagInfo);
}
if(split.length > 2) {
tagInfo.put(split[2], entry.getValue().get());
if(!"_error".equals(split[2])) {
tagInfo.put("_total", tagInfo.optInt("_total") + entry.getValue().get());
}
}
}
return res.values();
}
}