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/14 10:36:52 UTC

[isis] branch master updated: ISIS-2882: honor editing vs viewing, when selecting a converter

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 66bc11f  ISIS-2882: honor editing vs viewing, when selecting a converter
66bc11f is described below

commit 66bc11fe9e46ce987300a5aaa10adf15598c78b0
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Nov 14 11:36:41 2021 +0100

    ISIS-2882: honor editing vs viewing, when selecting a converter
---
 .../applib/adapters/ValueSemanticsProvider.java    |  6 ++-
 .../title/parser/TitleFacetUsingValueFacet.java    |  4 +-
 .../facets/object/value/ValueRepresentation.java   | 46 ++++++++++++++++++++++
 .../scalars/ConverterBasedOnValueSemantics.java    | 38 ++++++++++++++++--
 .../jdkmath/BigDecimalConverterForFeature.java     | 16 +++++++-
 .../scalars/jdkmath/JavaMathBigDecimalPanel.java   |  5 +--
 .../jdkmath/BigDecimalConverter_roundtrip.java     |  3 +-
 7 files changed, 105 insertions(+), 13 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/adapters/ValueSemanticsProvider.java b/api/applib/src/main/java/org/apache/isis/applib/adapters/ValueSemanticsProvider.java
index 55d2437..97b870b 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/adapters/ValueSemanticsProvider.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/adapters/ValueSemanticsProvider.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.applib.adapters;
 
+import org.springframework.lang.Nullable;
+
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Value;
 import org.apache.isis.applib.services.iactnlayer.InteractionContext;
