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/09/16 11:31:43 UTC

[isis] branch master updated: ISIS-2871: Spring managed value semantics for String

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 11bbce2  ISIS-2871: Spring managed value semantics for String
11bbce2 is described below

commit 11bbce22ac4a3cde0a1f8716d06b7bc52484028f
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Sep 16 13:31:34 2021 +0200

    ISIS-2871: Spring managed value semantics for String
---
 .../core/metamodel/IsisModuleCoreMetamodel.java    |  2 +
 .../facets/value/string/StringValueFacet.java      | 25 ------
 ...ingValueFacetUsingSemanticsProviderFactory.java | 46 -----------
 .../facets/value/string/StringValueSemantics.java  | 69 +++++++++++++++++
 .../value/string/StringValueSemanticsProvider.java | 90 ----------------------
 .../dflt/ProgrammingModelFacetsJava11.java         |  2 -
 .../facets/param/name/ParameterNameFacetTest.java  |  2 +-
 .../value/StringValueSemanticsProviderTest.java    | 61 +++++++--------
 .../ValueSemanticsProviderAbstractTestCase.java    | 15 +++-
 .../ui/components/text/TextFieldFactory.java       | 20 +++--
 .../ui/components/blob/BlobFieldFactory.java       |  2 +-
 .../ui/components/clob/ClobFieldFactory.java       |  2 +-
 .../ui/components/text/TextFieldFactory.java       |  3 +-
 .../model/components/UiComponentFactory.java       |  2 +-
 .../viewer/common/model/feature/ScalarUiModel.java |  5 +-
 15 files changed, 128 insertions(+), 218 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
index 9f58ce4..b4420db 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
@@ -34,6 +34,7 @@ import org.apache.isis.core.metamodel.facets.value.clobs.ClobValueSemantics;
 import org.apache.isis.core.metamodel.facets.value.localrespath.LocalResourcePathValueSemantics;
 import org.apache.isis.core.metamodel.facets.value.markup.MarkupValueSemantics;
 import org.apache.isis.core.metamodel.facets.value.password.PasswordValueSemantics;
+import org.apache.isis.core.metamodel.facets.value.string.StringValueSemantics;
 import org.apache.isis.core.metamodel.facets.value.treenode.TreeNodeValueSemantics;
 import org.apache.isis.core.metamodel.facets.value.url.URLValueSemantics;
 import org.apache.isis.core.metamodel.facets.value.uuid.UUIDValueSemantics;
@@ -91,6 +92,7 @@ import org.apache.isis.core.security.IsisModuleCoreSecurity;
         // Value Semantics (built-in defaults)
         BooleanValueSemantics.class,
         BigDecimalValueSemantics.class,
