public List getEmbeddedComponents()

in tapestry/src/main/java/com/intellij/tapestry/core/model/presentation/PresentationLibraryElement.java [235:304]


  public List<TemplateElement> getEmbeddedComponents() {

    final List<TemplateElement> embeddedComponentsTemplate = new ArrayList<>();
    final List<TemplateElement> embeddedComponents = new ArrayList<>();

    for (IJavaField field : _class.getFields(true).values()) {
      if (field.isValid() &&
          field.getAnnotations().containsKey(TapestryConstants.COMPONENT_ANNOTATION) &&
          field.getType() instanceof IJavaClassType) {
        IJavaAnnotation annotation = field.getAnnotations().get(TapestryConstants.COMPONENT_ANNOTATION);
        final TapestryComponent component;
        if (annotation.getParameters().containsKey("type")) {
          component = _project.findComponent(annotation.getParameters().get("type")[0]);
        }
        else {
          component = _project.findComponent((IJavaClassType)field.getType());
        }
        embeddedComponents.add(new TemplateElement(new InjectedElement(field, component), "class"));
      }
    }

    final List<TemplateElement> embeddedComponentsClass = new ArrayList<>(embeddedComponents);

    for (int i = 0; i < getTemplate().length; i++) {

      getTemplate()[i].accept(new CoreXmlRecursiveElementVisitor() {
        @Override
        public void visitTag(XmlTag tag) {
          if (!ComponentUtils._isComponentTag(tag)) return;
          boolean hasAttributeType = false;
          InjectedElement injectedElement = null;
          TapestryComponent component = null;

          for (XmlAttribute attribute : tag.getAttributes()) {
            if (attribute.getLocalName().equals("type") && TapestryXmlExtension.isTapestryTemplateNamespace(attribute.getNamespace())) {
              String value = attribute.getValue();
              if (value != null) {
                component = _project.findComponent(value);
                injectedElement = new InjectedElement(tag, component);
                hasAttributeType = true;
              }
            }
          }

          if (!hasAttributeType) {
            component = _project.findComponent(tag.getLocalName());
            injectedElement = new InjectedElement(tag, component);
          }

          if (embeddedComponents.isEmpty() || component == null) return;
          for (TemplateElement element : embeddedComponents) {
            final String injectedElementId = injectedElement.getElementId();
            if (injectedElementId == null) continue;
            final String elementId = element.getElement().getElementId();
            final PresentationLibraryElement libraryElement = element.getElement().getElement();
            if (libraryElement != null &&
                elementId != null &&
                elementId.equalsIgnoreCase(injectedElementId) &&
                libraryElement.getName().equalsIgnoreCase(injectedElement.getTag().getLocalName()) &&
                injectedElement.getParameters().size() != 1) {
              if (!embeddedComponentsClass.isEmpty()) embeddedComponentsClass.remove(element);
            }
          }
        }
      });
    }
    embeddedComponentsClass.addAll(embeddedComponentsTemplate);

    return embeddedComponentsClass;
  }