package org.test4j.json.helper;
import java.lang.reflect.Type;
import java.util.LinkedHashMap;
import java.util.Map;
import org.test4j.json.JSONException;
import org.test4j.tools.commons.StringHelper;
@SuppressWarnings({ "rawtypes" })
public class JSONMap extends LinkedHashMap<JSONObject, JSONObject> implements JSONObject {
private static final long serialVersionUID = 1L;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
public JSONMap() {
super(DEFAULT_INITIAL_CAPACITY);
}
public JSONMap(int size) {
super(size);
}
public JSONMap(Map<JSONObject, JSONObject> map) {
super(map);
}
@Override
public boolean containsKey(Object key) {
JSONObject newkey = JSONSingle.convertJSON(key);
return super.containsKey(newkey);
}
@Override
public JSONObject get(Object key) {
JSONObject newkey = JSONSingle.convertJSON(key);
return super.get(newkey);
}
/**
* same as put(key,value)
*
* @param key
* @param value
*/
public JSONObject putJSON(Object key, Object value) {
JSONObject newkey = JSONSingle.convertJSON(key);
JSONObject newValue = JSONSingle.convertJSON(value);
return super.put(newkey, newValue);
}
private boolean isInit = false;
private String referenceID = null;
private Class refClazz = null;
/**
* 返回对象的hashcode值
*
* @return
*/
public String getReferenceID() {
if (!this.isInit) {
this.initClazAndRefID();
}
return this.referenceID;
}
/**
* 返回json对象类型名称<br>
* 同时记录对象的hashcode值
*
* @param defaultClazz
* 默认值
* @return
*/
public Type getClazzFromJSONFProp(Type defaultClazz) {
if (!this.isInit) {
this.initClazAndRefID();
}
return this.refClazz == null ? defaultClazz : this.refClazz;
}
private void initClazAndRefID() {
this.isInit = true;
JSONObject object = this.get(JSON_ClazzFlag);
if (object == null || !(object instanceof JSONSingle)) {
return;
}
JSONSingle value = (JSONSingle) object;
String clazzName = value.toClazzName();
this.referenceID = value.toReferenceID();
if (StringHelper.isBlankOrNull(clazzName)) {
this.refClazz = null;
} else {
this.refClazz = ClazzMap.getClazzType(clazzName.trim());
}
}
/**
* 返回json字符串中value:xxx中xxx表示JSON对象
*
* @return
*/
public JSONObject getValueFromJSONProp() {
JSONObject value = this.get(JSON_ValueFlag);
return value;
}
/**
* 返回对象的引用地址hascode<br>
* 如果json没有记录则返回null
*
* @return
*/
public String getReferFromJSONProp() {
JSONObject object = (JSONSingle) this.get(JSON_ReferFlag);
if (object == null) {
return null;
} else if (!(object instanceof JSONSingle)) {
throw new JSONException("the object reference value can only be JSONSingle type.");
}
JSONSingle value = (JSONSingle) object;
String referenceID = value.toStringValue();
return referenceID;
}
public String description() {
return toString();
}
}