Skip to content

Commit b62b036

Browse files
committed
CAUSEWAY-4036: conditionally skip fractional facet install
based on whether value-type is integer only
1 parent ec50542 commit b62b036

6 files changed

Lines changed: 42 additions & 23 deletions

File tree

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/commons/ClassUtil.java

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,15 @@
1818
*/
1919
package org.apache.causeway.core.metamodel.commons;
2020

21+
import java.math.BigInteger;
2122
import java.util.Map;
2223

24+
import org.jspecify.annotations.NonNull;
25+
2326
import org.apache.causeway.commons.internal.base._Strings;
2427
import org.apache.causeway.commons.internal.context._Context;
2528
import org.apache.causeway.commons.internal.exceptions._Exceptions;
2629

27-
import org.jspecify.annotations.NonNull;
2830
import lombok.experimental.UtilityClass;
2931

3032
@UtilityClass
@@ -103,9 +105,8 @@ public Class<?> getBuiltIn(final String name) {
103105
* specified param type, or has a no-arg constructor.
104106
*/
105107
public Class<?> implementingClassOrNull(final String classCandidateName, final Class<?> requiredClass, final Class<?> constructorParamType) {
106-
if (classCandidateName == null) {
108+
if (classCandidateName == null)
107109
return null;
108-
}
109110
Class<?> classCandidate = null;
110111
try {
111112
classCandidate = _Context.loadClass(classCandidateName);
@@ -117,19 +118,17 @@ public Class<?> implementingClassOrNull(final String classCandidateName, final C
117118

118119
public boolean directlyImplements(final Class<?> cls, final Class<?> interfaceType) {
119120
for (final Class<?> directlyImplementedInterface : cls.getInterfaces()) {
120-
if (directlyImplementedInterface == interfaceType) {
121+
if (directlyImplementedInterface == interfaceType)
121122
return true;
122-
}
123123
}
124124
return false;
125125
}
126126

127127
public Class<?> forNameElseFail(final String fullName) {
128128
_Strings.requireNonEmpty(fullName, "Full Name");
129129
final Class<?> builtIn = ClassUtil.getBuiltIn(fullName);
130-
if (builtIn != null) {
130+
if (builtIn != null)
131131
return builtIn;
132-
}
133132
try {
134133
return _Context.loadClass(fullName);
135134
} catch (final ClassNotFoundException e) {
@@ -138,13 +137,11 @@ public Class<?> forNameElseFail(final String fullName) {
138137
}
139138

140139
public Class<?> forNameElseNull(final String fullName) {
141-
if (_Strings.isNullOrEmpty(fullName)) {
140+
if (_Strings.isNullOrEmpty(fullName))
142141
return null;
143-
}
144142
var primitiveClass = primitiveByName.get(fullName);
145-
if(primitiveClass!=null) {
143+
if(primitiveClass!=null)
146144
return primitiveClass;
147-
}
148145
try {
149146
return _Context.loadClass(fullName);
150147
} catch (final ClassNotFoundException e) {
@@ -160,10 +157,21 @@ public Class<?> forNameElseNull(final String fullName) {
160157
*/
161158
public String getCanonicalName_friendlyToInnerClasses(final @NonNull Class<?> cls) {
162159
var name = cls.getCanonicalName();
163-
if(name==null) {
160+
if(name==null)
164161
return cls.getName().replace("$", ".$").replace("..", ".");
165-
}
166162
return name;
167163
}
168164

165+
public boolean isJavaBuiltInInteger(final Class<?> cls) {
166+
return cls.equals(int.class)
167+
|| cls.equals(Integer.class)
168+
|| cls.equals(long.class)
169+
|| cls.equals(Long.class)
170+
|| cls.equals(byte.class)
171+
|| cls.equals(Byte.class)
172+
|| cls.equals(short.class)
173+
|| cls.equals(Short.class)
174+
|| cls.equals(BigInteger.class);
175+
}
176+
169177
}

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/objectvalue/digits/MaxFractionalDigitsFacet.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ default void visitAttributes(final BiConsumer<String, Object> visitor) {
6767
/**
6868
* The stronger constraint wins. If equal, first argument wins over second.
6969
*/
70-
public static Optional<MaxFractionalDigitsFacet> strongestConstraint(
70+
static Optional<MaxFractionalDigitsFacet> strongestConstraint(
7171
final Optional<MaxFractionalDigitsFacet> a,
7272
final Optional<MaxFractionalDigitsFacet> b) {
7373
if(b.isEmpty())

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/value/semantics/ValueSemanticsAnnotationFacetFactory.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import jakarta.validation.constraints.Digits;
2525

2626
import org.apache.causeway.applib.annotation.ValueSemantics;
27+
import org.apache.causeway.core.metamodel.commons.ClassUtil;
2728
import org.apache.causeway.core.metamodel.context.MetaModelContext;
2829
import org.apache.causeway.core.metamodel.facetapi.FeatureType;
2930
import org.apache.causeway.core.metamodel.facets.FacetFactoryAbstract;
@@ -113,6 +114,10 @@ private void processDigits(
113114
MinIntegerDigitsFacetFromValueSemanticsAnnotation
114115
.create(valueSemanticsOpt, facetHolder));
115116

117+
if(ClassUtil.isJavaBuiltInInteger(facetHolder.getFeatureIdentifier().logicalType().correspondingClass()))
118+
return; // skip fractional facets
119+
120+
// max fractional digits
116121
addFacetIfPresent(
117122
MaxFractionalDigitsFacet.strongestConstraint(
118123
MaxFractionalDigitsFacetFromValueSemanticsAnnotation
@@ -121,6 +126,7 @@ private void processDigits(
121126
MaxFractionalDigitsFacetFromJakartaDigitsAnnotation
122127
.create(digitsOpt, facetHolder)));
123128

129+
// min fractional digits
124130
addFacetIfPresent(
125131
MinFractionalDigitsFacet.strongestConstraint(
126132
MinFractionalDigitsFacetFromValueSemanticsAnnotation

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/Facets.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ public OptionalInt minIntegerDigits(final FacetHolder facetHolder) {
268268
.orElseGet(OptionalInt::empty);
269269
}
270270

271+
/** expected empty for all integer types */
271272
public OptionalInt minFractionalDigits(final FacetHolder facetHolder) {
272273
return facetHolder.lookupFacet(MinFractionalDigitsFacet.class)
273274
.map(MinFractionalDigitsFacet::minFractionalDigits)
@@ -276,6 +277,7 @@ public OptionalInt minFractionalDigits(final FacetHolder facetHolder) {
276277
.orElseGet(OptionalInt::empty);
277278
}
278279

280+
/** expected empty for all integer types */
279281
public OptionalInt maxFractionalDigits(final FacetHolder facetHolder) {
280282
return facetHolder.lookupFacet(MaxFractionalDigitsFacet.class)
281283
.map(MaxFractionalDigitsFacet::maxFractionalDigits)
@@ -295,7 +297,7 @@ public OptionalInt maxTotalDigitsExplicit(final FacetHolder facetHolder) {
295297
}
296298

297299
/**
298-
* Consults all available constraints, in contrast to {@link #maxTotalDigits(FacetHolder)}
300+
* Consults all available constraints, in contrast to {@link #maxTotalDigitsExplicit(FacetHolder)}
299301
*/
300302
public OptionalInt maxTotalDigitsInferred(final FacetHolder facetHolder) {
301303
var maxInt = maxIntegerDigits(facetHolder);

persistence/jpa/metamodel/src/main/java/org/apache/causeway/persistence/jpa/metamodel/facets/prop/column/BigDecimalFromJpaColumnAnnotationFacetFactory.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import jakarta.inject.Inject;
2424
import jakarta.persistence.Column;
2525

26+
import org.apache.causeway.core.metamodel.commons.ClassUtil;
2627
import org.apache.causeway.core.metamodel.context.MetaModelContext;
2728
import org.apache.causeway.core.metamodel.facetapi.FeatureType;
2829
import org.apache.causeway.core.metamodel.facetapi.MetaModelRefiner;
@@ -44,23 +45,25 @@ public BigDecimalFromJpaColumnAnnotationFacetFactory(final MetaModelContext mmc)
4445
@Override
4546
public void process(final ProcessMethodContext processMethodContext) {
4647

47-
if(BigDecimal.class != processMethodContext.getMethod().getReturnType()) {
48+
if(BigDecimal.class != processMethodContext.getMethod().getReturnType())
4849
return;
49-
}
5050

51-
final FacetedMethod holder = processMethodContext.getFacetHolder();
51+
final FacetedMethod facetHolder = processMethodContext.getFacetHolder();
5252

5353
var jpaColumnIfAny = processMethodContext.synthesizeOnMethod(Column.class);
5454

5555
addFacetIfPresent(
56-
MaxTotalDigitsFacetFromJpaColumnAnnotation.create(jpaColumnIfAny, holder));
56+
MaxTotalDigitsFacetFromJpaColumnAnnotation.create(jpaColumnIfAny, facetHolder));
57+
58+
if(ClassUtil.isJavaBuiltInInteger(facetHolder.getFeatureIdentifier().logicalType().correspondingClass()))
59+
return; // skip fractional facets
5760

5861
addFacetIfPresent(
59-
MaxFractionalDigitsFacetFromJpaColumnAnnotation.create(jpaColumnIfAny, holder));
62+
MaxFractionalDigitsFacetFromJpaColumnAnnotation.create(jpaColumnIfAny, facetHolder));
6063

6164
if (getConfiguration().valueTypes().bigDecimal().useScaleForMinFractionalFacet()) {
6265
addFacetIfPresent(
63-
MinFractionalDigitsFacetFromJpaColumnAnnotation.create(jpaColumnIfAny, holder));
66+
MinFractionalDigitsFacetFromJpaColumnAnnotation.create(jpaColumnIfAny, facetHolder));
6467
}
6568

6669
}

persistence/jpa/metamodel/src/main/java/org/apache/causeway/persistence/jpa/metamodel/facets/prop/column/MaxFractionalDigitsFacetFromJpaColumnAnnotation.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ record MaxFractionalDigitsFacetFromJpaColumnAnnotation(
3333

3434
static Optional<MaxFractionalDigitsFacet> create(
3535
final Optional<Column> columnIfAny,
36-
final FacetHolder holder) {
36+
final FacetHolder facetHolder) {
3737
return columnIfAny
3838
.filter(column->column.scale()>=0)
39-
.map(column-> new MaxFractionalDigitsFacetFromJpaColumnAnnotation(column.scale(), holder));
39+
.map(column-> new MaxFractionalDigitsFacetFromJpaColumnAnnotation(column.scale(), facetHolder));
4040
}
4141

4242
@Override public Class<? extends Facet> facetType() { return MaxFractionalDigitsFacet.class; }

0 commit comments

Comments
 (0)