diff --git a/processor/src/main/java/org/javahelpers/simple/builders/processor/analysis/JavaLangMapper.java b/processor/src/main/java/org/javahelpers/simple/builders/processor/analysis/JavaLangMapper.java index 346ce59e..4b42d3ba 100644 --- a/processor/src/main/java/org/javahelpers/simple/builders/processor/analysis/JavaLangMapper.java +++ b/processor/src/main/java/org/javahelpers/simple/builders/processor/analysis/JavaLangMapper.java @@ -43,6 +43,7 @@ import javax.lang.model.type.TypeMirror; import javax.lang.model.type.TypeVariable; import javax.lang.model.util.SimpleTypeVisitor14; +import org.javahelpers.simple.builders.core.enums.AccessModifier; import org.javahelpers.simple.builders.processor.model.annotation.AnnotationDto; import org.javahelpers.simple.builders.processor.model.method.MethodParameterDto; import org.javahelpers.simple.builders.processor.model.type.GenericParameterDto; @@ -80,6 +81,23 @@ public static Modifier mapRelevantModifier(Set modifier) { return DEFAULT; } + /** + * Maps an AccessModifier enum value to a javax.lang.model.element.Modifier. + * + * @param accessModifier the access modifier to map + * @return the corresponding Modifier, or null for package-private + */ + public static Modifier mapAccessModifier(AccessModifier accessModifier) { + if (accessModifier == null) { + return null; + } + return switch (accessModifier) { + case PUBLIC, DEFAULT -> Modifier.PUBLIC; + case PRIVATE -> Modifier.PRIVATE; + case PACKAGE_PRIVATE -> null; // Package-private has no explicit modifier + }; + } + /** * Mapping a Java-Class to a TypeName. This method does not expact sealed or annonymous classes. * diff --git a/processor/src/main/java/org/javahelpers/simple/builders/processor/classgen/javapoet/JavaCodeGenerator.java b/processor/src/main/java/org/javahelpers/simple/builders/processor/classgen/javapoet/JavaCodeGenerator.java index 4c18c00e..5499f44c 100644 --- a/processor/src/main/java/org/javahelpers/simple/builders/processor/classgen/javapoet/JavaCodeGenerator.java +++ b/processor/src/main/java/org/javahelpers/simple/builders/processor/classgen/javapoet/JavaCodeGenerator.java @@ -46,6 +46,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.javahelpers.simple.builders.core.util.TrackedValue; +import org.javahelpers.simple.builders.processor.analysis.JavaLangMapper; import org.javahelpers.simple.builders.processor.exceptions.BuilderException; import org.javahelpers.simple.builders.processor.model.annotation.AnnotationDto; import org.javahelpers.simple.builders.processor.model.annotation.InterfaceName; @@ -79,7 +80,7 @@ public JavaCodeGenerator(ProcessingEnvironment processingEnv, ProcessingLogger l } /** - * Generating source code file for builder using Javapoet. + * Generates a builder class from the given builder definition. * * @param builderDef dto of all information to create the builder * @throws BuilderException if there is an error in source code generation @@ -120,7 +121,8 @@ private void addClassMetadata(TypeSpec.Builder classBuilder, BuilderDefinitionDt } // Set builder class access level - Modifier builderAccessModifier = map2Modifier(builderDef.getConfiguration().getBuilderAccess()); + Modifier builderAccessModifier = + JavaLangMapper.mapAccessModifier(builderDef.getConfiguration().getBuilderAccess()); if (builderAccessModifier != null) { classBuilder.addModifiers(builderAccessModifier); } @@ -402,7 +404,8 @@ private void generateConstructors( TypeSpec.Builder classBuilder, BuilderDefinitionDto builderDef) { // Get access modifiers from configuration Modifier constructorAccessModifier = - map2Modifier(builderDef.getConfiguration().getBuilderConstructorAccess()); + JavaLangMapper.mapAccessModifier( + builderDef.getConfiguration().getBuilderConstructorAccess()); ClassName dtoBaseClass = map2ClassName(builderDef.getBuildingTargetTypeName()); // Generate empty constructor diff --git a/processor/src/main/java/org/javahelpers/simple/builders/processor/classgen/javapoet/JavapoetMapper.java b/processor/src/main/java/org/javahelpers/simple/builders/processor/classgen/javapoet/JavapoetMapper.java index e2024068..c8cbb2f0 100644 --- a/processor/src/main/java/org/javahelpers/simple/builders/processor/classgen/javapoet/JavapoetMapper.java +++ b/processor/src/main/java/org/javahelpers/simple/builders/processor/classgen/javapoet/JavapoetMapper.java @@ -37,7 +37,6 @@ import java.util.stream.Collectors; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.javahelpers.simple.builders.core.enums.AccessModifier; import org.javahelpers.simple.builders.processor.classgen.javapoet.exceptions.JavapoetMapperException; import org.javahelpers.simple.builders.processor.model.annotation.AnnotationDto; import org.javahelpers.simple.builders.processor.model.annotation.InterfaceName; @@ -243,20 +242,6 @@ public static List map2AnnotationSpecs(List annot return annotations.stream().map(JavapoetMapper::map2AnnotationSpec).toList(); } - /** - * Maps an AccessModifier enum value to a javax.lang.model.element.Modifier. - * - * @param accessModifier the access modifier to map - * @return the corresponding Modifier - */ - public static javax.lang.model.element.Modifier map2Modifier(AccessModifier accessModifier) { - return switch (accessModifier) { - case PUBLIC, DEFAULT -> javax.lang.model.element.Modifier.PUBLIC; - case PRIVATE -> javax.lang.model.element.Modifier.PRIVATE; - case PACKAGE_PRIVATE -> null; // Package-private has no explicit modifier - }; - } - /** * Maps an InterfaceName to a JavaPoet TypeName. * diff --git a/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/builder/ClassJavaDocEnhancer.java b/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/builder/ClassJavaDocEnhancer.java index 19b0f510..a25a3d25 100644 --- a/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/builder/ClassJavaDocEnhancer.java +++ b/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/builder/ClassJavaDocEnhancer.java @@ -24,8 +24,6 @@ package org.javahelpers.simple.builders.processor.generators.builder; -import com.palantir.javapoet.ClassName; -import com.palantir.javapoet.CodeBlock; import org.javahelpers.simple.builders.processor.generators.BuilderEnhancer; import org.javahelpers.simple.builders.processor.model.core.BuilderDefinitionDto; import org.javahelpers.simple.builders.processor.model.type.TypeName; @@ -87,31 +85,28 @@ public boolean appliesTo( @Override public void enhanceBuilder(BuilderDefinitionDto builderDto, ProcessingContext context) { - ClassName dtoClass = - ClassName.get( - builderDto.getBuildingTargetTypeName().getPackageName(), - builderDto.getBuildingTargetTypeName().getClassName()); - - CodeBlock javadoc = createClassJavadoc(dtoClass); - builderDto.setClassJavadoc(javadoc.toString()); + TypeName targetType = builderDto.getBuildingTargetTypeName(); + String javadoc = createClassJavadoc(targetType); + builderDto.setClassJavadoc(javadoc); } /** * Creates comprehensive JavaDoc for the builder class. * - * @param dtoClass the target DTO class - * @return CodeBlock containing the JavaDoc content + * @param targetType the target DTO type + * @return String containing the JavaDoc content */ - private CodeBlock createClassJavadoc(ClassName dtoClass) { - return CodeBlock.of( + private String createClassJavadoc(TypeName targetType) { + String qualifiedClassName = targetType.getFullQualifiedName(); + return String.format( """ - Builder for {@code $1T}. + Builder for {@code %s}.

- This builder provides a fluent API for creating instances of $1T with + This builder provides a fluent API for creating instances of %s with method chaining and validation. Use the static {@code create()} method to obtain a new builder instance, configure the desired properties using the setter methods, and then call {@code build()} to create the final DTO. """, - dtoClass); + qualifiedClassName, qualifiedClassName); } } diff --git a/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/util/MethodGeneratorUtil.java b/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/util/MethodGeneratorUtil.java index 9fd90f30..981b282c 100644 --- a/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/util/MethodGeneratorUtil.java +++ b/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/util/MethodGeneratorUtil.java @@ -30,7 +30,6 @@ import javax.lang.model.element.Modifier; import org.apache.commons.lang3.StringUtils; import org.javahelpers.simple.builders.processor.analysis.JavaLangMapper; -import org.javahelpers.simple.builders.processor.classgen.javapoet.JavapoetMapper; import org.javahelpers.simple.builders.processor.model.core.FieldDto; import org.javahelpers.simple.builders.processor.model.method.MethodDto; import org.javahelpers.simple.builders.processor.model.method.MethodParameterDto; @@ -96,7 +95,7 @@ public static String generateBuilderMethodName(String fieldName, ProcessingConte * @return the Modifier for method access, or null for package-private */ public static Modifier getMethodAccessModifier(ProcessingContext context) { - return JavapoetMapper.map2Modifier(context.getConfiguration().getMethodAccess()); + return JavaLangMapper.mapAccessModifier(context.getConfiguration().getMethodAccess()); } /**