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);
}
}