package jnpf.base.util;
|
|
import jnpf.constant.GenerateConstant;
|
import jnpf.util.JsonUtil;
|
import jnpf.util.StringUtil;
|
import jnpf.util.visiual.JnpfKeyConsts;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.StringJoiner;
|
|
/** Validates field names against reserved keywords in the original form configuration. */
|
public final class VisualFieldKeywordValidator {
|
|
private VisualFieldKeywordValidator() {
|
}
|
|
public static String invalidFields(String fieldsJson) {
|
StringJoiner invalid = new StringJoiner(",");
|
collect(JsonUtil.getJsonToListMap(fieldsJson), invalid);
|
return invalid.toString();
|
}
|
|
private static void collect(List<Map<String, Object>> fields, StringJoiner invalid) {
|
if (fields == null) {
|
return;
|
}
|
for (Map<String, Object> field : fields) {
|
Map<String, Object> config = asMap(field.get("__config__"));
|
if (config == null) {
|
continue;
|
}
|
Object children = config.get("children");
|
if (JnpfKeyConsts.CHILD_TABLE.equals(config.get("jnpfKey"))) {
|
for (Map<String, Object> child : asMapList(children)) {
|
checkField(child, invalid);
|
}
|
} else if (children != null) {
|
collect(asMapList(children), invalid);
|
} else {
|
checkField(field, invalid);
|
}
|
}
|
}
|
|
private static void checkField(Map<String, Object> field, StringJoiner invalid) {
|
String fieldName = (String) field.get("__vModel__");
|
if (StringUtil.isEmpty(fieldName) || !GenerateConstant.containKeyword(fieldName)) {
|
return;
|
}
|
Map<String, Object> config = asMap(field.get("__config__"));
|
if ("f_flow_state".equals(fieldName) && config != null
|
&& JnpfKeyConsts.SELECT.equals(config.get("jnpfKey"))
|
&& Boolean.TRUE.equals(config.get("isDisplayOnly"))) {
|
return;
|
}
|
invalid.add(String.valueOf(config == null ? null : config.get("label")) + "-" + fieldName);
|
}
|
|
@SuppressWarnings("unchecked")
|
private static Map<String, Object> asMap(Object value) {
|
return value instanceof Map ? (Map<String, Object>) value : null;
|
}
|
|
private static List<Map<String, Object>> asMapList(Object value) {
|
List<Map<String, Object>> result = new ArrayList<>();
|
if (value instanceof List) {
|
for (Object child : (List<?>) value) {
|
Map<String, Object> field = asMap(child);
|
if (field != null) {
|
result.add(field);
|
}
|
}
|
}
|
return result;
|
}
|
}
|