private List<MethodWrapper> collectMethods(Class<? extends AbstractDeclarativeValidator> clazz) { List<MethodWrapper> checkMethods = new ArrayList<MethodWrapper>(); Set<Class<?>> visitedClasses = new HashSet<Class<?>>(4); collectMethods(this, clazz, visitedClasses, checkMethods); return checkMethods; }
private void collectMethods(AbstractDeclarativeValidator instance, Class<? extends AbstractDeclarativeValidator> clazz, Collection<Class<?>> visitedClasses, Collection<MethodWrapper> result) { if (visitedClasses.contains(clazz)) return; collectMethodsImpl(instance, clazz, visitedClasses, result); Class<? extends AbstractDeclarativeValidator> k = clazz; while (k != null) { ComposedChecks checks = k.getAnnotation(ComposedChecks.class); if (checks != null) { for (Class<? extends AbstractDeclarativeValidator> external : checks.validators()) collectMethods(null, external, visitedClasses, result); } k = getSuperClass(k); } }
@Override protected final boolean internalValidate(EClass class1, EObject object, DiagnosticChain diagnostics, Map<Object, Object> context) { if (checkMethods == null) { synchronized (this) { if (checkMethods == null) { Set<MethodWrapper> checkMethods = Sets.newLinkedHashSet(); checkMethods.addAll(collectMethods(getClass())); this.checkMethods = checkMethods; } } } CheckMode checkMode = CheckMode.getCheckMode(context); State state = new State(); state.chain = diagnostics; state.currentObject = object; state.checkMode = checkMode; state.context = context; for (MethodWrapper method : methodsForType.get(object.getClass())) { method.invoke(state); } return !state.hasErrors; }