private void createTagOrComponent()

in tobago-tool/tobago-tool-apt/src/main/java/org/apache/myfaces/tobago/apt/processor/ClassesGenerator.java [110:191]


  private void createTagOrComponent(final TypeElement declaration) throws IOException, ClassNotFoundException {
    final UIComponentTag componentTag = declaration.getAnnotation(UIComponentTag.class);
    final Map<String, PropertyInfo> properties = new HashMap<>();
    addProperties(declaration, properties);

    if (componentTag.generate()) {
      final Tag tag = declaration.getAnnotation(Tag.class);
      final String generic = "org.apache.myfaces.tobago.internal.component.AbstractUI"
          + tag.name().substring(0, 1).toUpperCase(Locale.ROOT) + tag.name().substring(1);
      final StringTemplate componentStringTemplate = componentStringTemplateGroup.getInstanceOf("component");
      final ComponentInfo componentInfo = new ComponentInfo(declaration, componentTag);
      componentInfo.setSuperClass(generic);
      componentInfo.setDescription(getDescription(declaration));
      componentInfo.setDeprecated(declaration.getAnnotation(Deprecated.class) != null);
      for (final String interfaces : componentTag.interfaces()) {
        componentInfo.addInterface(interfaces);
      }

      if (componentTag.behaviors().length > 0) {
        for (final Behavior behavior : componentTag.behaviors()) {
//          info("*************** ----------------------" + componentTag.behaviors().length);
//          info("*************** " + behavior.name());
//          info("*************** " + componentInfo.getBehaviors());
          componentInfo.getBehaviors().add(behavior.name());
          if (behavior.isDefault()) {
            if (componentInfo.getDefaultBehavior() != null) {
              throw new TobagoGeneratorException("defaultBehavior '" + componentInfo.getDefaultBehavior()
                  + "' will be overwritten with '" + behavior.name()
                  + "' in component '" + componentInfo.getSourceClass() + "'");
            }
            componentInfo.setDefaultBehavior(behavior.name());
          }
        }
        if (componentInfo.getDefaultBehavior() == null) {
          throw new TobagoGeneratorException(
              "defaultBehavior not set in component '" + componentInfo.getSourceClass() + "'");
        }
      }

      final Class<? extends UIComponent> facesClass
          = Class.forName(componentTag.uiComponentFacesClass()).asSubclass(UIComponent.class);

      for (final PropertyInfo info : properties.values()) {
        final String infoType = info.getType();
        final String methodName;
        if (infoType.equals("jakarta.el.MethodExpression") && Arrays.stream(facesClass.getMethods())
            .anyMatch(method -> method.getName().equals("get" + info.getUpperCamelCaseName() + "Expression"))) {
          methodName = "get" + info.getUpperCamelCaseName() + "Expression";
        } else if (infoType.equals("jakarta.el.MethodExpression") && Arrays.stream(facesClass.getMethods())
            .anyMatch(method -> method.getName().equals("get" + info.getUpperCamelCaseName() + "s"))) {
          methodName = "get" + info.getUpperCamelCaseName() + "s";
        } else if (infoType.equals("java.lang.Boolean") || infoType.equals("boolean")) {
          methodName = "is" + info.getUpperCamelCaseName();
        } else {
          methodName = "get" + info.getUpperCamelCaseName();
        }

        boolean generate = info.isGenerate();
//        boolean ex = false;
        try {
          final Method method = facesClass.getMethod(methodName);
          if (!Modifier.isAbstract(method.getModifiers())) {
            generate = false;
          }
        } catch (final NoSuchMethodException e) {
          // generate = true
//          ex = true;
        }
//        info("*** 5 " + infoType + "               " + methodName
//        + "      generate=" + generate + "      info.generate="
//        + info.isGenerate() + " ex=" + (ex ? "NoSuchMethodException" : "" )
//        + "                  facesClass=" + facesClass.getName());
        if (generate) {
          addPropertyToComponent(componentInfo, info);
        }

      }

      componentStringTemplate.setAttribute("componentInfo", componentInfo);
      writeFile(componentInfo, componentStringTemplate);
    }
  }