+        StringValueSemantics.class,
         PasswordValueSemantics.class,
         BlobValueSemantics.class,
         ClobValueSemantics.class,
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/string/StringValueFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/string/StringValueFacet.java
deleted file mode 100644
index 4ef0d40..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/string/StringValueFacet.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  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.string;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-
-public interface StringValueFacet extends Facet {
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/string/StringValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/string/StringValueFacetUsingSemanticsProviderFactory.java
deleted file mode 100644
index 18a927e..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/string/StringValueFacetUsingSemanticsProviderFactory.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  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.string;
-
-import javax.inject.Inject;
-
-import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueFacetUsingSemanticsProviderFactory;
-
-public class StringValueFacetUsingSemanticsProviderFactory
-extends ValueFacetUsingSemanticsProviderFactory<String> {
-
-    @Inject
-    public StringValueFacetUsingSemanticsProviderFactory(final MetaModelContext mmc) {
-        super(mmc);
-    }
-
-    @Override
-    public void process(final ProcessClassContext processClassContext) {
-        final Class<?> type = processClassContext.getCls();
-        final FacetHolder holder = processClassContext.getFacetHolder();
-
-        if (type != String.class) {
-            return;
-        }
-        addValueFacet(new StringValueSemanticsProvider(holder));
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/string/StringValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/string/StringValueSemantics.java
new file mode 100644
index 0000000..30a5237
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/string/StringValueSemantics.java
@@ -0,0 +1,69 @@
+/*
+ *  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.string;
+
+import org.apache.isis.applib.adapters.AbstractValueSemanticsProvider;
+import org.apache.isis.applib.adapters.EncoderDecoder;
+import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.Renderer;
+
+public class StringValueSemantics
+extends AbstractValueSemanticsProvider<String>
+implements
+    EncoderDecoder<String>,
+    Parser<String>,
+    Renderer<String> {
+
+    // -- ENCODER DECODER
+
+    @Override
+    public String toEncodedString(final String text) {
+        return text;
+    }
+
+    @Override
+    public String fromEncodedString(final String data) {
+        return data;
+    }
+
+    // -- RENDERER
+
+    @Override
+    public String presentationValue(final Context context, final String value) {
+        return value == null ? "" : value;
+    }
+
+    // -- PARSER
+
+    @Override
+    public String parseableTextRepresentation(final Context context, final String value) {
+        return value;
+    }
+
+    @Override
+    public String parseTextRepresentation(final Context context, final String text) {
+        return text;
+    }
+
+    @Override
+    public int typicalLength() {
+        return 25;
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/string/StringValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/string/StringValueSemanticsProvider.java
deleted file mode 100644
index 8ce7540..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/string/StringValueSemanticsProvider.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *  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.string;
-
-import org.apache.isis.applib.adapters.ValueSemanticsProvider;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract;
-
-public class StringValueSemanticsProvider
-extends ValueSemanticsProviderAndFacetAbstract<String>
-implements StringValueFacet {
-
-    private static final Class<? extends Facet> type() {
-        return StringValueFacet.class;
-    }
-
-    public static final int TYPICAL_LENGTH = 25;
-    private static final String DEFAULT_VALUE = null; // no default
-
-    public StringValueSemanticsProvider(final FacetHolder holder) {
-        super(type(), holder, String.class, TYPICAL_LENGTH, -1, Immutability.IMMUTABLE, EqualByContent.HONOURED, DEFAULT_VALUE);
-    }
-
-    // //////////////////////////////////////////////////////////////////
-    // Parser
-    // //////////////////////////////////////////////////////////////////
-
-    @Override
-    protected String doParse(final ValueSemanticsProvider.Context context, final String entry) {
-        if (entry.trim().equals("")) {
-            return null;
-        } else {
-            return entry;
-        }
-    }
-
-    @Override
-    public String titleString(final Object object) {
-        final String string = (String) (object == null ? "" : object);
-        return string;
-    }
-
-    // //////////////////////////////////////////////////////////////////
-    // EncoderDecoder
-    // //////////////////////////////////////////////////////////////////
-
-    @Override
-    public String toEncodedString(final String text) {
-        if (text.equals("NULL") || isEscaped(text)) {
-            return escapeText(text);
-        } else {
-            return text;
-        }
-    }
-
-    @Override
-    public String fromEncodedString(final String data) {
-        if (isEscaped(data)) {
-            return data.substring(1);
-        } else {
-            return data;
-        }
-    }
-
-    private boolean isEscaped(final String text) {
-        return text.startsWith("/");
-    }
-
-    private String escapeText(final String text) {
-        return "/" + text;
-    }
-
-}
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 ffb93ed..5530f57 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
@@ -105,7 +105,6 @@ import org.apache.isis.core.metamodel.facets.value.longs.LongPrimitiveValueFacet
 import org.apache.isis.core.metamodel.facets.value.longs.LongWrapperValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.shortint.ShortPrimitiveValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.shortint.ShortWrapperValueFacetUsingSemanticsProviderFactory;
-import org.apache.isis.core.metamodel.facets.value.string.StringValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.temporal.localdate.LocalDateValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.temporal.localdatetime.LocalDateTimeValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.temporal.localtime.LocalTimeValueFacetUsingSemanticsProviderFactory;
@@ -286,7 +285,6 @@ extends ProgrammingModelAbstract {
         addFactory(FacetProcessingOrder.G1_VALUE_TYPES, new JavaSqlTimeValueFacetUsingSemanticsProviderFactory(mmc));
         addFactory(FacetProcessingOrder.G1_VALUE_TYPES, new JavaSqlTimeStampValueFacetUsingSemanticsProviderFactory(mmc));
         addFactory(FacetProcessingOrder.G1_VALUE_TYPES, new JavaUtilDateValueFacetUsingSemanticsProviderFactory(mmc));
-        addFactory(FacetProcessingOrder.G1_VALUE_TYPES, new StringValueFacetUsingSemanticsProviderFactory(mmc));
 
         addFactory(FacetProcessingOrder.G1_VALUE_TYPES, new JavaAwtImageValueFacetUsingSemanticsProviderFactory(mmc));
 
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 1b4fbe6..30857f7 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(96, programmingModel.streamFactories().count());
+        assertEquals(95, programmingModel.streamFactories().count());
     }
 
     @Test //verify we have the javac -parameter flag set when compiling this class
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/StringValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/StringValueSemanticsProviderTest.java
index f6453c3..4ef5034 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/StringValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/StringValueSemanticsProviderTest.java
@@ -23,24 +23,19 @@ import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
 
-import org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetHolderAbstract;
-import org.apache.isis.core.metamodel.facets.value.string.StringValueSemanticsProvider;
+import org.apache.isis.core.metamodel.facets.value.string.StringValueSemantics;
 
-public class StringValueSemanticsProviderTest extends ValueSemanticsProviderAbstractTestCase {
+public class StringValueSemanticsProviderTest
+extends ValueSemanticsProviderAbstractTestCase {
 
-    private StringValueSemanticsProvider value;
+    private StringValueSemantics value;
 
     private String string;
 
-    private FacetHolder holder;
-
     @Before
     public void setUpObjects() throws Exception {
         string = "text entry";
-        holder = FacetHolderAbstract.forTesting(MetaModelContext_forTesting.buildDefault());
-        setValue(value = new StringValueSemanticsProvider(holder));
+        setSemanitcs(value = new StringValueSemantics());
     }
 
     @Test
@@ -54,27 +49,27 @@ public class StringValueSemanticsProviderTest extends ValueSemanticsProviderAbst
         assertEquals("tRUe", parsed.toString());
     }
 
-    @Test
-    public void testEncodeNormalString() throws Exception {
-        allowMockAdapterToReturn("/slash");
-        assertEquals("//slash", getEncodeableFacet().toEncodedString(mockAdapter));
-    }
-
-    @Test
-    public void testEncodeNULLString() throws Exception {
-        allowMockAdapterToReturn("NULL");
-        assertEquals("/NULL", getEncodeableFacet().toEncodedString(mockAdapter));
-    }
-
-    @Test
-    public void testRestore() throws Exception {
-        final Object parsed = value.fromEncodedString("//slash");
-        assertEquals("/slash", parsed.toString());
-    }
-
-    @Test
-    public void testRestoreNULLString() throws Exception {
-        final Object parsed = value.fromEncodedString("/NULL");
-        assertEquals("NULL", parsed.toString());
-    }
+//    @Test
+//    public void testEncodeNormalString() throws Exception {
+//        allowMockAdapterToReturn("/slash");
+//        assertEquals("//slash", getEncodeableFacet().toEncodedString(mockAdapter));
+//    }
+//
+//    @Test
+//    public void testEncodeNULLString() throws Exception {
+//        allowMockAdapterToReturn("NULL");
+//        assertEquals("/NULL", getEncodeableFacet().toEncodedString(mockAdapter));
+//    }
+//
+//    @Test
+//    public void testRestore() throws Exception {
+//        final Object parsed = value.fromEncodedString("//slash");
+//        assertEquals("/slash", parsed.toString());
+//    }
+//
+//    @Test
+//    public void testRestoreNULLString() throws Exception {
+//        final Object parsed = value.fromEncodedString("/NULL");
+//        assertEquals("NULL", parsed.toString());
+//    }
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
index cda6e78..2e281b8 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
@@ -36,7 +36,6 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.fail;
 
 import org.apache.isis.applib.adapters.AbstractValueSemanticsProvider;
-import org.apache.isis.applib.adapters.Renderer;
 import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.services.iactn.InteractionProvider;
 import org.apache.isis.commons.internal.base._Casts;
@@ -50,6 +49,7 @@ import org.apache.isis.core.metamodel.facets.object.encodeable.encoder.Encodable
 import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
 import org.apache.isis.core.metamodel.facets.object.parseable.parser.ParseableFacetUsingParser;
 import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract;
+import org.apache.isis.core.metamodel.facets.value.string.StringValueSemantics;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 
 public abstract class ValueSemanticsProviderAbstractTestCase {
@@ -158,7 +158,14 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
         Assume.assumeThat(valueSemanticsProvider.getParser(), is(not(nullValue())));
 
         final Object newValue = valueSemanticsProvider.getParser().parseTextRepresentation(null, "");
-        assertNull(newValue);
+
+        if(valueSemanticsProvider instanceof StringValueSemantics) {
+            // string parsing is an unary identity
+            assertEquals("", newValue);
+        } else {
+            assertNull(newValue);
+        }
+
     }
 
     @Test
@@ -183,6 +190,10 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
             assertEquals("",
                     ((ValueSemanticsProviderAndFacetAbstract<?>)valueSemanticsProvider)
                     .presentationValue(null, null));
+        } else if(valueSemanticsProvider instanceof StringValueSemantics) {
+            // string representation has null-to-empty semantics
+            assertEquals("",
+                    valueSemanticsProvider.getRenderer().presentationValue(null, null));
         } else {
             assertEquals(AbstractValueSemanticsProvider.NULL_REPRESENTATION,
                     valueSemanticsProvider.getRenderer().presentationValue(null, null));
diff --git a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/text/TextFieldFactory.java b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/text/TextFieldFactory.java
index edc1422..86d3ac4 100644
--- a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/text/TextFieldFactory.java
+++ b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/text/TextFieldFactory.java
@@ -22,10 +22,7 @@ import java.util.Optional;
 
 import javax.inject.Inject;
 
-import org.springframework.core.annotation.Order;
-
 import org.apache.isis.applib.annotation.PriorityPrecedence;
-import org.apache.isis.core.metamodel.facets.value.string.StringValueFacet;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedParameter;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedProperty;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -34,24 +31,25 @@ import org.apache.isis.incubator.viewer.javafx.ui.components.UiComponentHandlerF
 import org.apache.isis.viewer.common.model.binding.BindingConverter;
 import org.apache.isis.viewer.common.model.components.UiComponentFactory.ComponentRequest;
 
-import javafx.scene.Node;
-import javafx.scene.control.TextField;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.val;
 
+import javafx.scene.Node;
+import javafx.scene.control.TextField;
+
 @org.springframework.stereotype.Component
 @javax.annotation.Priority(PriorityPrecedence.MIDPOINT)
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class TextFieldFactory implements UiComponentHandlerFx {
 
     @Override
-    public boolean isHandling(ComponentRequest request) {
-        return request.hasFeatureTypeFacet(StringValueFacet.class);
+    public boolean isHandling(final ComponentRequest request) {
+        return request.hasFacetForValueType(String.class);
     }
 
     @Override
-    public Node handle(ComponentRequest request) {
+    public Node handle(final ComponentRequest request) {
 
         val uiComponent = new TextField();
         val valueSpec = request.getFeatureTypeSpec();
@@ -94,17 +92,17 @@ public class TextFieldFactory implements UiComponentHandlerFx {
         private final ObjectSpecification valueSpecification;
 
         @Override
-        public String toString(String value) {
+        public String toString(final String value) {
             return value; // identity
         }
 
         @Override
-        public String fromString(String stringifiedValue) {
+        public String fromString(final String stringifiedValue) {
             return stringifiedValue; // identity
         }
 
         @Override
-        public Optional<String> tryParse(String stringifiedValue) {
+        public Optional<String> tryParse(final String stringifiedValue) {
             return Optional.empty(); // always ok
         }
 
diff --git a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/blob/BlobFieldFactory.java b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/blob/BlobFieldFactory.java
index d6a9cb3..f679a60 100644
--- a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/blob/BlobFieldFactory.java
+++ b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/blob/BlobFieldFactory.java
@@ -33,7 +33,7 @@ public class BlobFieldFactory implements UiComponentHandlerVaa {
 
     @Override
     public boolean isHandling(final ComponentRequest request) {
-        return request.hasValueFacet(Blob.class);
+        return request.hasFacetForValueType(Blob.class);
     }
 
     @Override
diff --git a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/clob/ClobFieldFactory.java b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/clob/ClobFieldFactory.java
index 4913a86..e597478 100644
--- a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/clob/ClobFieldFactory.java
+++ b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/clob/ClobFieldFactory.java
@@ -33,7 +33,7 @@ public class ClobFieldFactory implements UiComponentHandlerVaa {
 
     @Override
     public boolean isHandling(final ComponentRequest request) {
-        return request.hasValueFacet(Clob.class);
+        return request.hasFacetForValueType(Clob.class);
     }
 
     @Override
diff --git a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/text/TextFieldFactory.java b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/text/TextFieldFactory.java
index b3a415d..525344a 100644
--- a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/text/TextFieldFactory.java
+++ b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/text/TextFieldFactory.java
@@ -22,7 +22,6 @@ import com.vaadin.flow.component.Component;
 import com.vaadin.flow.component.textfield.TextField;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
-import org.apache.isis.core.metamodel.facets.value.string.StringValueFacet;
 import org.apache.isis.incubator.viewer.vaadin.ui.binding.BindingsVaa;
 import org.apache.isis.incubator.viewer.vaadin.ui.components.UiComponentHandlerVaa;
 import org.apache.isis.viewer.common.model.components.UiComponentFactory.ComponentRequest;
@@ -35,7 +34,7 @@ public class TextFieldFactory implements UiComponentHandlerVaa {
 
     @Override
     public boolean isHandling(final ComponentRequest request) {
-        return request.hasFeatureTypeFacet(StringValueFacet.class);
+        return request.hasFacetForValueType(String.class);
     }
 
     @Override
diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/components/UiComponentFactory.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/components/UiComponentFactory.java
index e5fbcd2..43caab3 100644
--- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/components/UiComponentFactory.java
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/components/UiComponentFactory.java
@@ -115,7 +115,7 @@ public interface UiComponentFactory<B, C> {
                     : false;
         }
 
-        public boolean hasValueFacet(final @Nullable Class<?> valueType) {
+        public boolean hasFacetForValueType(final @Nullable Class<?> valueType) {
             return valueType!=null
                     ? getFeatureTypeSpec().lookupFacet(ValueFacet.class)
                             .map(ValueFacet::getValueType)
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 012ad9c..b25c502 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
@@ -26,7 +26,6 @@ import org.apache.isis.core.metamodel.facets.objectvalue.fileaccept.FileAcceptFa
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacet;
 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.facets.value.string.StringValueSemanticsProvider;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 
@@ -73,9 +72,9 @@ public interface ScalarUiModel {
                 .orElse(null);
     }
 
-    default int getTypicalLength() {
+    default Integer getTypicalLength() {
         final TypicalLengthFacet facet = getMetaModel().getFacet(TypicalLengthFacet.class);
-        return facet != null? facet.value() : StringValueSemanticsProvider.TYPICAL_LENGTH;
+        return facet != null? facet.value() : null;
     }
 
     default String getFileAccept() {