From af4671f392db595adcf9c11b40fabe694ac95864 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Oct 2020 11:17:52 +0000 Subject: [PATCH 1/3] Bump junit from 4.12 to 4.13.1 Bumps [junit](https://github.com/junit-team/junit4) from 4.12 to 4.13.1. - [Release notes](https://github.com/junit-team/junit4/releases) - [Changelog](https://github.com/junit-team/junit4/blob/main/doc/ReleaseNotes4.12.md) - [Commits](https://github.com/junit-team/junit4/compare/r4.12...r4.13.1) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 19ee733..7d90fc0 100644 --- a/pom.xml +++ b/pom.xml @@ -150,7 +150,7 @@ junit junit - 4.12 + 4.13.1 test From c40a1dc4947d908b202f3f044b4352375ea235a8 Mon Sep 17 00:00:00 2001 From: "daan.vandenheuvel" Date: Fri, 4 Feb 2022 14:25:49 +0100 Subject: [PATCH 2/3] Add copy builder to template and utility methods to get the getters or setters from a method --- pom.xml | 2 +- .../java/templateInput/ClassContainer.java | 41 +++++++++++++++++++ .../resources/templates/innerBuilder.javat | 12 ++++++ .../templates/innerBuilderTest.javat | 11 ++++- .../verify-innerBuilder.java | 9 ++++ .../verify-innerBuilderTest.java | 9 +++- 6 files changed, 81 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 7d90fc0..a3ea191 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.github.daanvdh.javaforger JavaForger - 2.0.2 + 2.0.3 jar JavaForger diff --git a/src/main/java/templateInput/ClassContainer.java b/src/main/java/templateInput/ClassContainer.java index e5d57d0..0bea061 100644 --- a/src/main/java/templateInput/ClassContainer.java +++ b/src/main/java/templateInput/ClassContainer.java @@ -18,10 +18,15 @@ package templateInput; import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import templateInput.definition.ClassDefinition; import templateInput.definition.MethodDefinition; +import templateInput.definition.TypeDefinition; import templateInput.definition.VariableDefinition; /** @@ -62,6 +67,14 @@ public void setMethods(List methods) { this.methods = methods; } + public List getGetters() { + return methods.stream().filter(this::isGetter).collect(Collectors.toList()); + } + + public List getSetters() { + return methods.stream().filter(this::isSetter).collect(Collectors.toList()); + } + public List getConstructors() { return constructors; } @@ -70,4 +83,32 @@ public void setConstructors(List constructors) { this.constructors = constructors; } + public List getFieldImports() { + return getTypeImports(fields); + } + + public List getMethodImports() { + return getTypeImports(methods); + } + + public Set getImports() { + Set set = new HashSet<>(); + set.addAll(getMethodImports()); + set.addAll(getFieldImports()); + return set; + } + + private List getTypeImports(final List methods2) { + return methods2.stream().map(TypeDefinition::getTypeImports).flatMap(Collection::stream).distinct().collect(Collectors.toList()); + } + + private boolean isGetter(MethodDefinition m) { + String n = m.getName().toString(); + return n.startsWith("get") || n.startsWith("is"); + } + + private boolean isSetter(MethodDefinition m) { + return m.getName().toString().startsWith("set"); + } + } diff --git a/src/main/resources/templates/innerBuilder.javat b/src/main/resources/templates/innerBuilder.javat index 1df1846..4801764 100644 --- a/src/main/resources/templates/innerBuilder.javat +++ b/src/main/resources/templates/innerBuilder.javat @@ -30,6 +30,18 @@ private Builder() { // Builder should only be constructed via the parent class } + + public Builder copy(${class.name} original) { + <#list fields as field> + <#if field.collection > + this.${field.name}.clear(); + this.${field.name}.addAll(original.get${field.name.upperFirst}()); + <#else> + this.${field.name} = original.get${field.name.upperFirst}(); + + + return this; + } <#list fields as field> public Builder ${field.name}(${field.type} ${field.name}) { diff --git a/src/main/resources/templates/innerBuilderTest.javat b/src/main/resources/templates/innerBuilderTest.javat index 86110b1..6bcb08e 100644 --- a/src/main/resources/templates/innerBuilderTest.javat +++ b/src/main/resources/templates/innerBuilderTest.javat @@ -25,7 +25,16 @@ import org.junit.Test; @Test public void test${class.name}_maximum() { ${class.name} ${class.name.lowerFirst} = createAndFillBuilder().build(); - + assertMaximum(${class.name.lowerFirst}); + } + + @Test + public void test${class.name}_Copy() { + ${class.name} ${class.name.lowerFirst} = ${class.name}.builder().copy(createAndFillBuilder().build()).build(); + assertMaximum(${class.name.lowerFirst}); + } + + private void assertMaximum(${class.name} ${class.name.lowerFirst}) { <#list fields as field> <#if field.type == "boolean"> Assert.assertTrue("Unexpected ${field.name}", ${class.name.lowerFirst}.${field.getter}()); diff --git a/src/test/resources/templateTestOutcomes/verify-innerBuilder.java b/src/test/resources/templateTestOutcomes/verify-innerBuilder.java index 7b410b1..113ba34 100644 --- a/src/test/resources/templateTestOutcomes/verify-innerBuilder.java +++ b/src/test/resources/templateTestOutcomes/verify-innerBuilder.java @@ -91,6 +91,15 @@ public static final class Builder { private Builder() { // Builder should only be constructed via the parent class } + + public Builder copy(ClassWithEverything original) { + this.prod.clear(); + this.prod.addAll(original.getProd()); + this.i = original.getI(); + this.c = original.getC(); + this.s = original.getS(); + return this; + } public Builder prod(Set prod) { this.prod.clear(); diff --git a/src/test/resources/templateTestOutcomes/verify-innerBuilderTest.java b/src/test/resources/templateTestOutcomes/verify-innerBuilderTest.java index 79bd509..04800dd 100644 --- a/src/test/resources/templateTestOutcomes/verify-innerBuilderTest.java +++ b/src/test/resources/templateTestOutcomes/verify-innerBuilderTest.java @@ -45,7 +45,14 @@ public void testClassWithEverything_minimum() { @Test public void testClassWithEverything_maximum() { ClassWithEverything classWithEverything = createAndFillBuilder().build(); - + assertMaximum(classWithEverything); + } + @Test + public void testClassWithEverything_Copy() { + ClassWithEverything classWithEverything = ClassWithEverything.builder().copy(createAndFillBuilder().build()).build(); + assertMaximum(classWithEverything); + } + private void assertMaximum(ClassWithEverything classWithEverything) { Assert.assertEquals("Unexpected prod", PROD, classWithEverything.getProd()); Assert.assertEquals("Unexpected i", I, classWithEverything.getI()); Assert.assertEquals("Unexpected c", C, classWithEverything.getC()); From 953316f4d0039eb5633aa5e6fc5bde7363d6f54f Mon Sep 17 00:00:00 2001 From: Daan van den Heuvel Date: Thu, 10 Feb 2022 17:28:14 +0100 Subject: [PATCH 3/3] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4d8c279..f4a14a4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # JavaForger [![Build Status](https://travis-ci.com/daanvdh/JavaForger.svg?branch=master)](https://travis-ci.com/daanvdh/JavaForger) +[![Join the chat at https://gitter.im/JavaForger/community](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/JavaForger/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) JavaForger can create source code from templates using existing java classes as input. It reads field, methods and other class data to fill in variables in a template.