Skip to content

Commit

Permalink
Adjust builders and containers for anyOf with discriminator
Browse files Browse the repository at this point in the history
Issue: #238
  • Loading branch information
muehmar committed Jan 22, 2024
1 parent 4604476 commit 566a6cb
Show file tree
Hide file tree
Showing 34 changed files with 657 additions and 572 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.github.muehmar.gradle.openapi.generator.java;

import static com.github.muehmar.gradle.openapi.generator.java.generator.pojo.compositioncontainer.anyof.AnyOfContainerGenerator.anyOfContainerGenerator;
import static com.github.muehmar.gradle.openapi.generator.java.generator.pojo.compositioncontainer.oneof.OneOfContainerGenerator.oneOfContainerGenerator;
import static com.github.muehmar.gradle.openapi.generator.java.generator.pojo.compositioncontainer.multipojo.MultiPojoContainerGenerator.multiPojoContainerGenerator;
import static com.github.muehmar.gradle.openapi.generator.java.generator.pojo.compositioncontainer.singlepojo.SinglePojoContainerGenerator.singlePojoContainerGenerator;
import static io.github.muehmar.codegenerator.writer.Writer.javaWriter;

import ch.bluecare.commons.data.NonEmptyList;
Expand All @@ -15,13 +15,12 @@
import com.github.muehmar.gradle.openapi.generator.java.model.pojo.JavaEnumPojo;
import com.github.muehmar.gradle.openapi.generator.java.model.pojo.JavaObjectPojo;
import com.github.muehmar.gradle.openapi.generator.java.model.pojo.JavaPojo;
import com.github.muehmar.gradle.openapi.generator.java.model.pojo.auxiliaryy.AnyOfContainer;
import com.github.muehmar.gradle.openapi.generator.java.model.pojo.auxiliaryy.OneOfContainer;
import com.github.muehmar.gradle.openapi.generator.java.model.pojo.auxiliary.MultiPojoContainer;
import com.github.muehmar.gradle.openapi.generator.java.model.pojo.auxiliary.SinglePojoContainer;
import com.github.muehmar.gradle.openapi.generator.model.Pojo;
import com.github.muehmar.gradle.openapi.generator.settings.PojoSettings;
import com.github.muehmar.gradle.openapi.writer.GeneratedFile;
import io.github.muehmar.codegenerator.writer.Writer;
import java.util.Optional;

