You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/11/04 06:58:40 UTC

[isis] branch master updated: ISIS-2741: honor MaximumFractionDigitsFacet with BigDecimalValueSemantics

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 26d25a9  ISIS-2741: honor MaximumFractionDigitsFacet with BigDecimalValueSemantics
26d25a9 is described below

commit 26d25a95736818a045f3414c61a29999e6c30827
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Nov 4 07:58:33 2021 +0100

    ISIS-2741: honor MaximumFractionDigitsFacet with
    BigDecimalValueSemantics
---
 .../java/org/apache/isis/applib/Identifier.java    |  3 +++
 .../applib/adapters/ValueSemanticsAbstract.java    | 13 +++++++---
 .../maxlen/MaxFractionalDigitsFacetAbstract.java   | 27 ++++++++++----------
 ...sFacet.java => MaximumFractionDigitsFacet.java} |  4 +--
 ...rameterFromJavaxValidationDigitsAnnotation.java |  4 +--
 ...ropertyFromJavaxValidationDigitsAnnotation.java |  4 +--
 .../specimpl/ObjectActionParameterAbstract.java    | 29 ++++++----------------
 .../valuesemantics/BigDecimalValueSemantics.java   | 17 ++++++++++---
 ...ValidationDigitsAnnotationFacetFactoryTest.java |  6 ++---
 ...nferredFromJdoColumnAnnotationFacetFactory.java |  8 +++---
 ...FractionalDigitsFacetInferredFromJdoColumn.java |  4 +--
 ...vedFromJdoColumnAnnotationFacetFactoryTest.java |  8 +++---
 ...FractionalDigitsFacetInferredFromJpaColumn.java |  4 +--
 .../viewer/common/model/feature/ScalarUiModel.java |  6 ++---
 .../domainobjects/ObjectPropertyReprRenderer.java  |  6 ++---
 .../components/scalars/IsisConverterLocator.java   |  6 ++---
 .../jdkmath/BigDecimalConverter_roundtrip.java     |  4 +--
 17 files changed, 79 insertions(+), 74 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/Identifier.java b/api/applib/src/main/java/org/apache/isis/applib/Identifier.java
index 0f6965e..2498759 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/Identifier.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/Identifier.java
@@ -58,6 +58,9 @@ implements
 
     /**
      * What type of feature this identifies.
+     * @apiNote <i>Action Parameters</i> (for historic reasons) have {@link Type#ACTION},
+     * but other than <i>Actions</i>, have a non-negative {@link #parameterIndex}.
+     * (Future work, might introduce a new Type: eg. PARAMETER)
      */
     public static enum Type {
         CLASS, PROPERTY_OR_COLLECTION, ACTION;
diff --git a/api/applib/src/main/java/org/apache/isis/applib/adapters/ValueSemanticsAbstract.java b/api/applib/src/main/java/org/apache/isis/applib/adapters/ValueSemanticsAbstract.java
index 913a914..729cd121 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/adapters/ValueSemanticsAbstract.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/adapters/ValueSemanticsAbstract.java
@@ -132,16 +132,23 @@ implements
             } else if (position.getIndex() < input.length()) {
                 throw new ParseException("input='" + input + "' was not processed completely", position.getIndex());
             }
+            // check for maxFractionDigits if required ...
+            final int maxFractionDigits = format.getMaximumFractionDigits();
+            if(maxFractionDigits>-1
+                    && number.scale()>format.getMaximumFractionDigits()) {
+                throw new TextEntryParseException(String.format(
+                        "No more than %d fraction digits can be entered, "
+                        + "got %d in '%s'.", maxFractionDigits, number.scale(), input));
+            }
             return number;
         } catch (final NumberFormatException | ParseException e) {
-            System.err.printf("suppressed message %s%n", e.getMessage());
+            System.err.printf("suppressed message %s%n", e.getMessage()); //FIXME[ISIS-2741] remove (debug)
             throw new TextEntryParseException("Not a decimal value " + input, e);
         }
     }
 
     /**
-     * typically overridden by BigDecimalValueSemantics to set MaximumFractionDigits
-     * @param format
+     * Typically overridden by BigDecimalValueSemantics to set MaximumFractionDigits.
      */
     protected void configureDecimalFormat(final Context context, final DecimalFormat format) {}
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxFractionalDigitsFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxFractionalDigitsFacetAbstract.java
index 6e0aa27..8fa0963 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxFractionalDigitsFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxFractionalDigitsFacetAbstract.java
@@ -26,49 +26,48 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
 import lombok.Getter;
 import lombok.NonNull;
