package core.framework.impl.template; import core.framework.api.util.Exceptions; import core.framework.impl.validate.type.DataTypeValidator; import core.framework.impl.validate.type.TypeVisitor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.math.BigDecimal; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZonedDateTime; /** * @author neo */ public class ModelClassValidator implements TypeVisitor { private final DataTypeValidator validator; public ModelClassValidator(Class<?> modelClass) { validator = new DataTypeValidator(modelClass); validator.allowedValueClass = this::allowedValueClass; validator.allowChild = true; validator.allowTopLevelList = false; validator.visitor = this; } public void validate() { validator.validate(); } private boolean allowedValueClass(Class<?> valueClass) { return String.class.equals(valueClass) || Integer.class.equals(valueClass) || Boolean.class.equals(valueClass) || Long.class.equals(valueClass) || Double.class.equals(valueClass) || BigDecimal.class.equals(valueClass) || LocalDate.class.equals(valueClass) || LocalDateTime.class.equals(valueClass) || ZonedDateTime.class.equals(valueClass) || Instant.class.equals(valueClass) || valueClass.isEnum() || "org.bson.types.ObjectId".equals(valueClass.getCanonicalName()); // not depends on mongo jar if application doesn't include mongo driver; } @Override public void visitClass(Class<?> objectClass, String path) { Method[] methods = objectClass.getDeclaredMethods(); for (Method method : methods) { if (Modifier.isPublic(method.getModifiers()) && method.getReturnType().isPrimitive()) { throw Exceptions.error("primitive class as return type is not supported, please use object type, returnType={}, method={}", method.getReturnType(), method.getDeclaringClass().getCanonicalName() + "." + method.getName()); } } } @Override public void visitField(Field field, String parentPath) { } }