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/05 12:14:23 UTC

[isis] branch master updated: ISIS-2871: replace experimental @Property(valueSemantics="qualifierXxx") with new @ValueSemantics(provider="qualifierXxx")

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 2906c60  ISIS-2871: replace experimental @Property(valueSemantics="qualifierXxx") with new @ValueSemantics(provider="qualifierXxx")
2906c60 is described below

commit 2906c601b3ccb4c60e3a2f6b9554e0e5fd1a339f
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Nov 5 13:14:14 2021 +0100

    ISIS-2871: replace experimental
    @Property(valueSemantics="qualifierXxx")
    with new
    @ValueSemantics(provider="qualifierXxx")
---
 .../applib/adapters/ValueSemanticsAbstract.java    |  7 +-
 .../apache/isis/applib/annotation/Property.java    | 18 ------
 .../isis/applib/annotation/ValueSemantics.java     | 45 +++++++++++++
 .../property/PropertyAnnotationFacetFactory.java   | 11 ----
 .../ValueSemanticsAnnotationFacetFactory.java      | 74 ++++++++++++++++++++++
 ...ValueSemanticsSelectingFacetForAnnotation.java} | 16 ++---
 .../dflt/ProgrammingModelFacetsJava11.java         |  3 +
 .../facets/param/name/ParameterNameFacetTest.java  |  2 +-
 .../HasAsciiDocDescription_description.java        |  5 +-
 .../jdkmath/BigDecimalConverter_roundtrip.java     | 12 ----
 10 files changed, 139 insertions(+), 54 deletions(-)

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 d1f9f75..50606a8 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
@@ -130,7 +130,9 @@ implements
         }
         val format = getNumberFormat(context);
         format.setParseBigDecimal(true);
+        System.err.printf("before configure %d%n", format.getMaximumFractionDigits()); //FIXME[ISIS-2741] debug remove
         configureDecimalFormat(context, format);
