package org.gsonformat.intellij.entity;
import org.apache.http.util.TextUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by dim on 16/11/6.
*/
public class IterableFieldEntity extends FieldEntity {
private static final String listTemplate = "java.util.List<%s>";
private static final String briefListTemplate = "List<%s>";
private int deep;
public int getDeep() {
return deep;
}
public void setDeep(int deep) {
this.deep = deep;
}
public String getRealType() {
String typeName = getClassTypeName();
return String.format(getBriefTypeReg(), typeName);
}
public String getBriefType() {
return String.format(getBriefTypeReg(), getBriefClassTypeName());
}
private String getClassTypeName() {
String typeName = "";
if (targetClass != null) {
if (TextUtils.isEmpty(targetClass.getPackName())) {
typeName = targetClass.getClassName();
} else {
typeName = targetClass.getPackName() + "." + targetClass.getClassName();
}
} else if (getType() != null && getType().length() > 0) {
typeName = getType();
}
return typeName;
}
private String getBriefClassTypeName() {
String typeName = "";
if (targetClass != null) {
typeName = targetClass.getClassName();
} else if (getType() != null && getType().length() > 0) {
typeName = getType();
}
return typeName;
}
public String getFullNameType() {
String typeName = getClassTypeName();
return String.format(getTypeReg(), typeName);
}
private String getTypeReg() {
return getRegForDeep(listTemplate);
}
private String getBriefTypeReg() {
return getRegForDeep(briefListTemplate);
}
private String getRegForDeep(String template) {
if (deep > 0) {
String format = template;
for (int i = 1; i < deep; i++) {
format = String.format(format, template);
}
return format;
}
return "%s";
}
@Override
public void checkAndSetType(String text) {
if (targetClass.isLock()) {
return;
}
String regex = getBriefTypeReg().replaceAll("%s", "(\\\\w+)");
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
if (matcher.find() && matcher.groupCount() > 0) {
String temp = matcher.group(1);
if (!TextUtils.isEmpty(temp)) {
targetClass.setClassName(temp);
}
}
}
@Override
public boolean isSameType(Object o) {
if (o instanceof JSONArray) {
Object o1 = deepObjectFromJson(deep, 0, (JSONArray) o);
if (o1 instanceof JSONObject && getTargetClass() != null) {
return getTargetClass().isSame((JSONObject) o1);
} else if (getTargetClass() == null && getType() != null) {
return DataType.isSameDataType(DataType.typeOfString(getType()), DataType.typeOfObject(o1));
}
} else {
return false;
}
return super.isSameType(o);
}
private Object deepObjectFromJson(int deep, int current, JSONArray array) {
if (deep <= current) {
return null;
}
if (array.length() > 0) {
if (deep == current + 1 && !(array.get(0) instanceof JSONArray)) {
return array.get(0);
}
if (array.get(0) instanceof JSONArray) {
return deepObjectFromJson(deep, ++current, array.getJSONArray(0));
}
}
return null;
}
}