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/17 12:37:38 UTC

[isis] branch master updated: ISIS-2871: remove parseable facet

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 f759d34  ISIS-2871: remove parseable facet
f759d34 is described below

commit f759d34e1a42668e276d59aba7276884a6eeb53c
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Sep 17 14:35:40 2021 +0200

    ISIS-2871: remove parseable facet
---
 .../internal/binding/_BindableAbstract.java        |  18 ++-
 .../choices/enums/EnumValueSemanticsProvider.java  |   6 +-
 .../facets/object/parseable/ParseableFacet.java    |  54 --------
 .../parseable/ParseableFacetUsingParser.java       | 154 ---------------------
 ...ionOrAnyMatchingValueSemanticsFacetFactory.java |   4 -
 .../ValueFacetUsingSemanticsProviderFactory.java   |   3 -
 .../ValueSemanticsProviderAndFacetAbstract.java    |  16 ++-
 .../chg/v2/ChangesDtoValueSemanticsProvider.java   |   4 +-
 .../cmd/v2/CommandDtoValueSemanticsProvider.java   |   4 +-
 .../v2/InteractionDtoValueSemanticsProvider.java   |   4 +-
 .../ValueSemanticsProviderAbstractTemporal.java    |   2 +-
 .../BigIntegerValueSemanticsProvider.java          |   2 +-
 .../bytes/ByteValueSemanticsProviderAbstract.java  |   2 +-
 .../chars/CharValueSemanticsProviderAbstract.java  |   2 +-
 .../JodaLocalDateValueSemanticsProvider.java       |   4 +-
 .../JodaLocalDateTimeValueSemanticsProvider.java   |   4 +-
 .../DoubleValueSemanticsProviderAbstract.java      |   2 +-
 .../FloatValueSemanticsProviderAbstract.java       |   2 +-
 .../image/ImageValueSemanticsProviderAbstract.java |   2 +-
 .../integer/IntValueSemanticsProviderAbstract.java |   2 +-
 .../longs/LongValueSemanticsProviderAbstract.java  |   2 +-
 .../ShortValueSemanticsProviderAbstract.java       |   2 +-
 .../TemporalValueSemanticsProviderAbstract.java    |   2 +-
 .../managed/ParameterNegotiationModel.java         |  21 +--
 .../managed/PropertyNegotiationModel.java          |  28 ++--
 .../interactions/managed/_BindingUtil.java         |  97 +++++++++++++
 .../core/metamodel/spec/ObjectSpecification.java   |  10 --
 .../specimpl/ObjectSpecificationAbstract.java      |   6 -
 .../core/metamodel/util/snapshot/XmlSnapshot.java  |  13 +-
 .../parseable/ParseableFacetUsingParserTest.java   | 124 -----------------
 .../facets/object/parseable/ValueProxy.java        |  23 ---
 .../ValueSemanticsProviderAbstractTestCase.java    |  10 --
 .../testspec/ObjectSpecificationStub.java          |   5 -
 .../binding/NumberConverterForStringComponent.java |   8 +-
 .../viewer/wicket/model/models/ScalarModel.java    |  26 +---
 35 files changed, 164 insertions(+), 504 deletions(-)

diff --git a/commons/src/main/java/org/apache/isis/commons/internal/binding/_BindableAbstract.java b/commons/src/main/java/org/apache/isis/commons/internal/binding/_BindableAbstract.java
index d1075cf..c43e178 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/binding/_BindableAbstract.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/binding/_BindableAbstract.java
@@ -154,18 +154,24 @@ public abstract class _BindableAbstract<T> implements Bindable<T> {
             if(isReverseUpdating.get()) {
                 return;
             }
-            isForwardUpdating.set(true);
-            newBindable.setValue(forwardMapper.apply(n));
-            isForwardUpdating.set(false);
+            try {
+                isForwardUpdating.set(true);
+                newBindable.setValue(forwardMapper.apply(n));
+            } finally {
+                isForwardUpdating.set(false);
+            }
         });
 
         newBindable.addListener((e,o,n)->{
             if(isForwardUpdating.get()) {
                 return;
             }
-            isReverseUpdating.set(true);
-            setValue(reverseMapper.apply(n));
-            isReverseUpdating.set(false);
+            try {
+                isReverseUpdating.set(true);
+                setValue(reverseMapper.apply(n));
+            } finally {
+                isReverseUpdating.set(false);
+            }
         });
 
         return newBindable;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java