+        System.err.printf("after configure %d%n", format.getMaximumFractionDigits()); //FIXME[ISIS-2741] debug remove
 
         val position = new ParsePosition(0);
         try {
@@ -150,8 +152,9 @@ implements
             }
             return number;
         } catch (final NumberFormatException | ParseException e) {
-            System.err.printf("suppressed message %s%n", e.getMessage()); //FIXME[ISIS-2741] remove (debug)
-            throw new TextEntryParseException("Not a decimal value " + input, e);
+            throw new TextEntryParseException(String.format(
+                    "Not a decimal value '%s': %s", input, e.getMessage()),
+                    e);
         }
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/Property.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/Property.java
index 78c4ab0..d6d9ebc 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/annotation/Property.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/Property.java
@@ -24,7 +24,6 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
-import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.events.domain.PropertyDomainEvent;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.commanddto.conmap.ContentMappingServiceForCommandDto;
@@ -293,21 +292,4 @@ public @interface Property {
     String regexPatternReplacement()
             default "Doesn't match pattern";
 
-    /**
-     * <i>Experimental Feature</i>
-     * <p>
-     * Allows to select {@link ValueSemanticsProvider}(s) by qualifiers.
-     *
-     * TODO not provided yet...
-     * @see Parameter#valueSemantics()
-     * @see Action#valueSemantics()
-     * @see Collection#valueSemantics()
-     * @apiNote the selection (qualifier inclusion/exclusion) mechanics is not yet finalized,
-     * currently a single qualifier declared here must exactly match that of the targeted bean
-     */
-    String valueSemantics()
-            default "";
-
-
-
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/ValueSemantics.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/ValueSemantics.java
new file mode 100644
index 0000000..1dc60a0
--- /dev/null
+++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/ValueSemantics.java
@@ -0,0 +1,45 @@
+package org.apache.isis.applib.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.Locale;
+
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
+
+/**
+ * Collects all the value-type specific customization attributes.
+ *
+ * @apiNote These are understood to be agnostic to the actual {@link Locale} in use.
+ *
+ * @see Action
+ * @see Collection
+ * @see Property
+ * @see Parameter
+ *
+ * @since 2.x {@index}
+ */
+@Inherited
+@Target({
+        ElementType.METHOD,
+        ElementType.FIELD,
+        ElementType.TYPE,
+        ElementType.ANNOTATION_TYPE
+})
+@Retention(RetentionPolicy.RUNTIME)
+@Domain.Include // meta annotation, in support of meta-model validation
+public @interface ValueSemantics {
+
+    /**
+     * <p>
+     * Allows to select {@link ValueSemanticsProvider}(s) by qualifier.
+     *
+     * @apiNote the selection (qualifier inclusion/exclusion) mechanics is not yet finalized,
+     * currently a single qualifier declared here must exactly match that of the targeted bean
+     */
+    String provider()
+            default "";
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
index d9b4028..4a0f8b2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
@@ -57,7 +57,6 @@ import org.apache.isis.core.metamodel.facets.properties.property.mustsatisfy.Mus
 import org.apache.isis.core.metamodel.facets.properties.property.regex.RegExFacetForPatternAnnotationOnProperty;
 import org.apache.isis.core.metamodel.facets.properties.property.regex.RegExFacetForPropertyAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.property.snapshot.SnapshotExcludeFacetForPropertyAnnotation;
-import org.apache.isis.core.metamodel.facets.properties.property.valuesemantics.ValueSemanticsSelectingFacetForPropertyAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.update.clear.PropertyClearFacet;
 import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -99,7 +98,6 @@ extends FacetFactoryAbstract {
         processOptional(processMethodContext, propertyIfAny);
         processRegEx(processMethodContext, propertyIfAny);
         processFileAccept(processMethodContext, propertyIfAny);
-        processValueSemantics(processMethodContext, propertyIfAny);
     }
 
     void inferIntentWhenOnTypeLevel(final ProcessMethodContext processMethodContext, final Optional<Property> propertyIfAny) {
@@ -380,13 +378,4 @@ extends FacetFactoryAbstract {
                 .create(propertyIfAny, holder));
     }
 
-    void processValueSemantics(final ProcessMethodContext processMethodContext, final Optional<Property> propertyIfAny) {
-        val holder = processMethodContext.getFacetHolder();
-
-        // check for @Property(valueSemantics=...)
-        addFacetIfPresent(
-                ValueSemanticsSelectingFacetForPropertyAnnotation
-                .create(propertyIfAny, holder));
-    }
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/semantics/ValueSemanticsAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/semantics/ValueSemanticsAnnotationFacetFactory.java
new file mode 100644
index 0000000..5aec743
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/semantics/ValueSemanticsAnnotationFacetFactory.java
@@ -0,0 +1,74 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.facets.value.semantics;
+
+import java.math.BigDecimal;
+import java.util.Optional;
+
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.ValueSemantics;
+import org.apache.isis.core.metamodel.context.MetaModelContext;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.TypedHolderAbstract;
+import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorForAmbiguousMixinAnnotations;
+
+import lombok.val;
+
+public class ValueSemanticsAnnotationFacetFactory
+extends FacetFactoryAbstract {
+
+    @Inject
+    public ValueSemanticsAnnotationFacetFactory(final MetaModelContext mmc) {
+        super(mmc, FeatureType.EVERYTHING);
+    }
+
+    @Override
+    public void process(final ProcessMethodContext processMethodContext) {
+        val valueSemanticsIfAny = processMethodContext
+                .synthesizeOnMethodOrMixinType(
+                        ValueSemantics.class,
+                        () -> MetaModelValidatorForAmbiguousMixinAnnotations
+                            .addValidationFailure(processMethodContext.getFacetHolder(), ValueSemantics.class));
+        processProvider(processMethodContext.getFacetHolder(), valueSemanticsIfAny);
+    }
+
+    @Override
+    public void processParams(final ProcessParameterContext processParameterContext) {
+        if(BigDecimal.class != processParameterContext.getParameterType()) {
+            return;
+        }
+        val valueSemanticsIfAny = processParameterContext.synthesizeOnParameter(ValueSemantics.class);
+        processProvider(processParameterContext.getFacetHolder(), valueSemanticsIfAny);
+    }
+
+    // -- HELPER
+
+    void processProvider(
+            final TypedHolderAbstract facetHolder,
+            final Optional<ValueSemantics> valueSemanticsIfAny) {
+
+        // check for @ValueSemantics(provider=...)
+        addFacetIfPresent(
+                ValueSemanticsSelectingFacetForAnnotation
+                .create(valueSemanticsIfAny, facetHolder));
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/valuesemantics/ValueSemanticsSelectingFacetForPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/semantics/ValueSemanticsSelectingFacetForAnnotation.java
similarity index 75%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/valuesemantics/ValueSemanticsSelectingFacetForPropertyAnnotation.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/semantics/ValueSemanticsSelectingFacetForAnnotation.java
index e1a303b..c07fad5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/valuesemantics/ValueSemanticsSelectingFacetForPropertyAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/semantics/ValueSemanticsSelectingFacetForAnnotation.java
@@ -16,30 +16,30 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.metamodel.facets.properties.property.valuesemantics;
+package org.apache.isis.core.metamodel.facets.value.semantics;
 
 import java.util.Optional;
 
-import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.ValueSemantics;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.objectvalue.valuesemantics.ValueSemanticsSelectingFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.valuesemantics.ValueSemanticsSelectingFacetAbstract;
 
-public class ValueSemanticsSelectingFacetForPropertyAnnotation
+public class ValueSemanticsSelectingFacetForAnnotation
 extends ValueSemanticsSelectingFacetAbstract {
 
     public static Optional<ValueSemanticsSelectingFacet> create(
-            final Optional<Property> propertyIfAny,
+            final Optional<ValueSemantics> valueSemanticsIfAny,
             final FacetHolder holder) {
 
-        return propertyIfAny
-        .map(Property::valueSemantics)
+        return valueSemanticsIfAny
+        .map(ValueSemantics::provider)
         .filter(_Strings::isNotEmpty)
-        .map(valueSemantics -> new ValueSemanticsSelectingFacetForPropertyAnnotation(valueSemantics, holder));
+        .map(valueSemantics -> new ValueSemanticsSelectingFacetForAnnotation(valueSemantics, holder));
     }
 
-    private ValueSemanticsSelectingFacetForPropertyAnnotation(final String value, final FacetHolder holder) {
+    private ValueSemanticsSelectingFacetForAnnotation(final String value, final FacetHolder holder) {
         super(value, holder);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
index 69fbcbb..336ee59 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
@@ -83,6 +83,7 @@ import org.apache.isis.core.metamodel.facets.properties.propertylayout.PropertyL
 import org.apache.isis.core.metamodel.facets.properties.update.PropertySetterFacetFactory;
 import org.apache.isis.core.metamodel.facets.properties.validating.dflt.PropertyValidateFacetDefaultFactory;
 import org.apache.isis.core.metamodel.facets.properties.validating.method.PropertyValidateFacetViaMethodFactory;
+import org.apache.isis.core.metamodel.facets.value.semantics.ValueSemanticsAnnotationFacetFactory;
 import org.apache.isis.core.metamodel.methods.DomainIncludeAnnotationEnforcesMetamodelContributionValidator;
 import org.apache.isis.core.metamodel.methods.MethodByClassMap;
 import org.apache.isis.core.metamodel.postprocessors.DeriveMixinMembersPostProcessor;
@@ -214,6 +215,8 @@ extends ProgrammingModelAbstract {
 
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new HiddenTypeFacetDerivedFromAuthorizationFactory(mmc));
 
+        addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new ValueSemanticsAnnotationFacetFactory(mmc));
+
         addFactory(FacetProcessingOrder.F1_LAYOUT, new GridFacetFactory(mmc));
 
         // must come before DomainObjectLayoutFacetFactory
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java
index cf5f93e..b10185d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java
@@ -67,7 +67,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
     @Test
     public void verifyProgrammingModelNumberOfFactories() {
-        assertEquals(63, programmingModel.streamFactories().count());
+        assertEquals(64, programmingModel.streamFactories().count());
     }
 
     @Test //verify we have the javac -parameter flag set when compiling this class
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/_infra/asciidocdesc/HasAsciiDocDescription_description.java b/examples/demo/domain/src/main/java/demoapp/dom/_infra/asciidocdesc/HasAsciiDocDescription_description.java
index 698fd21..deb85b1 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/_infra/asciidocdesc/HasAsciiDocDescription_description.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/_infra/asciidocdesc/HasAsciiDocDescription_description.java
@@ -24,6 +24,7 @@ import org.apache.isis.applib.annotation.LabelPosition;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Snapshot;
+import org.apache.isis.applib.annotation.ValueSemantics;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.valuetypes.asciidoc.applib.value.AsciiDoc;
 
@@ -31,8 +32,8 @@ import lombok.RequiredArgsConstructor;
 
 import demoapp.dom._infra.resources.AsciiDocReaderService;
 
-@Property(snapshot = Snapshot.EXCLUDED
-    , valueSemantics = "demo-adoc-pre-processor")
+@Property(snapshot = Snapshot.EXCLUDED)
+@ValueSemantics(provider = "demo-adoc-pre-processor")
 @RequiredArgsConstructor
 public class HasAsciiDocDescription_description {
 
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 50a68d7..db2f824 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
@@ -39,10 +39,8 @@ import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.core.config.valuetypes.ValueSemanticsRegistry;
 import org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.isis.core.metamodel.valuesemantics.BigDecimalValueSemantics;
 import org.apache.isis.core.security._testing.InteractionService_forTesting;
-import org.apache.isis.viewer.wicket.ui.components.scalars.ConverterBasedOnValueSemantics;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -61,16 +59,6 @@ class BigDecimalConverter_roundtrip {
     private InteractionService interactionService;
     private MetaModelContext mmc;
 
-    private static class BigDecimalConverterForFeature
-    extends ConverterBasedOnValueSemantics<BigDecimal> {
-
-        private static final long serialVersionUID = 1L;
-
-        protected BigDecimalConverterForFeature(final ObjectFeature propOrParam) {
-            super(propOrParam);
-        }
-    }
-
     @BeforeEach
     void setUp() throws Exception {