Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions docs/CUSTOMIZING.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,14 +99,15 @@ public class CustomValidationGenerator implements MethodGenerator {

@Override
public List<MethodDto> generateMethods(FieldDto field, TypeName builderType, ProcessingContext context) {
String fieldName = field.getFieldName();
String methodName = "validated" + capitalize(fieldName);
String fieldInDto = field.getOriginalFieldName();
String fieldInBuilder = field.getFieldNameInBuilder();
String methodName = "validated" + capitalize(fieldInDto);

// Generate validation setter method
MethodDto method = new MethodDto(methodName, builderType);

// Add parameter
String parameterName = fieldName;
String parameterName = fieldInDto;
MethodParameterDto parameter = new MethodParameterDto();
parameter.setParameterName(parameterName);
parameter.setParameterTypeName(new TypeName("java.lang", "String"));
Expand Down Expand Up @@ -310,7 +311,7 @@ public List<MethodDto> generateMethods(FieldDto field, TypeName builderType, Pro
// Your generation logic
return methods;
} catch (Exception e) {
context.error("Failed to generate method for field %s: %s", field.getFieldName(), e.getMessage());
context.error("Failed to generate method for field %s: %s", field.getFieldNameInBuilder(), e.getMessage());
return List.of(); // Return empty list on error
}
}
Expand Down Expand Up @@ -406,13 +407,14 @@ public class DateParserGenerator implements MethodGenerator {

@Override
public List<MethodDto> generateMethods(FieldDto field, TypeName builderType, ProcessingContext context) {
String fieldName = field.getFieldName();
String methodName = fieldName + "FromString";
String fieldInDto = field.getOriginalFieldName();
String fieldInBuilder = field.getFieldNameInBuilder();
String methodName = fieldInDto + "FromString";

MethodDto method = new MethodDto(methodName, builderType);

// Add parameter
String parameterName = fieldName + "String";
String parameterName = fieldInDto + "String";
MethodParameterDto parameter = new MethodParameterDto();
parameter.setParameterName(parameterName);
parameter.setParameterTypeName(new TypeName("java.lang", "String"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,24 +66,25 @@ public boolean appliesTo(FieldDto field, TypeName dtoType, ProcessingContext con

@Override
public List<MethodDto> generateMethods(FieldDto field, TypeName builderType, ProcessingContext context) {
String fieldName = field.getFieldName();
String methodName = "validate" + StringUtils.capitalize(fieldName);
String fieldInDto = field.getOriginalFieldName();
String fieldInBuilder = field.getFieldNameInBuilder();
String methodName = "validate" + StringUtils.capitalize(fieldInDto);

String methodBody = String.format(
"if (!%s.isSet() || %s.value().trim().isEmpty()) {\n" +
" throw new IllegalArgumentException(\"%s cannot be null or empty\");\n" +
"}\n" +
"return this;",
fieldName, fieldName, StringUtils.capitalize(fieldName)
fieldInBuilder, fieldInBuilder, StringUtils.capitalize(fieldInDto)
);

MethodDto validationMethod = new MethodDto(methodName, builderType);
validationMethod.setCode(methodBody);
validationMethod.setJavadoc(
"Validates that the " + fieldName + " field is not null or empty.\n" +
"Validates that the " + fieldInDto + " field is not null or empty.\n" +
"\n" +
"@return this builder instance for chaining\n" +
"@throws IllegalArgumentException if " + fieldName + " is null or empty"
"@throws IllegalArgumentException if " + fieldInDto + " is null or empty"
);

return List.of(validationMethod);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,11 @@
* that field.
*/
public class FieldDto {
/** Name of field in Builder. */
private String fieldName;
/** Name of the field as it appears in the original DTO (used for method names and setters). */
private String originalFieldName;

/** Name of field according to estimation by constructors and setters. */
private String fieldNameEstimated;
/** Name of the field as stored in the builder (may be renamed to avoid conflicts). */
private String fieldNameInBuilder;

/** Type of field. Containing generic, name of package and class */
private TypeName fieldType;
Expand Down Expand Up @@ -72,49 +72,51 @@ public class FieldDto {
private final List<AnnotationDto> parameterAnnotations = new ArrayList<>();

/**
* Getting name of field.
* Gets the original field name from the DTO. This name is used for generating method names,
* parameter names, and setter method names (e.g., "userName" becomes "setUserName").
*
* @return the name of the field
* @return the original field name from the DTO
*/
public String getFieldName() {
return fieldName;
public String getOriginalFieldName() {
return originalFieldName;
}

/**
* Setting name of field.
* Sets the original field name from the DTO.
*
* @param fieldName the name to set for this field
* @param originalFieldName the original field name from the DTO
*/
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
public void setOriginalFieldName(String originalFieldName) {
this.originalFieldName = originalFieldName;
}

/**
* Getting name of field estimated by constructor and setter.
* Gets the field name as stored in the builder. This name may be different from the original
* field name if renaming was required to avoid conflicts with other fields or reserved words.
*
* @return the estimated name of the field
* @return the field name as used in the builder
*/
public String getFieldNameEstimated() {
return fieldNameEstimated;
public String getFieldNameInBuilder() {
return fieldNameInBuilder;
}

/**
* Setting name of field estimated by constructor and setter.
* Sets the field name as stored in the builder.
*
* @param fieldNameEstimated the estimated name to set for this field
* @param fieldNameInBuilder the field name to use in the builder
*/
public void setFieldNameEstimated(String fieldNameEstimated) {
this.fieldNameEstimated = fieldNameEstimated;
public void setFieldNameInBuilder(String fieldNameInBuilder) {
this.fieldNameInBuilder = fieldNameInBuilder;
}

/**
* Getting name of setter method to use in build() method. This is always set during field
* creation and represents the actual setter method name in the DTO.
* Gets the setter method name for this field. The setter name is derived from the original field
* name and follows JavaBean conventions (e.g., "userName" becomes "setUserName").
*
* @return name of setter for field (never null)
* @return the setter method name for this field (never null)
*/
public String getSetterName() {
return "set" + StringUtils.capitalize(fieldNameEstimated);
return "set" + StringUtils.capitalize(originalFieldName);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,8 @@ public List<MethodDto> generateMethods(
if (fieldType instanceof TypeNameList listType && listType.isParameterized()) {
MethodDto addMethod =
createAddToCollectionMethod(
field.getFieldNameEstimated(),
field.getFieldName(),
field.getOriginalFieldName(),
field.getFieldNameInBuilder(),
listType,
listType.getElementType(),
builderType,
Expand All @@ -111,8 +111,8 @@ public List<MethodDto> generateMethods(
} else if (fieldType instanceof TypeNameSet setType && setType.isParameterized()) {
MethodDto addMethod =
createAddToCollectionMethod(
field.getFieldNameEstimated(),
field.getFieldName(),
field.getOriginalFieldName(),
field.getFieldNameInBuilder(),
setType,
setType.getElementType(),
builderType,
Expand All @@ -124,13 +124,13 @@ public List<MethodDto> generateMethods(
}

private MethodDto createAddToCollectionMethod(
String fieldNameEstimated,
String fieldName,
String originalFieldName,
String fieldNameInBuilder,
TypeName fieldType,
TypeName elementType,
TypeName builderType,
ProcessingContext context) {
String methodName = "add2" + StringUtils.capitalize(fieldNameEstimated);
String methodName = "add2" + StringUtils.capitalize(originalFieldName);
MethodDto methodDto = new MethodDto(methodName, builderType);

MethodParameterDto parameter = new MethodParameterDto();
Expand Down Expand Up @@ -166,7 +166,7 @@ private MethodDto createAddToCollectionMethod(
""");
methodDto.addArgument("collectionVarType", collectionVarType);
methodDto.addArgument("collectionImpl", new TypeName("java.util", collectionImpl));
methodDto.addArgument("fieldName", fieldName);
methodDto.addArgument("fieldName", fieldNameInBuilder);
methodDto.addArgument("elementType", elementType);
methodDto.addArgument("builderFieldWrapper", TRACKED_VALUE_TYPE);
methodDto.setPriority(MethodDto.PRIORITY_MEDIUM);
Expand All @@ -178,7 +178,7 @@ private MethodDto createAddToCollectionMethod(
@param element the element to add
@return current instance of builder
"""
.formatted(fieldName));
.formatted(originalFieldName));

return methodDto;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,8 @@ private MethodDto createFieldConsumerWithArrayBuilder(
TypeName elementType,
TypeName returnBuilderType,
ProcessingContext context) {
String fieldName = field.getFieldNameEstimated();
String fieldNameInBuilder = field.getFieldName();
String fieldName = field.getOriginalFieldName();
String fieldNameInBuilder = field.getFieldNameInBuilder();
TypeNameGeneric builderTypeGeneric = new TypeNameGeneric(collectionBuilderType, elementType);
TypeNameGeneric consumerType = MethodGeneratorUtil.createConsumerType(builderTypeGeneric);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,8 @@ private MethodDto createFieldSetterForArrayFromList(
TypeName elementType,
TypeName builderType,
ProcessingContext context) {
String fieldName = field.getFieldNameEstimated();
String fieldNameInBuilder = field.getFieldName();
String fieldName = field.getOriginalFieldName();
String fieldNameInBuilder = field.getFieldNameInBuilder();
MethodParameterDto parameter = new MethodParameterDto();
parameter.setParameterName(fieldName);
parameter.setParameterTypeName(listType);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,17 +134,17 @@ protected MethodDto createBuildMethod(BuilderDefinitionDto builderDto) {
for (var field : builderDto.getConstructorFieldsForBuilder()) {
if (field.isNonNullable()) {
code.append("if (!this.")
.append(field.getFieldName())
.append(field.getFieldNameInBuilder())
.append(".isSet()) {\n")
.append(" throw new IllegalStateException(\"Required field '")
.append(field.getFieldName())
.append(field.getFieldNameInBuilder())
.append("' must be set before calling build()\");\n")
.append("}\n");
code.append("if (this.")
.append(field.getFieldName())
.append(field.getFieldNameInBuilder())
.append(".value() == null) {\n")
.append(" throw new IllegalStateException(\"Field '")
.append(field.getFieldName())
.append(field.getFieldNameInBuilder())
.append("' is marked as non-null but null value was provided\");\n")
.append("}\n");
}
Expand All @@ -154,12 +154,12 @@ protected MethodDto createBuildMethod(BuilderDefinitionDto builderDto) {
for (var field : builderDto.getSetterFieldsForBuilder()) {
if (field.isNonNullable()) {
code.append("if (this.")
.append(field.getFieldName())
.append(field.getFieldNameInBuilder())
.append(".isSet() && this.")
.append(field.getFieldName())
.append(field.getFieldNameInBuilder())
.append(".value() == null) {\n")
.append(" throw new IllegalStateException(\"Field '")
.append(field.getFieldName())
.append(field.getFieldNameInBuilder())
.append("' is marked as non-null but null value was provided\");\n")
.append("}\n");
}
Expand All @@ -180,7 +180,7 @@ protected MethodDto createBuildMethod(BuilderDefinitionDto builderDto) {
// Apply setter-based fields
for (var field : builderDto.getSetterFieldsForBuilder()) {
code.append("this.")
.append(field.getFieldName())
.append(field.getFieldNameInBuilder())
.append(".ifSet(result::")
.append(field.getSetterName())
.append(");\n");
Expand Down Expand Up @@ -277,7 +277,7 @@ protected MethodDto createToStringMethod(BuilderDefinitionDto builderDto) {
/** Creates the constructor arguments string for the build() method. */
private String createConstructorArgsString(BuilderDefinitionDto builderDto) {
return builderDto.getConstructorFieldsForBuilder().stream()
.map(field -> "this." + field.getFieldName() + ".value()")
.map(field -> "this." + field.getFieldNameInBuilder() + ".value()")
.reduce((a, b) -> a + ", " + b)
.orElse("");
}
Expand All @@ -294,9 +294,9 @@ private String createToStringAppendCalls(BuilderDefinitionDto builderDto) {
for (int i = 0; i < allFields.size(); i++) {
FieldDto field = allFields.get(i);
sb.append("\n .append(\"")
.append(field.getFieldName())
.append(field.getFieldNameInBuilder())
.append("\", this.")
.append(field.getFieldName())
.append(field.getFieldNameInBuilder())
.append(")");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ public List<MethodDto> generateAllMethods(
} catch (Exception e) {
context.error(
"Failed to apply method generator %s to field %s: %s",
generator.getClass().getName(), field.getFieldName(), e.getMessage());
generator.getClass().getName(), field.getFieldNameInBuilder(), e.getMessage());
}
}
}
Expand Down
Loading
Loading