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