Skip to content

Commit

Permalink
Merge pull request #247 from muehmar/149-inner-class-which-contains-a…
Browse files Browse the repository at this point in the history
…ll-stages-of-the-builder

Create inner class for builder stages
  • Loading branch information
muehmar authored Jan 31, 2024
2 parents af40b88 + 345b076 commit 8542e16
Show file tree
Hide file tree
Showing 6 changed files with 1,912 additions and 1,803 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@

import com.github.muehmar.gradle.openapi.generator.java.generator.enumpojo.EnumGenerator;
import com.github.muehmar.gradle.openapi.generator.java.generator.pojo.safebuilder.SafeBuilderGenerator;
import com.github.muehmar.gradle.openapi.generator.java.generator.pojo.safebuilder.SafeBuilderVariant;
import com.github.muehmar.gradle.openapi.generator.java.generator.shared.PackageGenerator;
import com.github.muehmar.gradle.openapi.generator.java.generator.shared.jackson.JacksonAnnotationGenerator;
import com.github.muehmar.gradle.openapi.generator.java.model.member.JavaPojoMember;
Expand Down Expand Up @@ -164,8 +163,6 @@ private static Generator<JavaObjectPojo, PojoSettings> builders() {
return Generator.<JavaObjectPojo, PojoSettings>emptyGen()
.append(normalBuilderGenerator())
.appendSingleBlankLine()
.append(new SafeBuilderGenerator(SafeBuilderVariant.FULL))
.appendSingleBlankLine()
.append(new SafeBuilderGenerator(SafeBuilderVariant.STANDARD));
.append(new SafeBuilderGenerator());
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.github.muehmar.gradle.openapi.generator.java.generator.pojo.safebuilder;

import static com.github.muehmar.gradle.openapi.generator.java.generator.pojo.safebuilder.SafeBuilderVariant.FULL;
import static com.github.muehmar.gradle.openapi.generator.java.generator.pojo.safebuilder.SafeBuilderVariant.STANDARD;
import static com.github.muehmar.gradle.openapi.generator.java.generator.pojo.safebuilder.allof.AllOfBuilderGenerator.allOfBuilderGenerator;
import static com.github.muehmar.gradle.openapi.generator.java.generator.pojo.safebuilder.anyof.AnyOfBuilderGenerator.anyOfBuilderGenerator;
import static com.github.muehmar.gradle.openapi.generator.java.generator.pojo.safebuilder.oneof.OneOfBuilderGenerator.oneOfBuilderGenerator;
Expand All @@ -8,13 +10,18 @@
import static com.github.muehmar.gradle.openapi.generator.java.generator.pojo.safebuilder.property.OptionalMemberBuilderGenerator.optionalMemberBuilderGenerator;
import static com.github.muehmar.gradle.openapi.generator.java.generator.pojo.safebuilder.property.RequiredMemberBuilderGenerator.requiredMemberBuilderGenerator;
import static io.github.muehmar.codegenerator.Generator.constant;
import static io.github.muehmar.codegenerator.java.ClassGen.Declaration.NESTED;
import static io.github.muehmar.codegenerator.java.JavaModifier.FINAL;
import static io.github.muehmar.codegenerator.java.JavaModifier.PUBLIC;
import static io.github.muehmar.codegenerator.java.JavaModifier.STATIC;

import com.github.muehmar.gradle.openapi.generator.java.generator.shared.Filters;
import com.github.muehmar.gradle.openapi.generator.java.model.name.JavaName;
import com.github.muehmar.gradle.openapi.generator.java.model.pojo.JavaObjectPojo;
import com.github.muehmar.gradle.openapi.generator.settings.PojoSettings;
import io.github.muehmar.codegenerator.Generator;
import io.github.muehmar.codegenerator.java.JavaDocGenerator;
import io.github.muehmar.codegenerator.java.JavaGenerators;
import io.github.muehmar.codegenerator.writer.Writer;
import java.util.function.Function;

Expand All @@ -24,48 +31,91 @@ public class SafeBuilderGenerator implements Generator<JavaObjectPojo, PojoSetti
+ "additional property with the same name as an explicit property will be discarded.";
private final Generator<JavaObjectPojo, PojoSettings> delegate;

public SafeBuilderGenerator(SafeBuilderVariant builderVariant) {
private static final String BUILDER_STAGES_CLASS_NAME = "BuilderStages";

public SafeBuilderGenerator() {
this.delegate =
JavaDocGenerator.<JavaObjectPojo, PojoSettings>ofJavaDocString(FACTORY_JAVA_DOC)
.append(factoryMethod(builderVariant, simpleBuilderMethodName(builderVariant)))
.appendSingleBlankLine()
.append(JavaDocGenerator.ofJavaDocString(FACTORY_JAVA_DOC))
.append(factoryMethod(builderVariant, pojoBuilderMethodName(builderVariant)))
.appendSingleBlankLine()
.append(allOfBuilderGenerator(builderVariant))
.appendSingleBlankLine()
.append(oneOfBuilderGenerator(builderVariant))
.appendSingleBlankLine()
.append(anyOfBuilderGenerator(builderVariant))
Generator.<JavaObjectPojo, PojoSettings>emptyGen()
.append(factoryMethods(FULL))
.appendSingleBlankLine()
.append(requiredMemberBuilderGenerator(builderVariant))
.append(factoryMethods(STANDARD))
.appendSingleBlankLine()
.append(finalRequiredMemberBuilderGenerator(builderVariant))
.appendSingleBlankLine()
.append(optionalMemberBuilderGenerator(builderVariant))
.appendSingleBlankLine()
.append(finalOptionalMemberBuilderGenerator(builderVariant))
.append(builderStagesClass())
.filter(Filters.isSafeBuilder());
}

private static Generator<JavaObjectPojo, PojoSettings> factoryMethods(
SafeBuilderVariant builderVariant) {
return Generator.<JavaObjectPojo, PojoSettings>emptyGen()
.append(JavaDocGenerator.ofJavaDocString(FACTORY_JAVA_DOC))
.append(factoryMethod(builderVariant, simpleBuilderMethodName(builderVariant)))
.appendSingleBlankLine()
.append(JavaDocGenerator.ofJavaDocString(FACTORY_JAVA_DOC))
.append(factoryMethod(builderVariant, pojoBuilderMethodName(builderVariant)));
}

private static Generator<JavaObjectPojo, PojoSettings> builderStagesClass() {
return JavaGenerators.<JavaObjectPojo, PojoSettings>classGen()
.clazz()
.declaration(NESTED)
.packageGen(Generator.emptyGen())
.noJavaDoc()
.noAnnotations()
.modifiers(PUBLIC, STATIC, FINAL)
.className(BUILDER_STAGES_CLASS_NAME)
.noSuperClass()
.noInterfaces()
.content(
privateBuilderStagesClassConstructor()
.appendSingleBlankLine()
.append(singleBuilderVariantContent(FULL))
.appendSingleBlankLine()
.append(singleBuilderVariantContent(STANDARD)))
.build();
}

private static Generator<JavaObjectPojo, PojoSettings> privateBuilderStagesClassConstructor() {
return Generator.constant("private %s() {}", BUILDER_STAGES_CLASS_NAME);
}

private static Generator<JavaObjectPojo, PojoSettings> singleBuilderVariantContent(
SafeBuilderVariant builderVariant) {
return Generator.<JavaObjectPojo, PojoSettings>emptyGen()
.append(allOfBuilderGenerator(builderVariant))
.appendSingleBlankLine()
.append(oneOfBuilderGenerator(builderVariant))
.appendSingleBlankLine()
.append(anyOfBuilderGenerator(builderVariant))
.appendSingleBlankLine()
.append(requiredMemberBuilderGenerator(builderVariant))
.appendSingleBlankLine()
.append(finalRequiredMemberBuilderGenerator(builderVariant))
.appendSingleBlankLine()
.append(optionalMemberBuilderGenerator(builderVariant))
.appendSingleBlankLine()
.append(finalOptionalMemberBuilderGenerator(builderVariant));
}

@Override
public Writer generate(JavaObjectPojo data, PojoSettings settings, Writer writer) {
return delegate.generate(data, settings, writer);
}

private Generator<JavaObjectPojo, PojoSettings> factoryMethod(
private static Generator<JavaObjectPojo, PojoSettings> factoryMethod(
SafeBuilderVariant builderVariant, Function<JavaObjectPojo, String> builderName) {
return Generator.<JavaObjectPojo, PojoSettings>emptyGen()
.append(
(pojo, s, w) ->
w.println(
"public static %s %s() {",
"public static %s.%s %s() {",
BUILDER_STAGES_CLASS_NAME,
BuilderStage.createStages(builderVariant, pojo).head().getName(),
builderName.apply(pojo)))
.append(
(pojo, s, w) ->
w.println(
"return new %s(new Builder());",
"return new %s.%s(new Builder());",
BUILDER_STAGES_CLASS_NAME,
BuilderStage.createStages(builderVariant, pojo).head().getName()),
1)
.append(constant("}"));
Expand Down
Loading

0 comments on commit 8542e16

Please sign in to comment.