package com.qiniu.android.common;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* Created by jemy on 17/04/2017.
*/
public class ZoneInfo {
private static int DOMAIN_FROZEN_SECONDS = 10 * 60;
private final int ttl;
//upHost
public final List<String> upDomainsList;
//upHost -> frozenTillTimestamp
public final Map<String, Long> upDomainsMap;
public ZoneInfo(int ttl, List<String> upDomainsList, Map<String, Long> upDomainsMap) {
this.ttl = ttl;
this.upDomainsList = upDomainsList;
this.upDomainsMap = upDomainsMap;
}
public static ZoneInfo buildFromJson(JSONObject obj) throws JSONException {
int ttl = obj.getInt("ttl");
List<String> domainsList = new ArrayList<>();
ConcurrentHashMap<String, Long> domainsMap = new ConcurrentHashMap<>();
JSONObject upObj = obj.getJSONObject("up");
String[] upDomainTags = new String[]{"acc", "src", "old_acc", "old_src"};
for (String tag : upDomainTags) {
JSONObject tagRootObj = upObj.getJSONObject(tag);
JSONArray tagMainObj = tagRootObj.getJSONArray("main");
for (int i = 0; i < tagMainObj.length(); i++) {
String upDomain = tagMainObj.getString(i);
domainsList.add(upDomain);
domainsMap.put(upDomain, 0L);
}
try {
JSONArray tagBackupObj = tagRootObj.getJSONArray("backup");
if (tagBackupObj != null) {
//this backup tag is optional
for (int i = 0; i < tagBackupObj.length(); i++) {
String upHost = tagBackupObj.getString(i);
domainsList.add(upHost);
domainsMap.put(upHost, 0L);
}
}
} catch (JSONException ex) {
//some zone has not backup domain, just ignore here
}
}
return new ZoneInfo(ttl, domainsList, domainsMap);
}
public void frozenDomain(String domain) {
//frozen for 10 minutes
upDomainsMap.put(domain, System.currentTimeMillis() / 1000 + DOMAIN_FROZEN_SECONDS);
}
@Override
public String toString() {
Map<String, Object> m = new HashMap<String, Object>();
m.put("ttl", this.ttl);
m.put("upDomainList", this.upDomainsList);
m.put("upDomainMap", this.upDomainsMap);
return new JSONObject(m).toString();
}
}