private ViewConfigNode findNodeWithClass(Class nodeClass, ViewConfigNode viewConfigNode) { if (viewConfigNode == null || nodeClass == null) { return null; } if (nodeClass.equals(viewConfigNode.getSource())) { return viewConfigNode; } return findNodeWithClass(nodeClass, viewConfigNode.getParent()); }
@Override public List<Annotation> resolveInheritedMetaData(ViewConfigNode viewConfigNode) { List<Annotation> inheritedAnnotations = new ArrayList<Annotation>(); Set<Class> processedTypes = new HashSet<Class>(); processedTypes.add(ViewConfig.class); // filter the base interface in any case Stack<Class> classesToAnalyze = new Stack<Class>(); addInterfaces( processedTypes, classesToAnalyze, viewConfigNode.getSource()); // don't add the page-class itself while (!classesToAnalyze.empty()) { Class currentClass = classesToAnalyze.pop(); if (processedTypes.contains(currentClass)) { continue; } processedTypes.add(currentClass); addInterfaces(processedTypes, classesToAnalyze, currentClass); // don't add the annotations of the final view-config class itself (we just need the inherited // annotations) if (ViewConfigUtils.isFolderConfig(currentClass)) { inheritedAnnotations.addAll(findViewMetaData(currentClass, viewConfigNode)); } Class nextClass = currentClass.getSuperclass(); if (nextClass != null && !Object.class.equals(nextClass)) { if (!processedTypes.contains(nextClass)) { classesToAnalyze.push(nextClass); } } } // add meta-data inherited via stereotypes on the node itself inheritedAnnotations.addAll(findViewMetaData(viewConfigNode.getSource(), viewConfigNode)); return inheritedAnnotations; }
protected List<Annotation> findViewMetaData(Class currentClass, ViewConfigNode viewConfigNode) { // don't include meta-data from the node itself, because it would be stored as inherited // meta-data if (currentClass.equals(viewConfigNode.getSource())) { return Collections.emptyList(); } List<Annotation> result = new ArrayList<Annotation>(); for (Annotation annotation : currentClass.getAnnotations()) { Class<? extends Annotation> annotationClass = annotation.annotationType(); if (annotationClass.getName().startsWith("java")) { continue; } addViewMetaData(annotation, result); } result = tryToReplaceWithMergedMetaDataFromAncestor( currentClass, viewConfigNode.getParent(), result); return result; }