public class JavaPojoGenerator implements PojoGenerator {

Expand Down Expand Up @@ -63,29 +62,32 @@ private Writer generateArrayPojo(JavaArrayPojo pojo, Writer writer, PojoSettings
}

private PList<GeneratedFile> generateAuxiliaryPojoFiles(JavaPojo pojo, PojoSettings settings) {
final Optional<GeneratedFile> oneOfContainerFile =
final PList<GeneratedFile> singlePojoContainerFiles =
pojo.asObjectPojo()
.flatMap(JavaObjectPojo::getOneOfContainer)
.map(container -> createOneOfContainerFile(container, settings));
final Optional<GeneratedFile> anyOfContainerFile =
.map(JavaObjectPojo::getSinglePojoContainers)
.orElseGet(PList::empty)
.map(container -> createSinglePojoContainerFile(container, settings));
final PList<GeneratedFile> multiPojoContainerFiles =
pojo.asObjectPojo()
.flatMap(JavaObjectPojo::getAnyOfContainer)
.map(container -> createAnyOfContainerFile(container, settings));
return PList.fromOptional(oneOfContainerFile).concat(PList.fromOptional(anyOfContainerFile));
.map(JavaObjectPojo::getMultiPojoContainer)
.orElseGet(PList::empty)
.map(container -> createMultiPojoContainerFile(container, settings));
return singlePojoContainerFiles.concat(multiPojoContainerFiles);
}

private static GeneratedFile createOneOfContainerFile(
OneOfContainer container, PojoSettings settings) {
final Writer writer = oneOfContainerGenerator().generate(container, settings, javaWriter());
private static GeneratedFile createSinglePojoContainerFile(
SinglePojoContainer container, PojoSettings settings) {
final Writer writer =
singlePojoContainerGenerator().generate(container, settings, javaWriter());
final String content = writer.asString();
final JavaFileName javaFileName =
JavaFileName.fromSettingsAndClassname(settings, container.getContainerName());
return new GeneratedFile(javaFileName.asPath(), content);
}

private static GeneratedFile createAnyOfContainerFile(
AnyOfContainer container, PojoSettings settings) {
final Writer writer = anyOfContainerGenerator().generate(container, settings, javaWriter());
private static GeneratedFile createMultiPojoContainerFile(
MultiPojoContainer container, PojoSettings settings) {
final Writer writer = multiPojoContainerGenerator().generate(container, settings, javaWriter());
final String content = writer.asString();
final JavaFileName javaFileName =
JavaFileName.fromSettingsAndClassname(settings, container.getContainerName());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@

import static io.github.muehmar.codegenerator.Generator.newLine;

import com.github.muehmar.gradle.openapi.generator.java.model.composition.DiscriminatableJavaComposition;
import com.github.muehmar.gradle.openapi.generator.java.model.member.TechnicalPojoMember;
import com.github.muehmar.gradle.openapi.generator.java.model.pojo.auxiliaryy.AnyOfContainer;
import com.github.muehmar.gradle.openapi.generator.java.model.pojo.auxiliaryy.OneOfContainer;
import com.github.muehmar.gradle.openapi.generator.model.name.Name;
import com.github.muehmar.gradle.openapi.generator.settings.PojoSettings;
import io.github.muehmar.codegenerator.Generator;
Expand All @@ -14,19 +13,11 @@ public class ContainerGetter {

private ContainerGetter() {}

public static Generator<OneOfContainer, PojoSettings> oneOfContainerGetter() {
return Generator.<OneOfContainer, PojoSettings>emptyGen()
public static Generator<DiscriminatableJavaComposition, PojoSettings> containerGetter() {
return Generator.<DiscriminatableJavaComposition, PojoSettings>emptyGen()
.appendList(
technicalGetter(),
container -> container.getComposition().getPojosAsTechnicalMembers(),
newLine());
}

public static Generator<AnyOfContainer, PojoSettings> anyOfContainerGetter() {
return Generator.<AnyOfContainer, PojoSettings>emptyGen()
.appendList(
technicalGetter(),
container -> container.getComposition().getPojosAsTechnicalMembers(),
DiscriminatableJavaComposition::getPojosAsTechnicalMembers,
newLine());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
import ch.bluecare.commons.data.Pair;
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.java.model.pojo.auxiliaryy.AnyOfContainer;
import com.github.muehmar.gradle.openapi.generator.java.model.pojo.auxiliaryy.OneOfContainer;
import com.github.muehmar.gradle.openapi.generator.java.model.pojo.auxiliary.MultiPojoContainer;
import com.github.muehmar.gradle.openapi.generator.java.model.pojo.auxiliary.SinglePojoContainer;
import com.github.muehmar.gradle.openapi.generator.settings.PojoSettings;
import io.github.muehmar.codegenerator.Generator;
import io.github.muehmar.codegenerator.java.JavaDocGenerator;
Expand All @@ -21,13 +21,13 @@
public class FactoryMethodGenerator {
private FactoryMethodGenerator() {}

public static Generator<OneOfContainer, PojoSettings> oneOfFromFactoryMethods() {
return Generator.<OneOfContainer, PojoSettings>emptyGen()
public static Generator<SinglePojoContainer, PojoSettings> oneOfFromFactoryMethods() {
return Generator.<SinglePojoContainer, PojoSettings>emptyGen()
.appendList(fromFactoryMethod(), ContainerAndPojo::fromOneOfContainer, newLine());
}

public static Generator<AnyOfContainer, PojoSettings> anyOfFromFactoryMethods() {
return Generator.<AnyOfContainer, PojoSettings>emptyGen()
public static Generator<MultiPojoContainer, PojoSettings> anyOfFromFactoryMethods() {
return Generator.<MultiPojoContainer, PojoSettings>emptyGen()
.appendList(fromFactoryMethod(), ContainerAndPojo::fromAnyOfContainer, newLine());
}

Expand Down Expand Up @@ -65,7 +65,7 @@ private static class ContainerAndPojo {
JavaObjectPojo pojo;
int pojoIdx;

static PList<ContainerAndPojo> fromOneOfContainer(OneOfContainer container) {
static PList<ContainerAndPojo> fromOneOfContainer(SinglePojoContainer container) {
return container
.getComposition()
.getPojos()
Expand All @@ -80,7 +80,7 @@ static PList<ContainerAndPojo> fromOneOfContainer(OneOfContainer container) {
.toPList();
}

static PList<ContainerAndPojo> fromAnyOfContainer(AnyOfContainer container) {
static PList<ContainerAndPojo> fromAnyOfContainer(MultiPojoContainer container) {
return container
.getComposition()
.getPojos()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,28 +1,26 @@
package com.github.muehmar.gradle.openapi.generator.java.generator.pojo.compositioncontainer.anyof;
package com.github.muehmar.gradle.openapi.generator.java.generator.pojo.compositioncontainer.multipojo;

import static com.github.muehmar.gradle.openapi.generator.java.generator.pojo.MemberGenerator.memberGenerator;
import static com.github.muehmar.gradle.openapi.generator.java.generator.pojo.compositioncontainer.ContainerGetter.anyOfContainerGetter;
import static com.github.muehmar.gradle.openapi.generator.java.generator.pojo.compositioncontainer.ContainerGetter.containerGetter;
import static com.github.muehmar.gradle.openapi.generator.java.generator.pojo.compositioncontainer.FactoryMethodGenerator.anyOfFromFactoryMethods;
import static com.github.muehmar.gradle.openapi.generator.java.generator.pojo.compositioncontainer.anyof.AnyOfMergeMethodGenerator.anyOfMergeMethodGenerator;
import static com.github.muehmar.gradle.openapi.generator.java.generator.pojo.compositioncontainer.anyof.AnyOfWitherMethodsGenerator.anyOfWitherMethodsGenerator;
import static com.github.muehmar.gradle.openapi.generator.java.generator.shared.misc.EqualsGenerator.equalsMethod;
import static com.github.muehmar.gradle.openapi.generator.java.generator.shared.misc.HashCodeGenerator.hashCodeMethod;
import static com.github.muehmar.gradle.openapi.generator.java.generator.shared.misc.PojoConstructorGenerator.pojoConstructorGenerator;
import static com.github.muehmar.gradle.openapi.generator.java.generator.shared.misc.ToStringGenerator.toStringMethod;
import static io.github.muehmar.codegenerator.java.JavaModifier.PUBLIC;

import com.github.muehmar.gradle.openapi.generator.java.generator.shared.PackageGenerator;
import com.github.muehmar.gradle.openapi.generator.java.model.pojo.auxiliaryy.AnyOfContainer;
import com.github.muehmar.gradle.openapi.generator.java.model.pojo.auxiliary.MultiPojoContainer;
import com.github.muehmar.gradle.openapi.generator.settings.PojoSettings;
import io.github.muehmar.codegenerator.Generator;
import io.github.muehmar.codegenerator.java.ClassGenBuilder;
import io.github.muehmar.codegenerator.java.JavaDocGenerator;

public class AnyOfContainerGenerator {
private AnyOfContainerGenerator() {}
public class MultiPojoContainerGenerator {
private MultiPojoContainerGenerator() {}

public static Generator<AnyOfContainer, PojoSettings> anyOfContainerGenerator() {
return ClassGenBuilder.<AnyOfContainer, PojoSettings>create()
public static Generator<MultiPojoContainer, PojoSettings> multiPojoContainerGenerator() {
return ClassGenBuilder.<MultiPojoContainer, PojoSettings>create()
.clazz()
.topLevel()
.packageGen(new PackageGenerator<>())
Expand All @@ -36,7 +34,7 @@ public static Generator<AnyOfContainer, PojoSettings> anyOfContainerGenerator()
.build();
}

private static Generator<AnyOfContainer, PojoSettings> containerJavaDoc() {
private static Generator<MultiPojoContainer, PojoSettings> containerJavaDoc() {
return JavaDocGenerator.javaDoc(
(c, s) -> {
final String pojoLinks =
Expand All @@ -46,32 +44,36 @@ private static Generator<AnyOfContainer, PojoSettings> containerJavaDoc() {
.toPList()
.mkString(", ");
return String.format(
"This is a container for the any of composition of {@link %s}. It can hold any instance of %s. "
"This is a container for the %s composition of {@link %s}. It can hold any instance of %s. "
+ "Use the corresponding from-factory methods to create an instance for each of the objects "
+ "and then merge all instances to one using {@link %s#merge}. The resulting instance can be "
+ "used in the builder of {@link %s}.",
c.getPojoName(), pojoLinks, c.getContainerName(), c.getPojoName());
c.getComposition().getType().getName().startLowerCase(),
c.getPojoName(),
pojoLinks,
c.getContainerName(),
c.getPojoName());
});
}

private static Generator<AnyOfContainer, PojoSettings> content() {
return Generator.<AnyOfContainer, PojoSettings>emptyGen()
.append(memberGenerator(), AnyOfContainer::memberContent)
private static Generator<MultiPojoContainer, PojoSettings> content() {
return Generator.<MultiPojoContainer, PojoSettings>emptyGen()
.append(memberGenerator(), MultiPojoContainer::memberContent)
.appendSingleBlankLine()
.append(pojoConstructorGenerator(), AnyOfContainer::constructorContent)
.append(pojoConstructorGenerator(), MultiPojoContainer::constructorContent)
.appendSingleBlankLine()
.append(anyOfFromFactoryMethods())
.appendSingleBlankLine()
.append(anyOfContainerGetter())
.append(containerGetter(), MultiPojoContainer::getComposition)
.appendSingleBlankLine()
.append(anyOfWitherMethodsGenerator())
.append(MultiPojoWitherMethodsGenerator.multiPojoWitherMethodsGenerator())
.appendSingleBlankLine()
.append(anyOfMergeMethodGenerator())
.append(MultiPojoMergeMethodGenerator.multiPojoMergeMethodGenerator())
.appendSingleBlankLine()
.append(equalsMethod(), AnyOfContainer::getEqualsContent)
.append(equalsMethod(), MultiPojoContainer::getEqualsContent)
.appendSingleBlankLine()
.append(hashCodeMethod(), AnyOfContainer::getHashCodeContent)
.append(hashCodeMethod(), MultiPojoContainer::getHashCodeContent)
.appendSingleBlankLine()
.append(toStringMethod(), AnyOfContainer::getToStringContent);
.append(toStringMethod(), MultiPojoContainer::getToStringContent);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.github.muehmar.gradle.openapi.generator.java.generator.pojo.compositioncontainer.anyof;
package com.github.muehmar.gradle.openapi.generator.java.generator.pojo.compositioncontainer.multipojo;

import static com.github.muehmar.gradle.openapi.util.Functions.firstAndTail;
import static io.github.muehmar.codegenerator.Generator.constant;
Expand All @@ -7,7 +7,7 @@
import ch.bluecare.commons.data.NonEmptyList;
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.java.model.pojo.auxiliaryy.AnyOfContainer;
import com.github.muehmar.gradle.openapi.generator.java.model.pojo.auxiliary.MultiPojoContainer;
import com.github.muehmar.gradle.openapi.generator.settings.PojoSettings;
import io.github.muehmar.codegenerator.Generator;
import io.github.muehmar.codegenerator.java.JavaDocGenerator;
Expand All @@ -16,12 +16,12 @@
import io.github.muehmar.codegenerator.java.MethodGenBuilder;
import lombok.Value;

public class AnyOfMergeMethodGenerator {
private AnyOfMergeMethodGenerator() {}
public class MultiPojoMergeMethodGenerator {
private MultiPojoMergeMethodGenerator() {}

public static Generator<AnyOfContainer, PojoSettings> anyOfMergeMethodGenerator() {
final MethodGen<AnyOfContainer, PojoSettings> method =
MethodGenBuilder.<AnyOfContainer, PojoSettings>create()
public static Generator<MultiPojoContainer, PojoSettings> multiPojoMergeMethodGenerator() {
final MethodGen<MultiPojoContainer, PojoSettings> method =
MethodGenBuilder.<MultiPojoContainer, PojoSettings>create()
.modifiers(PUBLIC)
.noGenericTypes()
.returnType(container -> container.getContainerName().asString())
Expand All @@ -34,7 +34,7 @@ public static Generator<AnyOfContainer, PojoSettings> anyOfMergeMethodGenerator(
return javaDoc().append(method);
}

private static Generator<AnyOfContainer, PojoSettings> javaDoc() {
private static Generator<MultiPojoContainer, PojoSettings> javaDoc() {
return JavaDocGenerator.javaDoc(
(c, s) ->
String.format(
Expand All @@ -43,8 +43,8 @@ private static Generator<AnyOfContainer, PojoSettings> javaDoc() {
c.getContainerName()));
}

private static Generator<AnyOfContainer, PojoSettings> methodContent() {
return Generator.<AnyOfContainer, PojoSettings>emptyGen()
private static Generator<MultiPojoContainer, PojoSettings> methodContent() {
return Generator.<MultiPojoContainer, PojoSettings>emptyGen()
.append((c, s, w) -> w.println("return new %s(", c.getContainerName()))
.appendList(singleMemberSelection().indent(1), AnyOfPojo::fromContainer)
.append(constant(");"));
Expand Down Expand Up @@ -72,7 +72,7 @@ String commaOrNothing() {
return isLast ? "" : ",";
}

public static NonEmptyList<AnyOfPojo> fromContainer(AnyOfContainer container) {
public static NonEmptyList<AnyOfPojo> fromContainer(MultiPojoContainer container) {
return container
.getComposition()
.getPojos()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package com.github.muehmar.gradle.openapi.generator.java.generator.pojo.compositioncontainer.anyof;
package com.github.muehmar.gradle.openapi.generator.java.generator.pojo.compositioncontainer.multipojo;

import static io.github.muehmar.codegenerator.Generator.newLine;
import static io.github.muehmar.codegenerator.java.JavaModifier.PUBLIC;

import ch.bluecare.commons.data.PList;
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.java.model.pojo.auxiliaryy.AnyOfContainer;
import com.github.muehmar.gradle.openapi.generator.java.model.pojo.auxiliary.MultiPojoContainer;
import com.github.muehmar.gradle.openapi.generator.settings.PojoSettings;
import io.github.muehmar.codegenerator.Generator;
import io.github.muehmar.codegenerator.java.JavaDocGenerator;
Expand All @@ -15,12 +15,12 @@
import io.github.muehmar.codegenerator.java.MethodGenBuilder;
import lombok.Value;

public class AnyOfWitherMethodsGenerator {
private AnyOfWitherMethodsGenerator() {}
public class MultiPojoWitherMethodsGenerator {
private MultiPojoWitherMethodsGenerator() {}

public static Generator<AnyOfContainer, PojoSettings> anyOfWitherMethodsGenerator() {
return Generator.<AnyOfContainer, PojoSettings>emptyGen()
.appendList(witherMethod(), ContainerAndPojo::fromAnyOfContainer, newLine());
public static Generator<MultiPojoContainer, PojoSettings> multiPojoWitherMethodsGenerator() {
return Generator.<MultiPojoContainer, PojoSettings>emptyGen()
.appendList(witherMethod(), ContainerAndPojo::fromMultiPojoContainer, newLine());
}

private static Generator<ContainerAndPojo, PojoSettings> witherMethod() {
Expand Down Expand Up @@ -61,7 +61,7 @@ private static class ContainerAndPojo {
JavaObjectPojo pojo;
int pojoIdx;

static PList<ContainerAndPojo> fromAnyOfContainer(AnyOfContainer container) {
static PList<ContainerAndPojo> fromMultiPojoContainer(MultiPojoContainer container) {
return container
.getComposition()
.getPojos()
Expand Down
Loading

0 comments on commit 566a6cb

Please sign in to comment.