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;
  }