-import lombok.experimental.Accessors;
 
 public abstract class MaxFractionalDigitsFacetAbstract
 extends FacetAbstract
-implements MaxFractionalDigitsFacet {
+implements MaximumFractionDigitsFacet {
 
     private static final Class<? extends Facet> type() {
-        return MaxFractionalDigitsFacet.class;
+        return MaximumFractionDigitsFacet.class;
     }
 
-    @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
-    private final int maxFractionalDigits;
+    @Getter(onMethod_ = {@Override})
+    private final int maximumFractionDigits;
 
     protected MaxFractionalDigitsFacetAbstract(
-            final int maxFractionalDigits,
+            final int maximumFractionDigits,
             final FacetHolder holder) {
         super(type(), holder);
-        this.maxFractionalDigits= maxFractionalDigits;
+        this.maximumFractionDigits = maximumFractionDigits;
     }
 
     protected MaxFractionalDigitsFacetAbstract(
-            final int maxFractionalDigits,
+            final int maximumFractionDigits,
             final FacetHolder holder,
             final Facet.Precedence precedence) {
         super(type(), holder, precedence);
-        this.maxFractionalDigits= maxFractionalDigits;
+        this.maximumFractionDigits = maximumFractionDigits;
     }
 
     @Override
     public boolean semanticEquals(@NonNull final Facet other) {
-        return other instanceof MaxFractionalDigitsFacet
+        return other instanceof MaximumFractionDigitsFacet
                 ? Integer.compare(
-                        this.maxFractionalDigits(),
-                        ((MaxFractionalDigitsFacet)other).maxFractionalDigits()) == 0
+                        this.getMaximumFractionDigits(),
+                        ((MaximumFractionDigitsFacet)other).getMaximumFractionDigits()) == 0
                 : false;
     }
 
     @Override
     public void visitAttributes(final BiConsumer<String, Object> visitor) {
         super.visitAttributes(visitor);
-        visitor.accept("maxFractionalDigits", maxFractionalDigits <0
+        visitor.accept("maximumFractionDigits", maximumFractionDigits <0
                 ? "unlimited"
-                : String.valueOf(maxFractionalDigits));
+                : String.valueOf(maximumFractionDigits));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxFractionalDigitsFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaximumFractionDigitsFacet.java
similarity index 94%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxFractionalDigitsFacet.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaximumFractionDigitsFacet.java
index c0ead20..97a532a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxFractionalDigitsFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaximumFractionDigitsFacet.java
@@ -34,12 +34,12 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
  * <li><tt>12345.0</tt> has 1 fractional digit</li>
  * </ul>
  */
-public interface MaxFractionalDigitsFacet
+public interface MaximumFractionDigitsFacet
 extends Facet {
 
     /**
      * eg. as provided by {@link Digits#fraction()}
      */
-    int maxFractionalDigits();
+    int getMaximumFractionDigits();
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/MaxFractionalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/MaxFractionalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation.java
index ea6aedf..9d43737 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/MaxFractionalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/MaxFractionalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation.java
@@ -23,13 +23,13 @@ import java.util.Optional;
 import javax.validation.constraints.Digits;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaximumFractionDigitsFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacetAbstract;
 
 public class MaxFractionalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation
 extends MaxFractionalDigitsFacetAbstract {
 
-     public static Optional<MaxFractionalDigitsFacet> create(
+     public static Optional<MaximumFractionDigitsFacet> create(
              final Optional<Digits> digitsIfAny,
              final FacetHolder holder) {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/MaxFractionalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/MaxFractionalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation.java
index a2d4124..bcd80fc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/MaxFractionalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/MaxFractionalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation.java
@@ -23,13 +23,13 @@ import java.util.Optional;
 import javax.validation.constraints.Digits;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaximumFractionDigitsFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacetAbstract;
 
 public class MaxFractionalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation
 extends MaxFractionalDigitsFacetAbstract {
 
-     public static Optional<MaxFractionalDigitsFacet> create(
+     public static Optional<MaximumFractionDigitsFacet> create(
              final Optional<Digits> digitsIfAny,
              final FacetHolder holder) {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
index 4821e4c..b96b8cb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
@@ -54,6 +54,7 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
+import lombok.Getter;
 import lombok.NonNull;
 import lombok.val;
 
@@ -62,8 +63,8 @@ implements
     ObjectActionParameter,
     HasFacetHolder {
 
-    private final FeatureType featureType;
-    private final int number;
+    @Getter(onMethod_ = {@Override}) private final FeatureType featureType;
+    @Getter(onMethod_ = {@Override}) private final int parameterIndex;
     private final ObjectActionDefault parentAction;
     private final String javaSourceParamName;
     private final ObjectSpecification paramElementType;
@@ -75,7 +76,7 @@ implements
             final ObjectActionDefault objectAction) {
 
         this.featureType = featureType;
-        this.number = number;
+        this.parameterIndex = number;
         this.parentAction = objectAction;
         this.paramElementType = paramElementType;
 
@@ -89,23 +90,10 @@ implements
     }
 
     @Override
-    public FeatureType getFeatureType() {
-        return featureType;
-    }
-
-    @Override
     public ManagedObject get(final ManagedObject owner, final InteractionInitiatedBy interactionInitiatedBy) {
         throw _Exceptions.unexpectedCodeReach(); // not available for params
     }
 
-    /**
-     * Parameter number, 0-based.
-     */
-    @Override
-    public int getParameterIndex() {
-        return number;
-    }
-
     @Override
     public ObjectAction getAction() {
         return parentAction;
@@ -116,10 +104,9 @@ implements
         return paramElementType;
     }
 
-    @Override
-    public Identifier getFeatureIdentifier() {
-        return getAction().getFeatureIdentifier().withParameterIndex(number);
-    }
+    @Getter(lazy = true, onMethod_ = {@Override})
+    private final Identifier featureIdentifier = getAction().getFeatureIdentifier()
+        .withParameterIndex(getParameterIndex());
 
     @Override
     public String getId() {
@@ -181,7 +168,7 @@ implements
     @Override
     public FacetHolder getFacetHolder() {
         // that is the faceted method parameter
-        return parentAction.getFacetedMethod().getParameters().getElseFail(number);
+        return parentAction.getFacetedMethod().getParameters().getElseFail(parameterIndex);
     }
 
     // -- AutoComplete
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BigDecimalValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BigDecimalValueSemantics.java
index 88a55f8..911a412 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BigDecimalValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BigDecimalValueSemantics.java
@@ -33,6 +33,7 @@ import org.apache.isis.applib.adapters.Renderer;
 import org.apache.isis.applib.adapters.ValueSemanticsAbstract;
 import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.exceptions.UnrecoverableException;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaximumFractionDigitsFacet;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.schema.common.v2.ValueType;
 
@@ -116,11 +117,19 @@ implements
             return;
         }
         context.getFeatureIdentifier();
-        val feature = specificationLoader.loadFeature(context.getFeatureIdentifier());
-
-        // FIXME[ISIS-2741] evaluate any facets that provide the MaximumFractionDigits
+        val feature = specificationLoader.loadFeature(context.getFeatureIdentifier())
+                .orElse(null);
+        if(feature==null) {
+            return;
+        }
 
-        //format.setMaximumFractionDigits(...);
+        // evaluate any facets that provide the MaximumFractionDigits
+        feature.lookupFacet(MaximumFractionDigitsFacet.class).stream()
+        .mapToInt(MaximumFractionDigitsFacet::getMaximumFractionDigits)
+        .filter(digits->digits>-1)
+        .peek(digits->System.err.printf("digits: %d%n", digits)) //FIXME[ISIS-2741] remove (debug)
+        .forEach(digits-> // cardinality 0 or 1
+            format.setMaximumFractionDigits(digits));
     }
 
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/decimal/JavaxValidationDigitsAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/decimal/JavaxValidationDigitsAnnotationFacetFactoryTest.java
index 5c2e780..6389d31 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/decimal/JavaxValidationDigitsAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/decimal/JavaxValidationDigitsAnnotationFacetFactoryTest.java
@@ -29,7 +29,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
-import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaximumFractionDigitsFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxTotalDigitsFacet;
 import org.apache.isis.core.metamodel.facets.param.bigdecimal.javaxvaldigits.BigDecimalFacetOnParameterFromJavaxValidationAnnotationFactory;
 import org.apache.isis.core.metamodel.facets.param.bigdecimal.javaxvaldigits.MaxFractionalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation;
@@ -92,11 +92,11 @@ extends AbstractFacetFactoryTest {
         }
 
         if(maxFractionalDigits>=0) {
-            final MaxFractionalDigitsFacet facet = facetedMethod.getFacet(MaxFractionalDigitsFacet.class);
+            final MaximumFractionDigitsFacet facet = facetedMethod.getFacet(MaximumFractionDigitsFacet.class);
             assertNotNull(facet);
             assertTrue(facet instanceof MaxFractionalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation
                     ||facet instanceof MaxFractionalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation);
-            assertThat(facet.maxFractionalDigits(), is(maxFractionalDigits));
+            assertThat(facet.getMaximumFractionDigits(), is(maxFractionalDigits));
         }
     }
 
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalInferredFromJdoColumnAnnotationFacetFactory.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalInferredFromJdoColumnAnnotationFacetFactory.java
index dfe10de..813fb69 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalInferredFromJdoColumnAnnotationFacetFactory.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalInferredFromJdoColumnAnnotationFacetFactory.java
@@ -29,7 +29,7 @@ import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
-import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaximumFractionDigitsFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxTotalDigitsFacet;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.core.metamodel.spec.feature.MixedIn;
@@ -104,10 +104,10 @@ implements MetaModelRefiner {
                             b.getClass().getSimpleName());
                 }));
 
-        association.lookupFacet(MaxFractionalDigitsFacet.class)
-        .map(MaxFractionalDigitsFacet::getSharedFacetRankingElseFail)
+        association.lookupFacet(MaximumFractionDigitsFacet.class)
+        .map(MaximumFractionDigitsFacet::getSharedFacetRankingElseFail)
         .ifPresent(facetRanking->facetRanking
-                .visitTopRankPairsSemanticDiffering(MaxFractionalDigitsFacet.class, (a, b)->{
+                .visitTopRankPairsSemanticDiffering(MaximumFractionDigitsFacet.class, (a, b)->{
 
                     ValidationFailure.raiseFormatted(
                             association,
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxFractionalDigitsFacetInferredFromJdoColumn.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxFractionalDigitsFacetInferredFromJdoColumn.java
index fd732ee..a347c06 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxFractionalDigitsFacetInferredFromJdoColumn.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxFractionalDigitsFacetInferredFromJdoColumn.java
@@ -23,13 +23,13 @@ import java.util.Optional;
 import javax.jdo.annotations.Column;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaximumFractionDigitsFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacetAbstract;
 
 public class MaxFractionalDigitsFacetInferredFromJdoColumn
 extends MaxFractionalDigitsFacetAbstract {
 
-     public static Optional<MaxFractionalDigitsFacet> create(
+     public static Optional<MaximumFractionDigitsFacet> create(
              final Optional<Column> jdoColumnIfAny,
              final FacetHolder holder) {
 
diff --git a/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java b/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java
index b2ccfcf..5ee9509 100644
--- a/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java
+++ b/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java
@@ -27,7 +27,7 @@ import org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
-import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaximumFractionDigitsFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxTotalDigitsFacet;
 import org.apache.isis.persistence.jdo.metamodel.testing.AbstractFacetFactoryTest;
 
@@ -112,12 +112,12 @@ extends AbstractFacetFactoryTest {
         }
 
         if(maxFractionalDigits>=0) {
-            final MaxFractionalDigitsFacet facet = facetedMethod.getFacet(MaxFractionalDigitsFacet.class);
+            final MaximumFractionDigitsFacet facet = facetedMethod.getFacet(MaximumFractionDigitsFacet.class);
             assertNotNull(facet);
             assertTrue(facet instanceof MaxFractionalDigitsFacetInferredFromJdoColumn);
-            assertThat(facet.maxFractionalDigits(), is(maxFractionalDigits));
+            assertThat(facet.getMaximumFractionDigits(), is(maxFractionalDigits));
         } else {
-            assertNull(facetedMethod.getFacet(MaxFractionalDigitsFacet.class));
+            assertNull(facetedMethod.getFacet(MaximumFractionDigitsFacet.class));
         }
     }
 
diff --git a/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/facets/prop/column/MaxFractionalDigitsFacetInferredFromJpaColumn.java b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/facets/prop/column/MaxFractionalDigitsFacetInferredFromJpaColumn.java
index d7e0fb7..193f13b 100644
--- a/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/facets/prop/column/MaxFractionalDigitsFacetInferredFromJpaColumn.java
+++ b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/facets/prop/column/MaxFractionalDigitsFacetInferredFromJpaColumn.java
@@ -23,13 +23,13 @@ import java.util.Optional;
 import javax.persistence.Column;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaximumFractionDigitsFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacetAbstract;
 
 public class MaxFractionalDigitsFacetInferredFromJpaColumn
 extends MaxFractionalDigitsFacetAbstract {
 
-     public static Optional<MaxFractionalDigitsFacet> create(
+     public static Optional<MaximumFractionDigitsFacet> create(
              final Optional<Column> jpaColumnIfAny,
              final FacetHolder holder) {
 
diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/ScalarUiModel.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/ScalarUiModel.java
index a1c2607..66ae575 100644
--- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/ScalarUiModel.java
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/ScalarUiModel.java
@@ -24,7 +24,7 @@ import java.util.Optional;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.objectvalue.fileaccept.FileAcceptFacet;
-import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaximumFractionDigitsFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxTotalDigitsFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
@@ -68,8 +68,8 @@ public interface ScalarUiModel {
      * @see #getScale()
      */
     default Integer getScale() {
-        return getMetaModel().lookupFacet(MaxFractionalDigitsFacet.class)
-                .map(MaxFractionalDigitsFacet::maxFractionalDigits)
+        return getMetaModel().lookupFacet(MaximumFractionDigitsFacet.class)
+                .map(MaximumFractionDigitsFacet::getMaximumFractionDigits)
                 .orElse(null);
     }
 
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
index 6af1b3a..09e1619 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
@@ -31,7 +31,7 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.collections.collection.defaultview.DefaultViewFacet;
 import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
-import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaximumFractionDigitsFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxTotalDigitsFacet;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedProperty;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
@@ -107,8 +107,8 @@ extends AbstractObjectMemberReprRenderer<OneToOneAssociation> {
                         .map(MaxTotalDigitsFacet::maxTotalDigits)
                         .orElse(-1);
 
-                final int scale = lookupFacet(MaxFractionalDigitsFacet.class, facetHolders)
-                        .map(MaxFractionalDigitsFacet::maxFractionalDigits)
+                final int scale = lookupFacet(MaximumFractionDigitsFacet.class, facetHolders)
+                        .map(MaximumFractionDigitsFacet::getMaximumFractionDigits)
                         .orElse(-1);
 
                 format = String.format("big-decimal(%d,%d)", totalDigits, scale);
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/IsisConverterLocator.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/IsisConverterLocator.java
index 2ab8fd7..a7f00cf 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/IsisConverterLocator.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/IsisConverterLocator.java
@@ -26,7 +26,7 @@ import org.apache.wicket.util.convert.converter.BigIntegerConverter;
 import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._NullSafe;
-import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaximumFractionDigitsFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.renderedadjusted.RenderedAdjustedFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
@@ -112,8 +112,8 @@ public class IsisConverterLocator {
         }
         if (java.math.BigDecimal.class == correspondingClass) {
             final int scale = objectSpecification
-                .lookupFacet(MaxFractionalDigitsFacet.class)
-                .map(MaxFractionalDigitsFacet::maxFractionalDigits)
+                .lookupFacet(MaximumFractionDigitsFacet.class)
+                .map(MaximumFractionDigitsFacet::getMaximumFractionDigits)
                 .orElse(-1);
             return _Casts.uncheckedCast(new BigDecimalConverterWithScale(scale).forViewMode());
         }
diff --git a/viewers/wicket/ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalConverter_roundtrip.java b/viewers/wicket/ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalConverter_roundtrip.java
index fcc8b13..ffc6063 100644
--- a/viewers/wicket/ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalConverter_roundtrip.java
+++ b/viewers/wicket/ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalConverter_roundtrip.java
@@ -121,10 +121,10 @@ class BigDecimalConverter_roundtrip {
         assertRoundtrip(CustomerScale2.class, bd_789123_45_scale2, "789123.45", "789,123.45", Locale.ENGLISH);
     }
 
-    @Test @Disabled //FIXME[ISIS-2741] scale not picked up yet
+    @Test
     void scale2_english_tooLargeScale() {
         assertParseError(CustomerScale2.class, "123.454", Locale.ENGLISH,
-                "No more than 2 digits can be entered after the decimal place");
+                "No more than 2 fraction digits can be entered, got 3 in '123.454'.");
     }
 
     // -- HELPER