index ca3c2e9..1f53a39 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java
@@ -106,7 +106,7 @@ implements EnumFacet {
 
     @Override
     public String toEncodedString(final T object) {
-        return titleString(object);
+        return asTitleString(object);
     }
 
     @Override
@@ -116,7 +116,7 @@ implements EnumFacet {
 
 
     @Override
-    protected String titleString(final Object object) {
+    protected String asTitleString(final T object) {
         val translationService = getTranslationService();
 
         if (titleMethod != null) {
@@ -139,7 +139,7 @@ implements EnumFacet {
         }
 
         // simply translate the enum constant's name
-        val objectAsEnum = (Enum<?>) object;
+        val objectAsEnum = object;
         val translationContext = TranslationContext.forEnum(objectAsEnum);
         final String friendlyNameOfEnum = Enums.getFriendlyNameOf(objectAsEnum.name());
         return translationService.translate(translationContext, friendlyNameOfEnum);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacet.java
deleted file mode 100644
index d0c9f40..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacet.java
+++ /dev/null
@@ -1,54 +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.object.parseable;
-
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-
-/**
- * Indicates that this class can parse an entry string.
- */
-public interface ParseableFacet extends Facet {
-
-    /**
-     * Parses a text entry made by a user and sets the domain object's value.
-     *
-     * <p>
-     * Equivalent to <tt>Parser#parseTextEntry(Object, String)</tt>, though may
-     * be implemented through some other mechanism.
-     */
-    ManagedObject parseTextEntry(
-            final ManagedObject original,
-            final String text,
-            final InteractionInitiatedBy interactionInitiatedBy);
-
-    /**
-     * A title for the object that is valid but which may be easier to edit than
-     * the title provided by a {@link TitleFacet}.
-     *
-     * <p>
-     * The idea here is that the viewer can display a parseable title for an
-     * existing object when, for example, the user initially clicks in the
-     * field. So, a date might be rendered via a {@link TitleFacet} as
-     * <tt>May 2, 2007</tt>, but its parseable form might be <tt>20070502</tt>.
-     */
-    String parseableTextRepresentation(ManagedObject obj);
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacetUsingParser.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacetUsingParser.java
deleted file mode 100644
index f4cc772..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacetUsingParser.java
+++ /dev/null
@@ -1,154 +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.object.parseable;
-
-import java.util.IllegalFormatException;
-import java.util.function.BiConsumer;
-
-import org.springframework.lang.Nullable;
-
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.adapters.Parser;
-import org.apache.isis.applib.adapters.ParsingException;
-import org.apache.isis.applib.adapters.ValueSemanticsProvider;
-import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
-import org.apache.isis.commons.internal.base._Casts;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.consent.InteractionResultSet;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetHolderAbstract;
-import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
-import org.apache.isis.core.metamodel.interactions.InteractionHead;
-import org.apache.isis.core.metamodel.interactions.InteractionUtils;
-import org.apache.isis.core.metamodel.interactions.ObjectValidityContext;
-import org.apache.isis.core.metamodel.interactions.ParseValueContext;
-import org.apache.isis.core.metamodel.interactions.ValidityContext;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-
-import lombok.NonNull;
-import lombok.val;
-
-public final class ParseableFacetUsingParser
-extends FacetAbstract
-implements ParseableFacet {
-
-    private final @NonNull Parser<?> parser;
-
-    public static ParseableFacetUsingParser create(
-            final Parser<?> parser,
-            final FacetHolder holder) {
-        return new ParseableFacetUsingParser(parser, holder);
-    }
-
-    private ParseableFacetUsingParser(
-            final Parser<?> parser,
-            final FacetHolder holder) {
-
-        super(ParseableFacet.class, holder);
-        this.parser = parser;
-    }
-
-    @Override
-    public boolean semanticEquals(final @NonNull Facet other) {
-        return other instanceof ParseableFacetUsingParser
-                ? this.parser.getClass() == ((ParseableFacetUsingParser)other).parser.getClass()
-                : false;
-    }
-
-    @Override
-    public void visitAttributes(final BiConsumer<String, Object> visitor) {
-        super.visitAttributes(visitor);
-        visitor.accept("parser", parser.toString());
-    }
-
-    @Override
-    public ManagedObject parseTextEntry(
-            final @Nullable ManagedObject contextAdapter,
-            final String entry,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-
-        if (entry == null) {
-            throw new IllegalArgumentException("An entry must be provided");
-        }
-
-        // check string is valid
-        // (eg pick up any @RegEx on value type)
-        if (contextAdapter!=null
-                && getFacetHolder().containsFacet(ValueFacet.class)) {
-
-            val entryAdapter = getObjectManager().adapt(entry);
-            final Identifier identifier = getFacetHolder().getFeatureIdentifier();
-            final ParseValueContext parseValueContext =
-                    new ParseValueContext(
-                            InteractionHead.regular(contextAdapter), identifier, entryAdapter, interactionInitiatedBy
-                            );
-            validate(parseValueContext);
-        }
-
-        try {
-            final Object parsed = parser.parseTextRepresentation(valueSemanticsContext(), entry);
-            if (parsed == null) {
-                return null;
-            }
-
-            // check resultant object is also valid
-            // (eg pick up any validate() methods on it)
-            val adapter = getObjectManager().adapt(parsed);
-            final ObjectSpecification specification = adapter.getSpecification();
-            final ObjectValidityContext validateContext =
-                    specification.createValidityInteractionContext(
-                            adapter, interactionInitiatedBy);
-            validate(validateContext);
-
-            return adapter;
-        } catch (final NumberFormatException | IllegalFormatException | ParsingException e) {
-            throw new TextEntryParseException(e.getMessage(), e);
-        }
-    }
-
-    private void validate(final ValidityContext validityContext) {
-        final InteractionResultSet resultSet = new InteractionResultSet();
-        InteractionUtils.isValidResultSet(getFacetHolder(), validityContext, resultSet);
-        if (resultSet.isVetoed()) {
-            throw new IllegalArgumentException(resultSet.getInteractionResult().getReason());
-        }
-    }
-
-    @Override
-    public String parseableTextRepresentation(final ManagedObject contextAdapter) {
-        final Object pojo = UnwrapUtil.single(contextAdapter);
-
-        return parser.parseableTextRepresentation(valueSemanticsContext(), _Casts.uncheckedCast(pojo));
-    }
-
-    private ValueSemanticsProvider.Context valueSemanticsContext() {
-        val iaProvider = super.getInteractionProvider();
-        if(iaProvider==null) {
-            return null; // JUnit context
-        }
-        return ValueSemanticsProvider.Context.of(
-                ((FacetHolderAbstract)getFacetHolder()).getFeatureIdentifier(),
-                iaProvider.currentInteractionContext().orElse(null));
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java
index 997e6f1..90304b4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java
@@ -36,7 +36,6 @@ import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.facets.object.icon.IconFacet;
 import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet;
 import org.apache.isis.core.metamodel.facets.object.parented.ParentedCollectionFacet;
-import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
 import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.annotation.LogicalTypeFacetForValueAnnotation;
@@ -58,9 +57,6 @@ import lombok.extern.log4j.Log4j2;
  * <p>
  * In addition, the following facets may be installed:
  * <ul>
- * <li> {@link ParseableFacet} - if a {@link Parser} has been specified
- * explicitly in the annotation (or is picked up through an external
- * configuration file)</li>
  * <li> {@link EncodableFacet} - if an {@link EncoderDecoder} has been specified
  * explicitly in the annotation (or is picked up through an external
  * configuration file)</li>
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueFacetUsingSemanticsProviderFactory.java
index 2348af4..db4fe5d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueFacetUsingSemanticsProviderFactory.java
@@ -25,14 +25,12 @@ import org.apache.isis.applib.adapters.Renderer;
 import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.object.defaults.DefaultedFacetUsingDefaultsProvider;
 import org.apache.isis.core.metamodel.facets.object.encodeable.encoder.EncodableFacetUsingEncoderDecoder;
-import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacetUsingParser;
 import org.apache.isis.core.metamodel.facets.object.title.parser.TitleFacetUsingRenderer;
 import org.apache.isis.core.metamodel.facets.object.value.ImmutableFacetViaValueSemantics;
 import org.apache.isis.core.metamodel.facets.object.value.MaxLengthFacetUsingParser;
@@ -90,7 +88,6 @@ extends FacetFactoryAbstract {
 
                 //holder.getServiceInjector().injectServicesInto(parser);
 
-                holder.addFacet(ParseableFacetUsingParser.create(parser, holder));
                 holder.addFacet(new TypicalLengthFacetUsingParser(parser, holder));
                 final int maxLength = parser.maxLength();
                 if(maxLength >=0) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsProviderAndFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsProviderAndFacetAbstract.java
index e1ff842..9ecb561 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsProviderAndFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsProviderAndFacetAbstract.java
@@ -38,7 +38,9 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 @Deprecated
 public abstract class ValueSemanticsProviderAndFacetAbstract<T>
 extends FacetAbstract
-implements ValueSemanticsProvider<T>, Renderer<T>, EncoderDecoder<T>, Parser<T>, DefaultsProvider<T> {
+implements
+    ValueSemanticsProvider<T>,
+    Renderer<T>, EncoderDecoder<T>, Parser<T>, DefaultsProvider<T> {
 
     private final Class<T> adaptedClass;
     private final int typicalLength;
@@ -188,29 +190,29 @@ implements ValueSemanticsProvider<T>, Renderer<T>, EncoderDecoder<T>, Parser<T>,
     }
 
     @Override
-    public String presentationValue(final ValueSemanticsProvider.Context context, final Object object) {
+    public String presentationValue(final ValueSemanticsProvider.Context context, final T object) {
         if (object == null) {
             return "";
         }
-        return titleString(object);
+        return asTitleString(object);
     }
 
     /**
-     * Defaults to {@link Parser#presentationValue(org.apache.isis.applib.adapters.Parser.Context, Object)}.
+     * Defaults to {@link Parser#parseableTextRepresentation(org.apache.isis.applib.adapters.ValueSemanticsProvider.Context, Object)
      */
     @Override
-    public String parseableTextRepresentation(final ValueSemanticsProvider.Context context, final Object existing) {
+    public String parseableTextRepresentation(final ValueSemanticsProvider.Context context, final T existing) {
         return presentationValue(context, existing);
     }
 
-    protected String titleString(final Format formatter, final Object object) {
+    protected String titleString(final Format formatter, final T object) {
         return object == null ? "" : formatter.format(object);
     }
 
     /**
      * Return a string representation of aforesaid object.
      */
-    protected abstract String titleString(Object object);
+    protected abstract String asTitleString(T object);
 
     @Override
     public final int typicalLength() {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/chg/v2/ChangesDtoValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/chg/v2/ChangesDtoValueSemanticsProvider.java
index 35b3acf..4cd4dd3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/chg/v2/ChangesDtoValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/chg/v2/ChangesDtoValueSemanticsProvider.java
@@ -52,9 +52,9 @@ implements ChangesDtoValueFacet {
     }
 
     @Override
-    public String titleString(final Object object) {
+    public String asTitleString(final ChangesDto object) {
         if (object == null) return "[null]";
-        final ChangesDto changesDto = (ChangesDto) object;
+        final ChangesDto changesDto = object;
         return ChangesDtoUtils.toXml(changesDto);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/cmd/v2/CommandDtoValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/cmd/v2/CommandDtoValueSemanticsProvider.java
index 2d706d2..966a089 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/cmd/v2/CommandDtoValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/cmd/v2/CommandDtoValueSemanticsProvider.java
@@ -51,9 +51,9 @@ implements CommandDtoValueFacet {
     }
 
     @Override
-    public String titleString(final Object object) {
+    public String asTitleString(final CommandDto object) {
         if (object == null) return "[null]";
-        val commandDto = (CommandDto) object;
+        val commandDto = object;
         return CommandDtoUtils.toXml(commandDto);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/ixn/v2/InteractionDtoValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/ixn/v2/InteractionDtoValueSemanticsProvider.java
index 401bf8f..ce9a4d4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/ixn/v2/InteractionDtoValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/ixn/v2/InteractionDtoValueSemanticsProvider.java
@@ -51,9 +51,9 @@ implements InteractionDtoValueFacet {
     }
 
     @Override
-    public String titleString(final Object object) {
+    public String asTitleString(final InteractionDto object) {
         if (object == null) return "[null]";
-        final InteractionDto interactionDto = (InteractionDto) object;
+        final InteractionDto interactionDto = object;
         return InteractionDtoUtils.toXml(interactionDto);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTemporal.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTemporal.java
index c3813f0..c5bda7a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTemporal.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTemporal.java
@@ -221,7 +221,7 @@ implements DateValueFacet {
     // ///////////////////////////////////////////////////////////////////////////
 
     @Override
-    public String titleString(final Object value) {
+    public String asTitleString(final T value) {
         if (value == null) {
             return null;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/biginteger/BigIntegerValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/biginteger/BigIntegerValueSemanticsProvider.java
index 53c56b8..13479a8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/biginteger/BigIntegerValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/biginteger/BigIntegerValueSemanticsProvider.java
@@ -75,7 +75,7 @@ implements BigIntegerValueFacet {
     }
 
     @Override
-    public String titleString(final Object object) {
+    public String asTitleString(final BigInteger object) {
         return titleString(format, object);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bytes/ByteValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bytes/ByteValueSemanticsProviderAbstract.java
index eac566f..9f0e4b2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bytes/ByteValueSemanticsProviderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bytes/ByteValueSemanticsProviderAbstract.java
@@ -69,7 +69,7 @@ implements ByteValueFacet {
     }
 
     @Override
-    public String titleString(final Object value) {
+    public String asTitleString(final Byte value) {
         return titleString(format, value);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/chars/CharValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/chars/CharValueSemanticsProviderAbstract.java
index 71ef2b7..b797b07 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/chars/CharValueSemanticsProviderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/chars/CharValueSemanticsProviderAbstract.java
@@ -55,7 +55,7 @@ implements CharValueFacet {
     }
 
     @Override
-    public String titleString(final Object value) {
+    public String asTitleString(final Character value) {
         return value == null ? "" : value.toString();
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejodalocal/JodaLocalDateValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejodalocal/JodaLocalDateValueSemanticsProvider.java
index 5aee141..be6f8ff 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejodalocal/JodaLocalDateValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejodalocal/JodaLocalDateValueSemanticsProvider.java
@@ -175,11 +175,11 @@ implements JodaLocalDateValueFacet {
     // ///////////////////////////////////////////////////////////////////////////
 
     @Override
-    public String titleString(final Object value) {
+    public String asTitleString(final LocalDate value) {
         if (value == null) {
             return null;
         }
-        final LocalDate date = (LocalDate) value;
+        final LocalDate date = value;
         DateTimeFormatter f = titleStringFormatter.withLocale(Locale.getDefault());
         return JodaLocalDateUtil.titleString(f, date);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeValueSemanticsProvider.java
index 7a7619f..33fbf54 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeValueSemanticsProvider.java
@@ -177,11 +177,11 @@ implements JodaLocalDateTimeValueFacet {
     // ///////////////////////////////////////////////////////////////////////////
 
     @Override
-    public String titleString(final Object value) {
+    public String asTitleString(final LocalDateTime value) {
         if (value == null) {
             return null;
         }
-        final LocalDateTime dateTime = (LocalDateTime) value;
+        final LocalDateTime dateTime = value;
         final DateTimeFormatter f = titleStringFormatter.withLocale(Locale.getDefault());
         return JodaLocalDateTimeUtil.titleString(f, dateTime);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/doubles/DoubleValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/doubles/DoubleValueSemanticsProviderAbstract.java
index 63c36fa..a3a10f0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/doubles/DoubleValueSemanticsProviderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/doubles/DoubleValueSemanticsProviderAbstract.java
@@ -73,7 +73,7 @@ implements DoubleFloatingPointValueFacet {
     // ///////////////////////////////////////////////////////////////////////////
 
     @Override
-    public String titleString(final Object value) {
+    public String asTitleString(final Double value) {
         return titleString(format, value);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/floats/FloatValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/floats/FloatValueSemanticsProviderAbstract.java
index 20c4719..8957c77 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/floats/FloatValueSemanticsProviderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/floats/FloatValueSemanticsProviderAbstract.java
@@ -70,7 +70,7 @@ implements FloatingPointValueFacet {
     }
 
     @Override
-    public String titleString(final Object value) {
+    public String asTitleString(final Float value) {
         return titleString(format, value);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/image/ImageValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/image/ImageValueSemanticsProviderAbstract.java
index 9c17a8e..292968d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/image/ImageValueSemanticsProviderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/image/ImageValueSemanticsProviderAbstract.java
@@ -50,7 +50,7 @@ implements ImageValueFacet {
     }
 
     @Override
-    public String titleString(final Object value) {
+    public String asTitleString(final T value) {
         return "image";
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/integer/IntValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/integer/IntValueSemanticsProviderAbstract.java
index 73e4651..a46f00d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/integer/IntValueSemanticsProviderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/integer/IntValueSemanticsProviderAbstract.java
@@ -74,7 +74,7 @@ implements IntegerValueFacet {
     }
 
     @Override
-    public String titleString(final Object value) {
+    public String asTitleString(final Integer value) {
         return titleString(format, value);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/longs/LongValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/longs/LongValueSemanticsProviderAbstract.java
index 478972a..d3388ab 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/longs/LongValueSemanticsProviderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/longs/LongValueSemanticsProviderAbstract.java
@@ -70,7 +70,7 @@ implements LongValueFacet {
     }
 
     @Override
-    public String titleString(final Object value) {
+    public String asTitleString(final Long value) {
         return titleString(format, value);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/shortint/ShortValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/shortint/ShortValueSemanticsProviderAbstract.java
index 087ae92..22e39d2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/shortint/ShortValueSemanticsProviderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/shortint/ShortValueSemanticsProviderAbstract.java
@@ -72,7 +72,7 @@ implements ShortValueFacet {
     }
 
     @Override
-    public String titleString(final Object value) {
+    public String asTitleString(final Short value) {
         return titleString(format, value);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueSemanticsProviderAbstract.java
index 680261f..b08afc7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueSemanticsProviderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueSemanticsProviderAbstract.java
@@ -228,7 +228,7 @@ implements TemporalValueFacet<T> {
     // -- TITLE
 
     @Override
-    public String titleString(final Object value) {
+    public String asTitleString(final T value) {
         if (value == null) {
             return null;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ParameterNegotiationModel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ParameterNegotiationModel.java
index 781b526..993da19 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ParameterNegotiationModel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ParameterNegotiationModel.java
@@ -227,7 +227,7 @@ public class ParameterNegotiationModel {
         @Getter @NonNull private final _BindableAbstract<String> bindableParamSearchArgument;
         @Getter @NonNull private final LazyObservable<Can<ManagedObject>> observableParamChoices;
 
-        private final @NonNull Bindable<String> bindableParamAsText;
+        private Bindable<String> bindableParamAsText;
 
         private ParameterModel(
                 final int paramNr,
@@ -245,21 +245,6 @@ public class ParameterNegotiationModel {
                 getNegotiationModel().onNewParamValue();
             });
 
-            // value types should have associated parsers/formatters via value semantics
-            bindableParamAsText = action.getReturnType().lookupFacet(ValueFacet.class)
-            .map(valueFacet->valueFacet.selectParserForParameterElseFallback(metaModel))
-            .map(parser->bindableParamValue
-                        .mapToBindable(
-                                value->parser.parseableTextRepresentation(null, value.getPojo()),
-                                text->ManagedObject.of(null, parser.parseTextRepresentation(null, text)))
-            )
-            .orElseGet(()->
-                // fallback Bindable that is floating free (unbound)
-                // writing to it has no effect on the domain
-                _Bindables.forValue(String.format("Could not find a ValueFacet for type %s",
-                        action.getReturnType().getLogicalType()))
-            );
-
             // has either autoComplete, choices, or none
             observableParamChoices = metaModel.hasAutoComplete()
             ? _Observables.forFactory(()->
@@ -323,6 +308,10 @@ public class ParameterNegotiationModel {
 
         @Override
         public Bindable<String> getValueAsParsableText() {
+            if(bindableParamAsText==null) {
+                // value types should have associated parsers/formatters via value semantics
+                bindableParamAsText = _BindingUtil.bindAsParsableText(metaModel, bindableParamValue);
+            }
             return bindableParamAsText;
         }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyNegotiationModel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyNegotiationModel.java
index 91f03da..df0cfa3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyNegotiationModel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyNegotiationModel.java
@@ -26,13 +26,11 @@ import org.apache.isis.commons.internal.binding._Bindables;
 import org.apache.isis.commons.internal.binding._Observables;
 import org.apache.isis.commons.internal.binding._Observables.LazyObservable;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjects;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 import lombok.NonNull;
-import lombok.val;
 
 public class PropertyNegotiationModel implements ManagedValue {
 
@@ -41,7 +39,7 @@ public class PropertyNegotiationModel implements ManagedValue {
     private final @NonNull _BindableAbstract<String> searchArgument;
     private final @NonNull LazyObservable<Can<ManagedObject>> choices;
     private final @NonNull ManagedProperty managedProperty;
-    private final @NonNull Bindable<String> proposedValueAsText;
+    private Bindable<String> proposedValueAsText;
 
     PropertyNegotiationModel(final ManagedProperty managedProperty) {
         this.managedProperty = managedProperty;
@@ -49,8 +47,8 @@ public class PropertyNegotiationModel implements ManagedValue {
 
         validationFeedbackActive = _Bindables.forValue(false);
 
-        val currentValue = managedProperty.getPropertyValue();
-        val defaultValue = ManagedObjects.isNullOrUnspecifiedOrEmpty(currentValue)
+        final var currentValue = managedProperty.getPropertyValue();
+        final var defaultValue = ManagedObjects.isNullOrUnspecifiedOrEmpty(currentValue)
             ? propMeta.getDefault(managedProperty.getOwner())
             : currentValue;
 
@@ -59,21 +57,6 @@ public class PropertyNegotiationModel implements ManagedValue {
             invalidateChoicesAndValidation();
         });
 
-        // value types should have associated parsers/formatters via value semantics
-        proposedValueAsText = propMeta.getOnType().lookupFacet(ValueFacet.class)
-        .map(valueFacet->valueFacet.selectParserForPropertyElseFallback(propMeta))
-        .map(parser->proposedValue
-                    .mapToBindable(
-                            value->parser.parseableTextRepresentation(null, value.getPojo()),
-                            text->ManagedObject.of(null, parser.parseTextRepresentation(null, text)))
-        )
-        .orElseGet(()->
-            // fallback Bindable that is floating free (unbound)
-            // writing to it has no effect on the domain
-            _Bindables.forValue(String.format("Could not find a ValueFacet for type %s",
-                    propMeta.getOnType().getLogicalType()))
-        );
-
         // has either autoComplete, choices, or none
         choices = propMeta.hasAutoComplete()
         ? _Observables.forFactory(()->
@@ -115,6 +98,11 @@ public class PropertyNegotiationModel implements ManagedValue {
 
     @Override
     public Bindable<String> getValueAsParsableText() {
+        if(proposedValueAsText==null) {
+            // value types should have associated parsers/formatters via value semantics
+            proposedValueAsText = _BindingUtil
+                    .bindAsParsableText(managedProperty.getMetaModel(), proposedValue);
+        }
         return proposedValueAsText;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/_BindingUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/_BindingUtil.java
new file mode 100644
index 0000000..9299d38
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/_BindingUtil.java
@@ -0,0 +1,97 @@
+/*
+ *  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.interactions.managed;
+
+import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider.Context;
+import org.apache.isis.commons.binding.Bindable;
+import org.apache.isis.commons.internal.binding._BindableAbstract;
+import org.apache.isis.commons.internal.binding._Bindables;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+
+import lombok.NonNull;
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
+class _BindingUtil {
+
+    Bindable<String> bindAsParsableText(
+            final @NonNull ObjectActionParameter param,
+            final @NonNull _BindableAbstract<ManagedObject> bindableParamValue) {
+
+        final var spec = param.getSpecification();
+
+        if(param.getFeatureType() == FeatureType.ACTION_PARAMETER_COLLECTION) {
+            _Bindables.forValue(String.format("Non-scalar action parameters are not parseable: %s",
+                    param.getFeatureIdentifier()));
+        }
+
+        // value types should have associated parsers/formatters via value semantics
+        return spec.lookupFacet(ValueFacet.class)
+        .map(valueFacet->valueFacet.selectParserForParameterElseFallback(param))
+        .map(parser->bindAsParsableText(spec, bindableParamValue, parser, null))
+        .orElseGet(()->
+            // fallback Bindable that is floating free (unbound)
+            // writing to it has no effect on the domain
+            _Bindables.forValue(String.format("Could not find a ValueFacet for type %s",
+                    spec.getLogicalType()))
+        );
+
+    }
+
+    Bindable<String> bindAsParsableText(
+            final @NonNull OneToOneAssociation prop,
+            final @NonNull _BindableAbstract<ManagedObject> bindablePropertyValue) {
+
+        final var spec = prop.getSpecification();
+
+        // value types should have associated parsers/formatters via value semantics
+        return spec.lookupFacet(ValueFacet.class)
+        .map(valueFacet->valueFacet.selectParserForPropertyElseFallback(prop))
+        .map(parser->bindAsParsableText(spec, bindablePropertyValue, parser, null))
+        .orElseGet(()->
+            // fallback Bindable that is floating free (unbound)
+            // writing to it has no effect on the domain
+            _Bindables.forValue(String.format("Could not find a ValueFacet for type %s",
+                    spec.getLogicalType()))
+        );
+
+    }
+
+    private Bindable<String> bindAsParsableText(
+            final @NonNull ObjectSpecification spec,
+            final @NonNull _BindableAbstract<ManagedObject> bindableValue,
+            final @NonNull Parser parser,
+            final Context context) {
+
+        return bindableValue.mapToBindable(
+                value->{
+                    final var pojo = ManagedObjects.UnwrapUtil.single(value);
+                    return parser.parseableTextRepresentation(context, pojo);
+                },
+                text->ManagedObject.of(spec, parser.parseTextRepresentation(context, text)));
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
index 54d5a5f..f6cab8f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
@@ -57,7 +57,6 @@ import org.apache.isis.core.metamodel.facets.object.icon.IconFacet;
 import org.apache.isis.core.metamodel.facets.object.icon.ObjectIcon;
 import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet;
 import org.apache.isis.core.metamodel.facets.object.parented.ParentedCollectionFacet;
-import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
 import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
@@ -374,15 +373,6 @@ extends
     }
 
     /**
-     * Determines if objects of this type can be set up from a text entry
-     * string.
-     *
-     * <p>
-     * In effect, means has got a {@link ParseableFacet}.
-     */
-    boolean isParseable();
-
-    /**
      * Determines if objects of this type can be converted to a data-stream.
      *
      * <p>
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index 2d9706d..0913d6b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -68,7 +68,6 @@ import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet
 import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacet;
 import org.apache.isis.core.metamodel.facets.object.navparent.NavigableParentFacet;
 import org.apache.isis.core.metamodel.facets.object.parented.ParentedCollectionFacet;
-import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
 import org.apache.isis.core.metamodel.interactions.InteractionContext;
 import org.apache.isis.core.metamodel.interactions.InteractionUtils;
@@ -853,11 +852,6 @@ implements ObjectSpecification {
     }
 
     @Override
-    public boolean isParseable() {
-        return containsFacet(ParseableFacet.class);
-    }
-
-    @Override
     public boolean isEncodeable() {
         return containsFacet(EncodableFacet.class);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/snapshot/XmlSnapshot.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/snapshot/XmlSnapshot.java
index c510489..11d26a7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/snapshot/XmlSnapshot.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/snapshot/XmlSnapshot.java
@@ -47,7 +47,6 @@ import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facets.collections.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
-import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
 import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjects;
@@ -57,7 +56,6 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
-import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
 /**
@@ -450,7 +448,7 @@ public class XmlSnapshot implements Snapshot {
         final ObjectSpecification nos = object.getSpecification();
         // HACK: really want a ObjectSpecification.hasField method to
         // check first.
-        val field = nos.getAssociation(fieldName).orElse(null);
+        final var field = nos.getAssociation(fieldName).orElse(null);
         if (field == null) {
             if (log.isInfoEnabled()) {
                 log.info("includeField(Pl, Vec, Str): could not locate field, skipping");
@@ -464,7 +462,7 @@ public class XmlSnapshot implements Snapshot {
         if (log.isDebugEnabled()) {
             log.debug("includeField(Pl, Vec, Str): locating corresponding XML element");
         }
-        val xmlFieldElements = elementsUnder(xmlElement, field.getId());
+        final var xmlFieldElements = elementsUnder(xmlElement, field.getId());
         if (xmlFieldElements.size() != 1) {
             if (log.isInfoEnabled()) {
                 log.info("includeField(Pl, Vec, Str): could not locate {}",
@@ -708,13 +706,10 @@ public class XmlSnapshot implements Snapshot {
                     // XML
                     isisMetaModel.setAttributesForValue(xmlValueElement, valueNos.getShortIdentifier());
 
-                    // return parsed string, else encoded string, else title.
+                    // return encoded string, else title.
                     String valueStr;
-                    final ParseableFacet parseableFacet = fieldNos.getFacet(ParseableFacet.class);
                     final EncodableFacet encodeableFacet = fieldNos.getFacet(EncodableFacet.class);
-                    if (parseableFacet != null) {
-                        valueStr = parseableFacet.parseableTextRepresentation(value);
-                    } else if (encodeableFacet != null) {
+                    if (encodeableFacet != null) {
                         valueStr = encodeableFacet.toEncodedString(value);
                     } else {
                         valueStr = value.titleString();
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacetUsingParserTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacetUsingParserTest.java
deleted file mode 100644
index 2942a92..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacetUsingParserTest.java
+++ /dev/null
@@ -1,124 +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.object.parseable;
-
-import java.util.IllegalFormatWidthException;
-
-import org.jmock.Expectations;
-import org.jmock.auto.Mock;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import org.apache.isis.applib.adapters.Parser;
-import org.apache.isis.applib.adapters.ParsingException;
-import org.apache.isis.applib.adapters.ValueSemanticsProvider;
-import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
-import org.apache.isis.applib.services.iactn.InteractionProvider;
-import org.apache.isis.applib.services.inject.ServiceInjector;
-import org.apache.isis.applib.services.registry.ServiceRegistry;
-import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2.Mode;
-import org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-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.ValueFacet;
-
-public class ParseableFacetUsingParserTest {
-
-    @Rule
-    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
-
-    @Mock private FacetHolder mockFacetHolder;
-    @Mock private InteractionProvider mockInteractionProvider;
-    @Mock private ServiceInjector mockServicesInjector;
-    @Mock private ServiceRegistry mockServiceRegistry;
-
-    protected MetaModelContext metaModelContext;
-    private ParseableFacetUsingParser parseableFacetUsingParser;
-
-    @Before
-    public void setUp() throws Exception {
-
-        metaModelContext = MetaModelContext_forTesting.builder()
-                //.interactionProvider(mockInteractionProvider)
-                .build();
-
-
-        context.checking(new Expectations() {
-            {
-                never(mockInteractionProvider);
-                //never(mockAdapterManager);
-
-                allowing(mockFacetHolder).getMetaModelContext();
-                will(returnValue(metaModelContext));
-
-                allowing(mockFacetHolder).containsFacet(ValueFacet.class);
-                will(returnValue(Boolean.FALSE));
-
-                allowing(mockFacetHolder).getInteractionProvider();
-                will(returnValue(null));
-
-            }
-        });
-
-        final Parser<String> parser = new Parser<String>() {
-            @Override
-            public String parseTextRepresentation(final ValueSemanticsProvider.Context context, final String entry) {
-                if (entry.equals("invalid")) {
-                    throw new ParsingException();
-                }
-                if (entry.equals("number")) {
-                    throw new NumberFormatException();
-                }
-                if (entry.equals("format")) {
-                    throw new IllegalFormatWidthException(2);
-                }
-                return entry.toUpperCase();
-            }
-
-            @Override
-            public int typicalLength() {
-                return 0;
-            }
-
-            @Override
-            public String parseableTextRepresentation(final ValueSemanticsProvider.Context context, final String existing) {
-                return null;
-            }
-        };
-        parseableFacetUsingParser = ParseableFacetUsingParser.create(parser, mockFacetHolder);
-    }
-
-    @Test(expected = TextEntryParseException.class)
-    public void parsingExceptionRethrown() throws Exception {
-        parseableFacetUsingParser.parseTextEntry(null, "invalid", InteractionInitiatedBy.USER);
-    }
-
-    @Test(expected = TextEntryParseException.class)
-    public void numberFormatExceptionRethrown() throws Exception {
-        parseableFacetUsingParser.parseTextEntry(null, "number", InteractionInitiatedBy.USER);
-    }
-
-    @Test(expected = TextEntryParseException.class)
-    public void illegalFormatExceptionRethrown() throws Exception {
-        parseableFacetUsingParser.parseTextEntry(null, "format", InteractionInitiatedBy.USER);
-    }
-}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/parseable/ValueProxy.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/parseable/ValueProxy.java
deleted file mode 100644
index 7b131cc..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/parseable/ValueProxy.java
+++ /dev/null
@@ -1,23 +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.object.parseable;
-
-public class ValueProxy {
-
-}
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 87bff2a..57e157f 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
@@ -46,8 +46,6 @@ import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.facets.object.encodeable.encoder.EncodableFacetUsingEncoderDecoder;
-import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
-import org.apache.isis.core.metamodel.facets.object.parseable.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;
@@ -66,7 +64,6 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
     //private ValueSemanticsProviderAndFacetAbstract<?> valueSemanticsProvider;
     private ValueSemanticsProvider<?> valueSemanticsProvider;
     private EncodableFacetUsingEncoderDecoder encodeableFacet;
-    private ParseableFacetUsingParser parseableFacet;
 
     @Before
     public void setUp() throws Exception {
@@ -108,7 +105,6 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
         this.encodeableFacet = new EncodableFacetUsingEncoderDecoder(
                 value,
                 mockFacetHolder);
-        this.parseableFacet = ParseableFacetUsingParser.create(value, mockFacetHolder);
     }
 
     protected void setSemanitcs(final AbstractValueSemanticsProvider<?> valueSemantics) {
@@ -116,10 +112,8 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
         this.encodeableFacet = new EncodableFacetUsingEncoderDecoder(
                 valueSemantics.getEncoderDecoder(),
                 mockFacetHolder);
-        this.parseableFacet = ParseableFacetUsingParser.create(valueSemantics.getParser(), mockFacetHolder);
     }
 
-
     protected <T> ValueSemanticsProviderAndFacetAbstract<T> getValue(final Class<T> type) {
         return _Casts.uncheckedCast(valueSemanticsProvider);
     }
@@ -128,10 +122,6 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
         return encodeableFacet;
     }
 
-    protected ParseableFacet getParseableFacet() {
-        return parseableFacet;
-    }
-
     protected ManagedObject createAdapter(final Object object) {
         return mockAdapter;
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
index a6bf81c..d24a87c 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
@@ -241,11 +241,6 @@ implements ObjectSpecification {
     }
 
     @Override
-    public boolean isParseable() {
-        return false;
-    }
-
-    @Override
     public boolean isParented() {
         return false;
     }
diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/NumberConverterForStringComponent.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/NumberConverterForStringComponent.java
index 49fce46..ea34c2d 100644
--- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/NumberConverterForStringComponent.java
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/NumberConverterForStringComponent.java
@@ -21,7 +21,7 @@ package org.apache.isis.viewer.common.model.binding;
 import java.util.Optional;
 
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
+import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
@@ -33,14 +33,14 @@ implements BindingConverter<String> {
 
     @Getter(onMethod_ = {@Override})
     private final ObjectSpecification valueSpecification;
-    private final ParseableFacet parsableFacet;
+    private final ValueFacet valueFacet;
 
     @SuppressWarnings("unchecked")
     public NumberConverterForStringComponent(final ObjectSpecification valueSpecification) {
         this.valueSpecification = valueSpecification;
 
-        this.parsableFacet = lookupFacet(ParseableFacet.class)
-                .orElseThrow(()->_Exceptions.noSuchElement("missing 'ParseableFacet'"));
+        this.valueFacet = lookupFacet(ValueFacet.class)
+                .orElseThrow(()->_Exceptions.noSuchElement("missing 'ValueFacet'"));
     }
 
     @Override
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index 11fdbbf..4ff8339 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -21,19 +21,13 @@ package org.apache.isis.viewer.wicket.model.models;
 import java.util.List;
 import java.util.Optional;
 
-import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.id.LogicalType;
 import org.apache.isis.commons.collections.Can;
-import org.apache.isis.commons.internal.base._Either;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
 import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacet;
-import org.apache.isis.core.metamodel.interactions.managed.ManagedParameter;
-import org.apache.isis.core.metamodel.interactions.managed.ManagedProperty;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedValue;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -52,7 +46,6 @@ import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.NonNull;
 import lombok.Setter;
-import lombok.val;
 
 /**
  * Represents a scalar of an entity, either a {@link Kind#PROPERTY property} or
@@ -191,33 +184,16 @@ implements HasRenderingHints, ScalarUiModel, LinksProvider, FormExecutorContext
         if (adapter == null) {
             return null;
         }
-        val spec = adapter.getSpecification();
+        final var spec = adapter.getSpecification();
         if(spec.isValue()) {
             managedValue().getValueAsParsableText().getValue();
-
-//            val parseableFacet = getTypeOfSpecification().getFacet(ParseableFacet.class);
-//            if (parseableFacet == null) {
-//                throw new RuntimeException("unable to find a parser for " + spec.getFullIdentifier());
-//            }
-//            return parseableFacet.parseableTextRepresentation(adapter);
         }
         return adapter.titleString();
     }
 
     public void setObjectAsString(final String enteredText) {
-        // parse text to get adapter
-
         managedValue().getValueAsParsableText().setValue(enteredText);
         setObject(managedValue().getValue().getValue());
-
-//        val parseableFacet = getTypeOfSpecification().getFacet(ParseableFacet.class);
-//        if (parseableFacet == null) {
-//            throw new RuntimeException("unable to find a parser for " + getTypeOfSpecification().getFullIdentifier());
-//        }
-//        ManagedObject adapter = parseableFacet.parseTextEntry(getObject(), enteredText,
-//                InteractionInitiatedBy.USER);
-//
-//        setObject(adapter);
     }
 
     public abstract ManagedValue managedValue();