diff --git a/pom.xml b/pom.xml index 08be4dc..06ad918 100644 --- a/pom.xml +++ b/pom.xml @@ -32,6 +32,7 @@ 3.2.1 2.5.3 3.2.0 + 3.0.0-M5 src/etc/header.txt @@ -153,6 +154,12 @@ + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin-version} + + org.apache.maven.plugins maven-compiler-plugin @@ -352,6 +359,11 @@ org.apache.maven.plugins maven-release-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + diff --git a/record-builder-processor/src/main/java/io/soabase/recordbuilder/processor/CollectionBuilderUtils.java b/record-builder-processor/src/main/java/io/soabase/recordbuilder/processor/CollectionBuilderUtils.java index 5dad59d..8bd28fd 100644 --- a/record-builder-processor/src/main/java/io/soabase/recordbuilder/processor/CollectionBuilderUtils.java +++ b/record-builder-processor/src/main/java/io/soabase/recordbuilder/processor/CollectionBuilderUtils.java @@ -109,6 +109,10 @@ class CollectionBuilderUtils { return Optional.empty(); } + boolean isImmutableCollection(RecordClassType component) { + return useImmutableCollections && (isList(component) || isMap(component) || isSet(component) || component.rawTypeName().equals(collectionType)); + } + boolean isList(RecordClassType component) { return component.rawTypeName().equals(listType); } diff --git a/record-builder-processor/src/main/java/io/soabase/recordbuilder/processor/InternalRecordBuilderProcessor.java b/record-builder-processor/src/main/java/io/soabase/recordbuilder/processor/InternalRecordBuilderProcessor.java index aff7b09..6ccd120 100644 --- a/record-builder-processor/src/main/java/io/soabase/recordbuilder/processor/InternalRecordBuilderProcessor.java +++ b/record-builder-processor/src/main/java/io/soabase/recordbuilder/processor/InternalRecordBuilderProcessor.java @@ -371,8 +371,10 @@ class InternalRecordBuilderProcessor { private void addNullCheckCodeBlock(CodeBlock.Builder builder, int index) { if (metaData.interpretNotNulls()) { var component = recordComponents.get(index); - if (!component.typeName().isPrimitive() && isNullAnnotated(component)) { - builder.addStatement("$T.requireNonNull($L, $S)", Objects.class, component.name(), component.name() + " is required"); + if (!collectionBuilderUtils.isImmutableCollection(component)) { + if (!component.typeName().isPrimitive() && isNullAnnotated(component)) { + builder.addStatement("$T.requireNonNull($L, $S)", Objects.class, component.name(), component.name() + " is required"); + } } } } @@ -521,6 +523,16 @@ class InternalRecordBuilderProcessor { */ var codeBuilder = CodeBlock.builder(); + + IntStream.range(0, recordComponents.size()).forEach(index -> { + var recordComponent = recordComponents.get(index); + if (collectionBuilderUtils.isImmutableCollection(recordComponent)) { + codeBuilder.add("$[$L = ", recordComponent.name()); + collectionBuilderUtils.add(codeBuilder, recordComponents.get(index)); + codeBuilder.add(";\n$]"); + } + }); + addNullCheckCodeBlock(codeBuilder); codeBuilder.add("$[return "); if (metaData.useValidationApi()) { @@ -531,7 +543,7 @@ class InternalRecordBuilderProcessor { if (index > 0) { codeBuilder.add(", "); } - collectionBuilderUtils.add(codeBuilder, recordComponents.get(index)); + codeBuilder.add("$L", recordComponents.get(index).name()); }); codeBuilder.add(")"); if (metaData.useValidationApi()) { diff --git a/record-builder-test/src/main/java/io/soabase/recordbuilder/test/FullRecord.java b/record-builder-test/src/main/java/io/soabase/recordbuilder/test/FullRecord.java index a46b5eb..70b75ff 100644 --- a/record-builder-test/src/main/java/io/soabase/recordbuilder/test/FullRecord.java +++ b/record-builder-test/src/main/java/io/soabase/recordbuilder/test/FullRecord.java @@ -22,5 +22,5 @@ import java.util.List; import java.util.Map; @RecordBuilderFull -public record FullRecord(@NotNull List numbers, @NotNull Map fullRecords) { +public record FullRecord(@NotNull List numbers, @NotNull Map fullRecords, @NotNull String justAString) { } diff --git a/record-builder-test/src/main/java/io/soabase/recordbuilder/test/RequiredRecord.java b/record-builder-test/src/main/java/io/soabase/recordbuilder/test/RequiredRecord.java index 0e622bb..317e220 100644 --- a/record-builder-test/src/main/java/io/soabase/recordbuilder/test/RequiredRecord.java +++ b/record-builder-test/src/main/java/io/soabase/recordbuilder/test/RequiredRecord.java @@ -18,8 +18,9 @@ package io.soabase.recordbuilder.test; import io.soabase.recordbuilder.core.RecordBuilder; import javax.validation.constraints.NotNull; +import java.util.List; @RecordBuilder.Options(interpretNotNulls = true) @RecordBuilder -public record RequiredRecord(@NotNull String hey, @NotNull int i) implements RequiredRecordBuilder.With { +public record RequiredRecord(@NotNull String hey, @NotNull int i, @NotNull List l) implements RequiredRecordBuilder.With { } diff --git a/record-builder-test/src/test/java/io/soabase/recordbuilder/test/TestRecordBuilderFull.java b/record-builder-test/src/test/java/io/soabase/recordbuilder/test/TestRecordBuilderFull.java index b0a7ec3..afbccb0 100644 --- a/record-builder-test/src/test/java/io/soabase/recordbuilder/test/TestRecordBuilderFull.java +++ b/record-builder-test/src/test/java/io/soabase/recordbuilder/test/TestRecordBuilderFull.java @@ -20,11 +20,15 @@ import org.junit.jupiter.api.Test; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; +import java.util.Map; class TestRecordBuilderFull { @Test void testNonNull() { - Assertions.assertThrows(NullPointerException.class, () -> FullRecordBuilder.builder().build()); + var record = FullRecordBuilder.builder().justAString("").build(); + Assertions.assertEquals(List.of(), record.numbers()); + Assertions.assertEquals(Map.of(), record.fullRecords()); } @Test @@ -32,6 +36,7 @@ class TestRecordBuilderFull { var record = FullRecordBuilder.builder() .fullRecords(new HashMap<>()) .numbers(new ArrayList<>()) + .justAString("") .build(); Assertions.assertThrows(UnsupportedOperationException.class, () -> record.fullRecords().put(1, record)); Assertions.assertThrows(UnsupportedOperationException.class, () -> record.numbers().add(1)); diff --git a/record-builder-test/src/test/java/io/soabase/recordbuilder/test/TestValidation.java b/record-builder-test/src/test/java/io/soabase/recordbuilder/test/TestValidation.java index 76c46b0..174d3d8 100644 --- a/record-builder-test/src/test/java/io/soabase/recordbuilder/test/TestValidation.java +++ b/record-builder-test/src/test/java/io/soabase/recordbuilder/test/TestValidation.java @@ -19,6 +19,7 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import javax.validation.ValidationException; +import java.util.List; class TestValidation { @Test @@ -33,7 +34,7 @@ class TestValidation { @Test void testNotNullsWithNewProperty() { - var valid = RequiredRecordBuilder.builder().hey("hey").i(1).build(); + var valid = RequiredRecordBuilder.builder().hey("hey").i(1).l(List.of()).build(); Assertions.assertThrows(NullPointerException.class, () -> valid.withHey(null)); }