@@ -50,8 +52,8 @@ public interface ValueSemanticsProvider<T> {
 
     @lombok.Value(staticConstructor = "of")
     class Context {
-        Identifier featureIdentifier;
-        InteractionContext interactionContext;
+        private final @Nullable Identifier featureIdentifier;
+        private final @Nullable InteractionContext interactionContext;
     }
 
     Class<T> getCorrespondingClass();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/parser/TitleFacetUsingValueFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/parser/TitleFacetUsingValueFacet.java
index 3f5b6cf..6d05a1e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/parser/TitleFacetUsingValueFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/parser/TitleFacetUsingValueFacet.java
@@ -66,7 +66,9 @@ implements TitleFacet {
             val prop = (OneToOneAssociation)renderRequest.getFeature();
             final Renderer renderer = valueFacet
                     .selectRendererForPropertyElseFallback(prop);
-            return renderer.simpleTextPresentation(valueFacet.createValueSemanticsContext(prop), pojo);
+            return renderer
+                    .simpleTextPresentation(valueFacet
+                            .createValueSemanticsContext(prop), pojo);
         }
         if(renderRequest.getFeature() instanceof ObjectActionParameter) {
             val param = (ObjectActionParameter)renderRequest.getFeature();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueRepresentation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueRepresentation.java
new file mode 100644
index 0000000..1583fd5
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueRepresentation.java
@@ -0,0 +1,46 @@
+/*
+ *  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.object.value;
+
+import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.Renderer;
+
+/**
+ * Introduced specifically for value-types.
+ *
+ * @apiNote there are similarities with org.apache.isis.viewer.common.model.object.ObjectUiModel.EitherViewOrEdit,
+ * which is not specific to value-types, but covers any scalars;
+ * (thinking about unifying these two into one - more generic - enum)
+ */
+public enum ValueRepresentation {
+
+    /** Indicates that for value-type to {@link String} conversion a {@link Parser} is required. */
+    EDITING,
+
+    /** Indicates that for value-type to {@link String} conversion a {@link Renderer} is required. */
+    RENDERING;
+
+    public boolean isEditing() {
+        return this == EDITING;
+    }
+
+    public boolean isRendering() {
+        return this == RENDERING;
+    }
+}
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ConverterBasedOnValueSemantics.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ConverterBasedOnValueSemantics.java
index 13d379f..044b0a1 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ConverterBasedOnValueSemantics.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ConverterBasedOnValueSemantics.java
@@ -27,13 +27,16 @@ import org.apache.isis.applib.Identifier;
 import org.apache.isis.commons.internal.base._Either;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
+import org.apache.isis.core.metamodel.facets.object.value.ValueRepresentation;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext.HasCommonContext;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.model.util.CommonContextUtils;
 
+import lombok.NonNull;
 import lombok.Synchronized;
 import lombok.val;
 
@@ -45,10 +48,20 @@ implements
     private static final long serialVersionUID = 1L;
 
     private final Identifier featureIdentifier;
+    private final ValueRepresentation valueRepresentation;
     private transient _Either<OneToOneAssociation,  ObjectActionParameter> propOrParam;
     private transient IsisAppCommonContext commonContext;
 
-    protected ConverterBasedOnValueSemantics(final ObjectFeature propOrParam) {
+    protected ConverterBasedOnValueSemantics(final ScalarModel scalarModel) {
+        this(scalarModel.getMetaModel(), scalarModel.isEditMode()
+                ? ValueRepresentation.EDITING
+                : ValueRepresentation.RENDERING);
+    }
+
+    protected ConverterBasedOnValueSemantics(
+            final @NonNull ObjectFeature propOrParam,
+            final @NonNull ValueRepresentation valueRepresentation) {
+        this.valueRepresentation = valueRepresentation;
         this.propOrParam = propOrParam instanceof OneToOneAssociation // memoize
                 ? _Either.left((OneToOneAssociation)propOrParam)
                 : _Either.right((ObjectActionParameter)propOrParam);
@@ -62,6 +75,14 @@ implements
     @Override
     public final T convertToObject(final String text, final Locale locale) throws ConversionException {
 
+        // guard against framework bugs
+        if(valueRepresentation.isRendering()) {
+            throw _Exceptions.illegalArgument("Internal Error: "
+                    + "cannot convert a rendering representation back to its value-type '%s' -> %s",
+                        text,
+                        featureIdentifier);
+        }
+
         val feature = feature();
         val valueFacet = valueFacet();
 
@@ -93,8 +114,19 @@ implements
         val context = valueFacet
                 .createValueSemanticsContext(feature);
 
-        return valueFacet.selectParserForFeatureElseFallback(feature)
-                .parseableTextRepresentation(context, value);
+        switch(valueRepresentation) {
+        case EDITING:
+            return valueFacet.selectParserForFeatureElseFallback(feature)
+                    .parseableTextRepresentation(context, value);
+        case RENDERING:
+            return propOrParam.fold(
+                    prop->valueFacet.selectRendererForPropertyElseFallback(prop)
+                            .simpleTextPresentation(context, value),
+                    param->valueFacet.selectRendererForParameterElseFallback(param)
+                            .simpleTextPresentation(context, value));
+        }
+
+        throw _Exceptions.unmatchedCase(valueRepresentation);
     }
 
     // -- HELPER
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalConverterForFeature.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalConverterForFeature.java
index 853e394..0fea23a 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalConverterForFeature.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalConverterForFeature.java
@@ -20,15 +20,27 @@ package org.apache.isis.viewer.wicket.ui.components.scalars.jdkmath;
 
 import java.math.BigDecimal;
 
+import org.apache.isis.core.metamodel.facets.object.value.ValueRepresentation;
 import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ConverterBasedOnValueSemantics;
 
+import lombok.NonNull;
+
 public class BigDecimalConverterForFeature
 extends ConverterBasedOnValueSemantics<BigDecimal> {
 
     private static final long serialVersionUID = 1L;
 
-    protected BigDecimalConverterForFeature(final ObjectFeature propOrParam) {
-        super(propOrParam);
+    public BigDecimalConverterForFeature(
+            final @NonNull ScalarModel scalarModel) {
+        super(scalarModel);
+    }
+
+    public BigDecimalConverterForFeature(
+            final @NonNull ObjectFeature objFeature,
+            final @NonNull ValueRepresentation valueRepresentation) {
+        super(objFeature, valueRepresentation);
     }
+
 }
\ No newline at end of file
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java
index 0f3b646..25c673b 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java
@@ -55,10 +55,7 @@ extends ScalarPanelTextFieldNumeric<BigDecimal> {
 
     @Override
     protected IConverter<BigDecimal> getConverter(final ScalarModel scalarModel) {
-
-        // honor when not scalarModel.isEditMode()
-
-        return new BigDecimalConverterForFeature(scalarModel.getMetaModel());
+        return new BigDecimalConverterForFeature(scalarModel);
     }
 }
 
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 db2f824..530b032 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,6 +39,7 @@ 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.facets.object.value.ValueRepresentation;
 import org.apache.isis.core.metamodel.valuesemantics.BigDecimalValueSemantics;
 import org.apache.isis.core.security._testing.InteractionService_forTesting;
 
@@ -178,7 +179,7 @@ class BigDecimalConverter_roundtrip {
     private BigDecimalConverterForFeature newConverter(final Class<?> type) {
         val customerSpec = mmc.getSpecificationLoader().specForTypeElseFail(type);
         val prop = customerSpec.getPropertyElseFail("value");
-        return new BigDecimalConverterForFeature(prop);
+        return new BigDecimalConverterForFeature(prop, ValueRepresentation.EDITING);
     }
 
 }