package com.erdaoya.springcloud.comx.utils.config;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.HashMap;
import java.util.Set;
/**
* Created by xue on 12/6/16.
* 需要分辨 dataObject or dataArray
*
*/
public class Config {
protected JSONObject dataObject;
//protected JSONArray dataArray;
protected HashMap<String, Config> subs = new HashMap<>();
public Config(JSONObject dataObject) {this.dataObject = dataObject;}
//public Config(JSONArray dataArray) {this.dataArray = dataArray;}
/**
* TODO str & rstr 修正逻辑
* @param key key
* @param defaultValue 默认值
* @return String
*/
public String str(String key, String defaultValue){
try {
return rstr(key);
}catch (ConfigException ex) {
return defaultValue;
}
}
public String rstr(String key) throws ConfigException{
if (!dataObject.containsKey(key)) throw new ConfigException("Config get rstr failed. key:"+ key + " config.dataObject:"+ dataObject);
Object value = dataObject.get(key);
if (value instanceof Boolean) return value.toString();
if (value instanceof Integer) return value.toString();
if (value instanceof String) return value.toString();
throw new ConfigException("Config get String type error. key:" + key + " config.dataObject:" + dataObject);
}
public boolean bool(String key, boolean defaultValue) {
try {
return rbool(key);
} catch (ConfigException ex){
return defaultValue;
}
}
public boolean rbool(String key) throws ConfigException{
if (!dataObject.containsKey(key)) throw new ConfigException("Config get Boolean type error. key:" + key + " config.dataObject:" + dataObject);
Object value = dataObject.get(key);
if (value instanceof Boolean) return (Boolean)value;
if (value instanceof Integer) return !(value.equals(0));
if (value instanceof String) return !(value.equals("false"));
throw new ConfigException("Config get Boolean type error. key:" + key + " config.dataObject:" + dataObject);
}
public Integer intvalue(String key, Integer defaultValue){
try {
return rintvalue(key);
} catch (ConfigException ex){
return defaultValue;
}
}
public Integer rintvalue(String key) throws ConfigException{
if (!dataObject.containsKey(key)) throw new ConfigException("Config get Integer type error. key:" + key + "config.dataObject:" + dataObject);
Object value = dataObject.get(key);
if (value instanceof Boolean) return ((Boolean)value)?1:0;
if (value instanceof Integer) return (Integer)value;
if (value instanceof String) {
try {
return Integer.parseInt((String) value);
} catch (NumberFormatException ex) {
throw new ConfigException("Config get Integer type error(converting string to integer). key:" + key + " config.dataObject:" + dataObject);
}
}
throw new ConfigException("Config get Integer type error. key:" + key + " config.dataObject:" + dataObject);
}
public Set<String> keys() {
return dataObject.keySet();
}
public Config rsub(String key) throws ConfigException{
if (!subs.containsKey(key)) subs.put(key, this.genSub(key, true));
return subs.get(key);
}
public Config sub(String key) throws ConfigException{
if (!subs.containsKey(key)) subs.put(key, this.genSub(key, false));
return subs.get(key);
}
public Config genSub(String key, boolean restrict) throws ConfigException{
if (!(dataObject.containsKey(key))) {
if (restrict) {
throw new ConfigException("sub node does not exist. FIELD[" + key + "]");
}
return new Config(new JSONObject());
}
Object arr = dataObject.get(key);
if (arr instanceof JSONObject){
return new Config((JSONObject) arr);
}
if (arr instanceof JSONArray){
// 将array 转化为 map
Object[] s = ((JSONArray) arr).toArray();
JSONObject tdataObject = new JSONObject();
for (Integer index = 0; index < s.length; index++){
tdataObject.put(index.toString(), s[index]);
}
return new Config(tdataObject);
}
throw new ConfigException("type error, expects array or object. FIELD[" + key + "]" + "found: " + arr);
}
public JSONObject rawData() {return this.dataObject;}
}