diff --git a/pom.xml b/pom.xml index d5fb2a4..c6b418b 100644 --- a/pom.xml +++ b/pom.xml @@ -167,8 +167,9 @@ - it.cavallium - data-generator-runtime + it.cavallium + data-generator-runtime + 1.0.62 @@ -255,11 +256,6 @@ - - it.cavallium - data-generator-runtime - 1.0.54 - \ No newline at end of file diff --git a/src/main/java/it/cavallium/data/generator/SourcesGenerator.java b/src/main/java/it/cavallium/data/generator/SourcesGenerator.java index 4cde490..c20df15 100644 --- a/src/main/java/it/cavallium/data/generator/SourcesGenerator.java +++ b/src/main/java/it/cavallium/data/generator/SourcesGenerator.java @@ -875,6 +875,7 @@ public class SourcesGenerator { "INullableIType" )); nullableTypeClass.addSuperinterface(IGenericNullable.class); + nullableTypeClass.addSuperinterface(ParameterizedTypeName.get(ClassName.get( "it.cavallium.data.generator", "TypedNullable"), typeType)); var nullInstance = FieldSpec.builder(nullableTypeType, "NULL", Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL); nullInstance.initializer("new $T(null)", nullableTypeType); nullableTypeClass.addField(nullInstance.build()); @@ -915,12 +916,14 @@ public class SourcesGenerator { var isEmptyMethod = MethodSpec.methodBuilder("isEmpty"); isEmptyMethod.addModifiers(Modifier.PUBLIC); isEmptyMethod.addModifiers(Modifier.FINAL); + isEmptyMethod.addAnnotation(Override.class); isEmptyMethod.returns(TypeName.BOOLEAN); isEmptyMethod.addStatement("return value == null"); nullableTypeClass.addMethod(isEmptyMethod.build()); var isPresentMethod = MethodSpec.methodBuilder("isPresent"); isPresentMethod.addModifiers(Modifier.PUBLIC); isPresentMethod.addModifiers(Modifier.FINAL); + isPresentMethod.addAnnotation(Override.class); isPresentMethod.returns(TypeName.BOOLEAN); isPresentMethod.addStatement("return value != null"); nullableTypeClass.addMethod(isPresentMethod.build()); @@ -928,6 +931,7 @@ public class SourcesGenerator { getMethod.addModifiers(Modifier.PUBLIC); getMethod.addModifiers(Modifier.FINAL); getMethod.addException(NullPointerException.class); + getMethod.addAnnotation(Override.class); getMethod.addAnnotation(NotNull.class); getMethod.returns(typeType); getMethod.beginControlFlow("if (value == null)"); @@ -943,7 +947,7 @@ public class SourcesGenerator { .build()); orElseMethod.addModifiers(Modifier.PUBLIC); orElseMethod.addModifiers(Modifier.FINAL); - orElseMethod.addException(NullPointerException.class); + orElseMethod.addAnnotation(Override.class); orElseMethod.addAnnotation(NotNull.class); orElseMethod.returns(typeType); orElseMethod.beginControlFlow("if (value == null)"); @@ -952,13 +956,68 @@ public class SourcesGenerator { orElseMethod.addStatement("return value"); orElseMethod.endControlFlow(); nullableTypeClass.addMethod(orElseMethod.build()); + var orMethodGeneric = MethodSpec.methodBuilder("or"); + orMethodGeneric.addParameter(ParameterSpec + .builder(ParameterizedTypeName.get( + ClassName.get("it.cavallium.data.generator", "NativeTypedNullable"), + WildcardTypeName.subtypeOf(typeType)), "fallback") + .addAnnotation(NotNull.class) + .build()); + orMethodGeneric.addModifiers(Modifier.PUBLIC); + orMethodGeneric.addModifiers(Modifier.FINAL); + orMethodGeneric.addAnnotation(Override.class); + orMethodGeneric.addAnnotation(NotNull.class); + orMethodGeneric.returns(nullableClassType); + orMethodGeneric.beginControlFlow("if (value == null)"); + orMethodGeneric.beginControlFlow("if (fallback.getClass() == $T.class)", nullableClassType); + orMethodGeneric.addStatement("return ($T) fallback", nullableClassType); + orMethodGeneric.nextControlFlow("else"); + orMethodGeneric.addStatement("return ofNullable(fallback.getNullable())"); + orMethodGeneric.endControlFlow(); + orMethodGeneric.nextControlFlow("else"); + orMethodGeneric.addStatement("return this"); + orMethodGeneric.endControlFlow(); + nullableTypeClass.addMethod(orMethodGeneric.build()); + var orMethodSpecific = MethodSpec.methodBuilder("or"); + orMethodSpecific.addParameter(ParameterSpec + .builder(nullableTypeType, "fallback") + .addAnnotation(NotNull.class) + .build()); + orMethodSpecific.addModifiers(Modifier.PUBLIC); + orMethodSpecific.addModifiers(Modifier.FINAL); + orMethodSpecific.addAnnotation(Override.class); + orMethodSpecific.addAnnotation(NotNull.class); + orMethodSpecific.returns(nullableClassType); + orMethodSpecific.beginControlFlow("if (value == null)"); + orMethodSpecific.addStatement("return fallback"); + orMethodSpecific.nextControlFlow("else"); + orMethodSpecific.addStatement("return this"); + orMethodSpecific.endControlFlow(); + nullableTypeClass.addMethod(orMethodSpecific.build()); var getNullableMethod = MethodSpec.methodBuilder("getNullable"); getNullableMethod.addModifiers(Modifier.PUBLIC); getNullableMethod.addModifiers(Modifier.FINAL); + getNullableMethod.addAnnotation(Override.class); getNullableMethod.addAnnotation(Nullable.class); getNullableMethod.returns(typeType); getNullableMethod.addStatement("return value"); nullableTypeClass.addMethod(getNullableMethod.build()); + var getNullableParam = MethodSpec.methodBuilder("getNullable"); + getNullableParam.addParameter(ParameterSpec + .builder(typeType, "defaultValue") + .addAnnotation(Nullable.class) + .build()); + getNullableParam.addModifiers(Modifier.PUBLIC); + getNullableParam.addModifiers(Modifier.FINAL); + getNullableParam.addAnnotation(Override.class); + getNullableParam.addAnnotation(Nullable.class); + getNullableParam.returns(typeType); + getNullableParam.beginControlFlow("if (value == null)"); + getNullableParam.addStatement("return defaultValue"); + getNullableParam.nextControlFlow("else"); + getNullableParam.addStatement("return value"); + getNullableParam.endControlFlow(); + nullableTypeClass.addMethod(getNullableParam.build()); var getDollarNullableMethod = MethodSpec.methodBuilder("$getNullable"); getDollarNullableMethod.addModifiers(Modifier.PUBLIC); getDollarNullableMethod.addModifiers(Modifier.FINAL);