package org.zstack.core.validation; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.errorcode.ErrorFacade; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.Component; import org.zstack.header.core.validation.Validator; import org.zstack.header.errorcode.ErrorCode; import org.zstack.utils.TypeUtils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** */ public class ValidationFacadeImpl implements ValidationFacade, Component { private Map<Class, List<Validator>> validators = new HashMap<Class, List<Validator>>(); @Autowired private PluginRegistry pluginRgty; @Autowired private ErrorFacade errf; @Override public void validateErrorByException(Object obj) { ErrorCode err = validateErrorByErrorCode(obj); if (err != null) { throw new OperationFailureException(err); } } @Override public ErrorCode validateErrorByErrorCode(Object obj) { if (obj instanceof ConditionalValidation) { ConditionalValidation cond = (ConditionalValidation) obj; if (!cond.needValidation()) { return null; } } List<Class> classes = TypeUtils.getAllClassOfObject(obj); for (Class clz : classes) { List<Validator> vs = validators.get(clz); if (vs != null) { for (Validator v : vs) { String err = v.validate(obj); if (err != null) { return errf.stringToInternalError(err); } } } } return null; } private void populateExtensions() { for (Validator ext : pluginRgty.getExtensionList(Validator.class)) { for (Class clazz : ext.supportedClasses()) { List<Validator> vs = validators.get(clazz); if (vs == null) { vs = new ArrayList<Validator>(); validators.put(clazz, vs); } vs.add(ext); } } } @Override public boolean start() { populateExtensions(); return true; } @Override public boolean stop() { return true; } }