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 2022/04/07 09:43:13 UTC

[isis] branch master updated: ISIS-2994: further remove direct uses of facets

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 1f9d2149c3 ISIS-2994: further remove direct uses of facets
1f9d2149c3 is described below

commit 1f9d2149c3be60df94fe763db6fb4c11306ff8bd
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Apr 7 11:43:05 2022 +0200

    ISIS-2994: further remove direct uses of facets
---
 .../apache/isis/core/metamodel/util/Facets.java    | 81 +++++++++++++++++-----
 .../javafx/ui/components/UiComponentFactoryFx.java |  7 +-
 .../ui/components/collections/TableViewFx.java     | 16 ++---
 .../objectref/ObjectReferenceFieldFactory.java     |  7 +-
 .../common/model/action/HasManagedAction.java      | 12 ++--
 .../viewer/common/model/feature/ScalarUiModel.java | 24 +------
 .../common/model/gridlayout/UiGridLayout.java      | 10 +--
 .../common/model/menu/MenuUiModelProvider.java     | 17 ++---
 .../AbstractObjectMemberReprRenderer.java          |  6 +-
 .../domainobjects/DomainObjectReprRenderer.java    | 24 +++----
 .../rendering/domainobjects/MemberType.java        | 12 ++--
 .../rendering/domainobjects/MutatorSpec.java       | 30 ++++----
 .../domainobjects/ObjectAndActionInvocation.java   |  9 ++-
 .../ObjectCollectionReprRenderer.java              | 31 ++++-----
 .../domainobjects/ObjectPropertyReprRenderer.java  | 44 +++---------
 .../domaintypes/ActionDescriptionReprRenderer.java |  7 +-
 .../ActionParameterDescriptionReprRenderer.java    |  8 +--
 .../PropertyDescriptionReprRenderer.java           |  7 +-
 .../entity/collection/EntityCollectionPanel.java   |  2 +-
 .../ui/components/scalars/ScalarPanelAbstract.java |  2 +-
 .../viewer/wicket/ui/pages/entity/EntityPage.java  |  2 +-
 21 files changed, 161 insertions(+), 197 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/Facets.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/Facets.java
index ecbe6668a6..3ba4cb3cd8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/Facets.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/Facets.java
@@ -26,12 +26,14 @@ import java.util.stream.Stream;
 import org.springframework.lang.Nullable;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
+import org.apache.isis.applib.annotation.DomainServiceLayout.MenuBar;
 import org.apache.isis.applib.annotation.LabelPosition;
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.layout.grid.bootstrap.BSGrid;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Casts;
+import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -43,6 +45,7 @@ import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
 import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolicyFacet;
 import org.apache.isis.core.metamodel.facets.object.domainservice.DomainServiceFacet;
+import org.apache.isis.core.metamodel.facets.object.domainservicelayout.DomainServiceLayoutFacet;
 import org.apache.isis.core.metamodel.facets.object.grid.GridFacet;
 import org.apache.isis.core.metamodel.facets.object.icon.IconFacet;
 import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacet;
@@ -50,6 +53,9 @@ import org.apache.isis.core.metamodel.facets.object.projection.ProjectionFacet;
 import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacet;
 import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.daterenderedadjust.DateRenderAdjustFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.digits.MaxFractionalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.digits.MaxTotalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.fileaccept.FileAcceptFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.labelat.LabelAtFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.multiline.MultiLineFacet;
@@ -87,14 +93,14 @@ public final class Facets {
         .orElseGet(OptionalInt::empty);
     }
 
-    public Optional<BookmarkPolicy> bookmarkPolicy(final @Nullable ObjectSpecification objectSpec) {
-        return Optional.ofNullable(objectSpec)
+    public Optional<BookmarkPolicy> bookmarkPolicy(final @Nullable FacetHolder facetHolder) {
+        return Optional.ofNullable(facetHolder)
         .flatMap(spec->spec.lookupFacet(BookmarkPolicyFacet.class))
         .map(BookmarkPolicyFacet::value);
     }
 
-    public Predicate<ObjectSpecification> bookmarkPolicyMatches(final Predicate<BookmarkPolicy> matcher) {
-        return feature->Facets.bookmarkPolicy(feature)
+    public Predicate<FacetHolder> bookmarkPolicyMatches(final Predicate<BookmarkPolicy> matcher) {
+        return facetHolder->Facets.bookmarkPolicy(facetHolder)
         .map(matcher::test)
         .orElse(false);
     }
@@ -110,6 +116,10 @@ public final class Facets {
         return bootstrapGrid(objectSpec, null);
     }
 
+    public boolean collectionIsPresent(final ObjectSpecification objectSpec) {
+        return objectSpec.containsFacet(CollectionFacet.class);
+    }
+
     //XXX could be moved to ManagedObject directly, there be an utility already under a different name
     public Stream<ManagedObject> collectionStream(final @Nullable ManagedObject collection) {
         return CollectionFacet.streamAdapters(collection);
@@ -123,9 +133,9 @@ public final class Facets {
         .orElseGet(Stream::empty);
     }
 
-    public Optional<String> cssClassFor(
-            final FacetHolder objectSpec, final ManagedObject objectAdapter) {
-        return objectSpec.lookupFacet(CssClassFacet.class)
+    public Optional<String> cssClass(
+            final FacetHolder facetHolder, final ManagedObject objectAdapter) {
+        return facetHolder.lookupFacet(CssClassFacet.class)
         .map(cssClassFacet->cssClassFacet.cssClass(objectAdapter));
     }
 
@@ -150,6 +160,20 @@ public final class Facets {
         .map(DefaultViewFacet::value);
     }
 
+    public boolean domainServiceIsPresent(final ObjectSpecification objectSpec) {
+        return objectSpec.containsFacet(DomainServiceFacet.class);
+    }
+
+    public Optional<MenuBar> domainServiceLayoutMenuBar(final ObjectSpecification objectSpec) {
+        return objectSpec.lookupFacet(DomainServiceLayoutFacet.class)
+        .map(DomainServiceLayoutFacet::getMenuBar);
+    }
+
+    public Optional<String> fileAccept(final ObjectFeature feature) {
+        return feature.lookupFacet(FileAcceptFacet.class)
+        .map(FileAcceptFacet::value);
+    }
+
     public void gridPreload(
             final ObjectSpecification objectSpec, final ManagedObject objectAdapter) {
         objectSpec.lookupFacet(GridFacet.class)
@@ -201,14 +225,46 @@ public final class Facets {
         .orElse("label-left");
     }
 
-    public OptionalInt maxLength(final ObjectSpecification objectSpec) {
-        return objectSpec
+    public OptionalInt maxFractionalDigits(final FacetHolder facetHolder) {
+        return facetHolder.lookupFacet(MaxFractionalDigitsFacet.class)
+        .map(MaxFractionalDigitsFacet::getMaxFractionalDigits)
+        .map(OptionalInt::of)
+        .orElseGet(OptionalInt::empty);
+    }
+
+    public OptionalInt maxFractionalDigits(final @Nullable Iterable<FacetHolder> facetHolders) {
+        return _NullSafe.stream(facetHolders)
+                .map(Facets::maxFractionalDigits)
+                .findFirst()
+                .orElseGet(OptionalInt::empty);
+    }
+
+    public OptionalInt maxLength(final FacetHolder facetHolder) {
+        return facetHolder
                 .lookupFacet(MaxLengthFacet.class)
                 .map(MaxLengthFacet::value)
                 .map(OptionalInt::of)
                 .orElseGet(OptionalInt::empty);
     }
 
+    public OptionalInt maxTotalDigits(final FacetHolder facetHolder) {
+        return facetHolder.lookupFacet(MaxTotalDigitsFacet.class)
+        .map(MaxTotalDigitsFacet::getMaxTotalDigits)
+        .map(OptionalInt::of)
+        .orElseGet(OptionalInt::empty);
+    }
+
+    public OptionalInt maxTotalDigits(final @Nullable Iterable<FacetHolder> facetHolders) {
+        return _NullSafe.stream(facetHolders)
+                .map(Facets::maxTotalDigits)
+                .findFirst()
+                .orElseGet(OptionalInt::empty);
+    }
+
+    public boolean mixinIsPresent(final ObjectSpecification objectSpec) {
+        return objectSpec.containsFacet(MixinFacet.class);
+    }
+
     public boolean multilineIsPresent(final ObjectFeature feature) {
         return feature.lookupNonFallbackFacet(MultiLineFacet.class)
                 .isPresent();
@@ -269,13 +325,6 @@ public final class Facets {
         return objectSpec.containsFacet(ValueFacet.class);
     }
 
-    public boolean domainServiceIsPresent(final ObjectSpecification objectSpec) {
-        return objectSpec.containsFacet(DomainServiceFacet.class);
-    }
-
-    public boolean mixinIsPresent(final ObjectSpecification objectSpec) {
-        return objectSpec.containsFacet(MixinFacet.class);
-    }
 
 
 }
diff --git a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/UiComponentFactoryFx.java b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/UiComponentFactoryFx.java
index 434227e43c..50ad0a1ad7 100644
--- a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/UiComponentFactoryFx.java
+++ b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/UiComponentFactoryFx.java
@@ -28,8 +28,8 @@ import org.springframework.stereotype.Service;
 import org.apache.isis.applib.annotation.LabelPosition;
 import org.apache.isis.commons.handler.ChainOfResponsibility;
 import org.apache.isis.core.config.environment.IsisSystemEnvironment;
-import org.apache.isis.core.metamodel.facets.objectvalue.labelat.LabelAtFacet;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedMember;
+import org.apache.isis.core.metamodel.util.Facets;
 import org.apache.isis.incubator.viewer.javafx.model.context.UiContextFx;
 import org.apache.isis.viewer.common.model.components.UiComponentFactory;
 import org.apache.isis.viewer.common.model.decorator.prototyping.PrototypingUiModel;
@@ -112,9 +112,8 @@ public class UiComponentFactoryFx implements UiComponentFactory<Node, Node> {
 
     @Override
     public LabelAndPosition<Node> labelFor(final ComponentRequest request) {
-        val labelPosition = request.getManagedFeature().getFacet(LabelAtFacet.class)
-                .map(LabelAtFacet::label)
-                .orElse(LabelPosition.NOT_SPECIFIED);
+        val labelPosition = Facets.labelAt(request.getManagedFeature().getMetaModel())
+                .orElse(LabelPosition.LEFT);
         val uiLabel = new Label(request.getFriendlyName());
         return LabelAndPosition.of(labelPosition, uiLabel);
     }
diff --git a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/collections/TableViewFx.java b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/collections/TableViewFx.java
index 85a7ce1021..84f6a1dc12 100644
--- a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/collections/TableViewFx.java
+++ b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/collections/TableViewFx.java
@@ -28,7 +28,6 @@ import org.apache.isis.applib.services.bookmark.Oid;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Multimaps;
-import org.apache.isis.core.metamodel.facets.collections.CollectionFacet;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedCollection;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjects;
@@ -36,19 +35,21 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.MixedIn;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.core.metamodel.util.Facets;
 import org.apache.isis.incubator.viewer.javafx.model.context.UiContextFx;
 import org.apache.isis.incubator.viewer.javafx.model.util._fx;
 
-import javafx.scene.control.Button;
-import javafx.scene.control.Label;
-import javafx.scene.control.TableView;
-import javafx.scene.layout.VBox;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import lombok.NonNull;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
+import javafx.scene.control.Button;
+import javafx.scene.control.Label;
+import javafx.scene.control.TableView;
+import javafx.scene.layout.VBox;
+
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 @Log4j2
 public class TableViewFx extends VBox {
@@ -69,10 +70,7 @@ public class TableViewFx extends VBox {
             final @NonNull ManagedObject collection,
             final @NonNull Where where) {
 
-        val collectionFacet = collection.getSpecification()
-                .getFacet(CollectionFacet.class);
-
-        val objects = collectionFacet.stream(collection)
+        val objects = Facets.collectionStream(collection)
                 .collect(Can.toCan());
 
         return ManagedObjects.commonSpecification(objects)
diff --git a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/objectref/ObjectReferenceFieldFactory.java b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/objectref/ObjectReferenceFieldFactory.java
index 76e929806a..4fd81a8e93 100644
--- a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/objectref/ObjectReferenceFieldFactory.java
+++ b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/objectref/ObjectReferenceFieldFactory.java
@@ -20,8 +20,6 @@ package org.apache.isis.incubator.viewer.javafx.ui.components.objectref;
 
 import javax.inject.Inject;
 
-import org.springframework.core.annotation.Order;
-
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedParameter;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedProperty;
@@ -40,14 +38,13 @@ import javafx.scene.control.Label;
 public class ObjectReferenceFieldFactory implements UiComponentHandlerFx {
 
     @Override
-    public boolean isHandling(ComponentRequest request) {
-        //return request.hasFeatureFacet(StringValueFacet.class);
+    public boolean isHandling(final ComponentRequest request) {
         return request.getFeatureTypeSpec().isEntityOrViewModelOrAbstract()
                 || request.getFeatureType().isEnum();
     }
 
     @Override
-    public Node handle(ComponentRequest request) {
+    public Node handle(final ComponentRequest request) {
 
         //TODO 1) move all the logic that is in the request to the underlying ManagedProperty
         // 2) pass the ManagedProperty over with the request object
diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/HasManagedAction.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/HasManagedAction.java
index 414d416bd4..b2da4ac0bc 100644
--- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/HasManagedAction.java
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/HasManagedAction.java
@@ -24,12 +24,12 @@ import java.util.function.Predicate;
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.BookmarkPolicy;
-import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolicyFacet;
 import org.apache.isis.core.metamodel.interactions.managed.ActionInteractionHead;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedAction;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.util.Facets;
 import org.apache.isis.viewer.common.model.decorator.disable.DisablingUiModel;
 import org.apache.isis.viewer.common.model.decorator.icon.FontAwesomeUiModel;
 
@@ -79,11 +79,10 @@ public interface HasManagedAction {
      */
     default boolean isBookmarkable() {
         val action = getAction();
+
         return action.getSemantics().isSafeInNature()
-                && action.lookupFacet(BookmarkPolicyFacet.class)
-                    .map(BookmarkPolicyFacet::value)
-                    .map(bookmarkPolicy -> bookmarkPolicy == BookmarkPolicy.AS_ROOT)
-                    .orElse(false);
+                && Facets.bookmarkPolicyMatches(BookmarkPolicy.AS_ROOT::equals)
+                    .test(action);
     }
 
     default Identifier getFeatureIdentifier() {
@@ -100,8 +99,7 @@ public interface HasManagedAction {
     }
 
     default Optional<String> getAdditionalCssClass() {
-        return getAction().lookupFacet(CssClassFacet.class)
-                .map(cssClassFacet->cssClassFacet.cssClass(getManagedAction().getOwner()));
+        return Facets.cssClass(getAction(), getActionOwner());
     }
 
     default ActionLayout.Position getPosition() {
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 9278df6379..d1e39c7d4d 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
@@ -18,16 +18,13 @@
  */
 package org.apache.isis.viewer.common.model.feature;
 
-import java.math.BigDecimal;
 import java.util.Optional;
 
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.objectvalue.digits.MaxTotalDigitsFacet;
-import org.apache.isis.core.metamodel.facets.objectvalue.fileaccept.FileAcceptFacet;
-import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
+import org.apache.isis.core.metamodel.util.Facets;
 
 public interface ScalarUiModel {
 
@@ -54,25 +51,8 @@ public interface ScalarUiModel {
         return getMetaModel().getDescription(this::getOwner);
     }
 
-    /**
-     * for {@link BigDecimal}s only.
-     *
-     * @see #getLength()
-     */
-    default Integer getLength() {
-        return getMetaModel().lookupFacet(MaxTotalDigitsFacet.class)
-                .map(MaxTotalDigitsFacet::getMaxTotalDigits)
-                .orElse(null);
-    }
-
-    default Integer getTypicalLength() {
-        final TypicalLengthFacet facet = getMetaModel().getFacet(TypicalLengthFacet.class);
-        return facet != null? facet.value() : null;
-    }
-
     default String getFileAccept() {
-        final FileAcceptFacet facet = getMetaModel().getFacet(FileAcceptFacet.class);
-        return facet != null? facet.value(): null;
+        return Facets.fileAccept(getMetaModel()).orElse(null);
     }
 
     int getAutoCompleteMinLength();
diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/gridlayout/UiGridLayout.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/gridlayout/UiGridLayout.java
index 7777f9c337..9e91318b15 100644
--- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/gridlayout/UiGridLayout.java
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/gridlayout/UiGridLayout.java
@@ -35,10 +35,10 @@ import org.apache.isis.applib.layout.grid.bootstrap.BSTabGroup;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Sets;
-import org.apache.isis.core.metamodel.facets.object.grid.GridFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.feature.MixedIn;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.util.Facets;
 
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
@@ -80,12 +80,8 @@ public class UiGridLayout {
     }
 
     private Optional<BSGrid> initGridData() {
-        return managedObject.getSpecification().lookupFacet(GridFacet.class)
-        .map(gridFacet->gridFacet.getGrid(managedObject))
-        .filter(grid->grid instanceof BSGrid)
-        .map(BSGrid.class::cast)
-        .map(this::attachAssociatedActions)
-        ;
+        return Facets.bootstrapGrid(managedObject.getSpecification(), managedObject)
+        .map(this::attachAssociatedActions);
     }
 
     //TODO[refactor] this should not be necessary here, the GridFacet should already have done that for us
diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/menu/MenuUiModelProvider.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/menu/MenuUiModelProvider.java
index 0923f0a793..310b766d3f 100644
--- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/menu/MenuUiModelProvider.java
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/menu/MenuUiModelProvider.java
@@ -28,11 +28,9 @@ import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facets.object.domainservicelayout.DomainServiceLayoutFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-
-import lombok.val;
+import org.apache.isis.core.metamodel.util.Facets;
 
 @Service
 public class MenuUiModelProvider {
@@ -54,14 +52,11 @@ public class MenuUiModelProvider {
     }
 
     private static Predicate<ManagedObject> with(final DomainServiceLayout.MenuBar menuBarSelect) {
-        return (ManagedObject adapter) -> {
-            val domainServiceLayoutFacet = adapter.getSpecification()
-                    .getFacet(DomainServiceLayoutFacet.class);
-            return (domainServiceLayoutFacet != null
-                        && domainServiceLayoutFacet.getMenuBar() == menuBarSelect)
-                    || (domainServiceLayoutFacet == null
-                        && menuBarSelect == DomainServiceLayout.MenuBar.PRIMARY);
-        };
+        return (final ManagedObject adapter) ->
+
+            Facets.domainServiceLayoutMenuBar(adapter.getSpecification())
+                    .orElse(DomainServiceLayout.MenuBar.PRIMARY)
+                    .equals(menuBarSelect);
     }
 
 }
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
index 788f58ee86..57877e2510 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
@@ -222,7 +222,7 @@ extends ReprRendererAbstract<ManagedMember> {
      * mutators}.
      */
     protected void addLinkFor(final @NonNull MutatorSpec mutatorSpec) {
-        if (!hasMemberFacet(mutatorSpec.mutatorFacetType)) {
+        if (!mutatorSpec.appliesTo(objectMember)) {
             return;
         }
         final JsonRepresentation arguments = mutatorArgs(mutatorSpec);
@@ -304,10 +304,6 @@ extends ReprRendererAbstract<ManagedMember> {
         return objectMember.getElementType().getFacet(facetType);
     }
 
-    protected boolean hasMemberFacet(final Class<? extends Facet> facetType) {
-        return objectMember.getFacet(facetType) != null;
-    }
-
     protected Consent usability() {
         return objectMember.isUsable(objectAdapter, getInteractionInitiatedBy(), where);
     }
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
index e6ef40dec5..3338030ba1 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
@@ -23,21 +23,19 @@ import java.util.Optional;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.facets.object.domainservicelayout.DomainServiceLayoutFacet;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedAction;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedCollection;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedProperty;
 import org.apache.isis.core.metamodel.services.ServiceUtil;
 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.MixedIn;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 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 org.apache.isis.core.metamodel.util.Facets;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.Rel;
 import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
@@ -224,15 +222,11 @@ extends ReprRendererAbstract<ManagedObject> {
             getExtensions().mapPut("isService", isService);
             getExtensions().mapPut("isPersistent", ManagedObjects.isIdentifiable(objectAdapter));
             if(isService) {
-                final ObjectSpecification objectSpec = objectAdapter.getSpecification();
-                final DomainServiceLayoutFacet layoutFacet =
-                        objectSpec.getFacet(DomainServiceLayoutFacet.class);
-                if(layoutFacet != null) {
-                    final DomainServiceLayout.MenuBar menuBar = layoutFacet.getMenuBar();
-                    if(menuBar != null) {
-                        getExtensions().mapPut("menuBar", menuBar);
-                    }
-                }
+
+                Facets.domainServiceLayoutMenuBar(objectAdapter.getSpecification())
+                .ifPresent(menuBar->
+                        getExtensions().mapPut("menuBar", menuBar));
+
             }
         }
 
@@ -244,9 +238,9 @@ extends ReprRendererAbstract<ManagedObject> {
 
         final LinkFollowSpecs linkFollower = getLinkFollowSpecs().follow("links");
         if (linkFollower.matches(link)) {
-            final DomainObjectReprRenderer renderer =
-                    new DomainObjectReprRenderer(getResourceContext(), linkFollower, JsonRepresentation.newMap());
-            renderer.with(objectAdapter);
+            val renderer =
+                    new DomainObjectReprRenderer(getResourceContext(), linkFollower, JsonRepresentation.newMap())
+                    .with(objectAdapter);
             link.mapPut("value", renderer.render());
         }
 
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/MemberType.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/MemberType.java
index 436cdbf307..aefcdc1817 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/MemberType.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/MemberType.java
@@ -24,10 +24,8 @@ import java.util.Map;
 import org.apache.isis.applib.util.Enums;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet;
-import org.apache.isis.core.metamodel.facets.actions.validate.ActionValidationFacet;
 import org.apache.isis.core.metamodel.facets.properties.update.clear.PropertyClearFacet;
 import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
-import org.apache.isis.core.metamodel.facets.properties.validating.PropertyValidateFacet;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
@@ -43,8 +41,8 @@ public enum MemberType {
 
     PROPERTY("properties/", RepresentationType.OBJECT_PROPERTY,
             _Maps.unmodifiable(
-                    "modify", MutatorSpec.of(Rel.MODIFY, PropertyValidateFacet.class, PropertySetterFacet.class, RestfulHttpMethod.PUT, BodyArgs.ONE),
-                    "clear", MutatorSpec.of(Rel.CLEAR, PropertyValidateFacet.class, PropertyClearFacet.class, RestfulHttpMethod.DELETE, BodyArgs.NONE))),
+                    "modify", MutatorSpec.of(Rel.MODIFY, PropertySetterFacet.class, RestfulHttpMethod.PUT, BodyArgs.ONE),
+                    "clear", MutatorSpec.of(Rel.CLEAR, PropertyClearFacet.class, RestfulHttpMethod.DELETE, BodyArgs.NONE))),
     /**
      * {@link #getMutators()} are empty}
      */
@@ -56,9 +54,9 @@ public enum MemberType {
      */
     ACTION("actions/", RepresentationType.OBJECT_ACTION,
             _Maps.unmodifiable(
-                    "invokeQueryOnly", MutatorSpec.of(Rel.INVOKE, ActionValidationFacet.class, ActionInvocationFacet.class, RestfulHttpMethod.GET, BodyArgs.MANY, "invoke"),
-                    "invokeIdempotent", MutatorSpec.of(Rel.INVOKE, ActionValidationFacet.class, ActionInvocationFacet.class, RestfulHttpMethod.PUT, BodyArgs.MANY, "invoke"),
-                    "invoke", MutatorSpec.of(Rel.INVOKE, ActionValidationFacet.class, ActionInvocationFacet.class, RestfulHttpMethod.POST, BodyArgs.MANY, "invoke")));
+                    "invokeQueryOnly", MutatorSpec.of(Rel.INVOKE, ActionInvocationFacet.class, RestfulHttpMethod.GET, BodyArgs.MANY, "invoke"),
+                    "invokeIdempotent", MutatorSpec.of(Rel.INVOKE, ActionInvocationFacet.class, RestfulHttpMethod.PUT, BodyArgs.MANY, "invoke"),
+                    "invoke", MutatorSpec.of(Rel.INVOKE, ActionInvocationFacet.class, RestfulHttpMethod.POST, BodyArgs.MANY, "invoke")));
 
     @Getter private final String urlPart;
     @Getter private final String name;
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/MutatorSpec.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/MutatorSpec.java
index b8956b891f..a5e233eee2 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/MutatorSpec.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/MutatorSpec.java
@@ -19,33 +19,31 @@
 package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
 
 import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.viewer.restfulobjects.applib.Rel;
 import org.apache.isis.viewer.restfulobjects.applib.RestfulHttpMethod;
 
-public class MutatorSpec {
+import lombok.RequiredArgsConstructor;
 
-    public static MutatorSpec of(final Rel rel, final Class<? extends Facet> validationFacetType, final Class<? extends Facet> mutatorFacetType, final RestfulHttpMethod httpMethod, final BodyArgs argSpec) {
-        return of(rel, validationFacetType, mutatorFacetType, httpMethod, argSpec, null);
-    }
+@RequiredArgsConstructor(staticName = "of")
+public final class MutatorSpec {
 
-    public static MutatorSpec of(final Rel rel, final Class<? extends Facet> validationFacetType, final Class<? extends Facet> mutatorFacetType, final RestfulHttpMethod httpMethod, final BodyArgs argSpec, final String suffix) {
-        return new MutatorSpec(rel, validationFacetType, mutatorFacetType, httpMethod, argSpec, suffix);
+    public static MutatorSpec of(
+            final Rel rel,
+            final Class<? extends Facet> mutatorFacetType,
+            final RestfulHttpMethod httpMethod,
+            final BodyArgs argSpec) {
+        return of(rel, mutatorFacetType, httpMethod, argSpec, null);
     }
 
     public final Rel rel;
-    public final Class<? extends Facet> validationFacetType;
-    public final Class<? extends Facet> mutatorFacetType;
+    private final Class<? extends Facet> mutatorFacetType;
     public final RestfulHttpMethod httpMethod;
-    public final String suffix;
     public final BodyArgs arguments;
+    public final String suffix;
 
-    private MutatorSpec(final Rel rel, final Class<? extends Facet> validationFacetType, final Class<? extends Facet> mutatorFacetType, final RestfulHttpMethod httpMethod, final BodyArgs bodyArgs, final String suffix) {
-        this.rel = rel;
-        this.validationFacetType = validationFacetType;
-        this.mutatorFacetType = mutatorFacetType;
-        this.httpMethod = httpMethod;
-        this.arguments = bodyArgs;
-        this.suffix = suffix;
+    public boolean appliesTo(final ObjectMember objectMember) {
+        return objectMember.containsFacet(mutatorFacetType);
     }
 
 }
\ No newline at end of file
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndActionInvocation.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndActionInvocation.java
index 4ead616628..50bd73f2dc 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndActionInvocation.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndActionInvocation.java
@@ -22,13 +22,12 @@ import java.util.stream.Stream;
 
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Lazy;
-import org.apache.isis.core.metamodel.facets.collections.CollectionFacet;
-import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 import org.apache.isis.core.metamodel.interactions.managed.ActionInteraction;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.PackedManagedObject;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.util.Facets;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.domainobjects.ActionResultRepresentation;
 
@@ -128,16 +127,16 @@ public class ObjectAndActionInvocation {
 
     private final _Lazy<Can<ManagedObject>> elementAdapters = _Lazy.threadSafe(this::initElementAdapters);
     private Can<ManagedObject> initElementAdapters() {
-        return CollectionFacet.streamAdapters(returnedAdapter).collect(Can.toCan());
+        return Facets.collectionStream(returnedAdapter).collect(Can.toCan());
     }
 
     //TODO[2449] need to check whether that strategy holds consistently
     private static boolean isScalarValue(final @NonNull ObjectSpecification spec) {
-        return spec.containsFacet(ValueFacet.class);
+        return Facets.valueIsPresent(spec);
     }
 
     private static boolean isVector(final @NonNull ObjectSpecification spec) {
-        return spec.containsFacet(CollectionFacet.class);
+        return Facets.collectionIsPresent(spec);
     }
 
 
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java
index 286028b70f..0c04ec5e82 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java
@@ -19,16 +19,14 @@
 package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
 
 import java.util.List;
-import java.util.Objects;
 
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.facets.collections.CollectionFacet;
-import org.apache.isis.core.metamodel.facets.collections.collection.defaultview.DefaultViewFacet;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedCollection;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjects;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.isis.core.metamodel.util.Facets;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.Rel;
 import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
@@ -66,9 +64,15 @@ extends AbstractObjectMemberReprRenderer<OneToManyAssociation> {
         renderMemberContent();
 
         final LinkFollowSpecs followValue = getLinkFollowSpecs().follow("value");
-        boolean eagerlyRender = resourceContext.honorUiHints() && renderEagerly() || !followValue.isTerminated();
-
-        if ((mode.isInline() && eagerlyRender) || mode.isStandalone() || mode.isMutated() || mode.isEventSerialization() || !ManagedObjects.isIdentifiable(objectAdapter)) {
+        final boolean eagerlyRender = !followValue.isTerminated()
+                || (resourceContext.honorUiHints()
+                        && Facets.defaultViewIsTable(objectMember));
+
+        if ((mode.isInline() && eagerlyRender)
+                || mode.isStandalone()
+                || mode.isMutated()
+                || mode.isEventSerialization()
+                || !ManagedObjects.isIdentifiable(objectAdapter)) {
             addValue(followValue);
         }
         if(!mode.isEventSerialization()) {
@@ -82,11 +86,6 @@ extends AbstractObjectMemberReprRenderer<OneToManyAssociation> {
         return representation;
     }
 
-    private boolean renderEagerly() {
-        final DefaultViewFacet defaultViewFacet = objectMember.getFacet(DefaultViewFacet.class);
-        return defaultViewFacet != null && Objects.equals(defaultViewFacet.value(), "table");
-    }
-
     // ///////////////////////////////////////////////////
     // value
     // ///////////////////////////////////////////////////
@@ -98,9 +97,10 @@ extends AbstractObjectMemberReprRenderer<OneToManyAssociation> {
         }
 
         final LinkFollowSpecs followHref = linkFollower.follow("href");
-        boolean eagerlyRender = resourceContext.honorUiHints()
-                && renderEagerly(valueAdapter)
-                || !followHref.isTerminated();
+        final boolean eagerlyRender = !followHref.isTerminated()
+                || (resourceContext.honorUiHints()
+                        && Facets.defaultViewIsTable(objectMember)
+                        && resourceContext.canEagerlyRender(valueAdapter));
 
         final List<JsonRepresentation> list = _Lists.newArrayList();
 
@@ -125,9 +125,6 @@ extends AbstractObjectMemberReprRenderer<OneToManyAssociation> {
         representation.mapPut("value", list);
     }
 
-    private boolean renderEagerly(final ManagedObject valueAdapter) {
-        return renderEagerly() && resourceContext.canEagerlyRender(valueAdapter);
-    }
 
     // ///////////////////////////////////////////////////
     // details link
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
index 996bb8fc09..42d7c285fc 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
@@ -19,23 +19,18 @@
 package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
 
 import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
 
 import com.fasterxml.jackson.databind.node.NullNode;
 
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.collections.collection.defaultview.DefaultViewFacet;
 import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
-import org.apache.isis.core.metamodel.facets.objectvalue.digits.MaxFractionalDigitsFacet;
-import org.apache.isis.core.metamodel.facets.objectvalue.digits.MaxTotalDigitsFacet;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedProperty;
 import org.apache.isis.core.metamodel.spec.ManagedObjects;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.core.metamodel.util.Facets;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.Rel;
 import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
@@ -104,13 +99,8 @@ extends AbstractObjectMemberReprRenderer<OneToOneAssociation> {
                         objectMember,
                         valueAdapterIfAny != null ? valueAdapterIfAny.getSpecification() : null);
 
-                final int totalDigits = lookupFacet(MaxTotalDigitsFacet.class, facetHolders)
-                        .map(MaxTotalDigitsFacet::getMaxTotalDigits)
-                        .orElse(-1);
-
-                final int scale = lookupFacet(MaxFractionalDigitsFacet.class, facetHolders)
-                        .map(MaxFractionalDigitsFacet::getMaxFractionalDigits)
-                        .orElse(-1);
+                final int totalDigits = Facets.maxTotalDigits(facetHolders).orElse(-1);
+                final int scale = Facets.maxFractionalDigits(facetHolders).orElse(-1);
 
                 format = String.format("big-decimal(%d,%d)", totalDigits, scale);
 
@@ -127,9 +117,11 @@ extends AbstractObjectMemberReprRenderer<OneToOneAssociation> {
                             resourceContext.suppressMemberExtensions());
         }
 
-        boolean eagerlyRender =
-                (renderEagerly() && resourceContext.canEagerlyRender(valueAdapterIfAny))
-                || (linkFollower != null && !linkFollower.isTerminated());
+        final boolean eagerlyRender =
+                (Facets.defaultViewIsTable(objectMember)
+                        && resourceContext.canEagerlyRender(valueAdapterIfAny))
+                || (linkFollower != null
+                        && !linkFollower.isTerminated());
 
         if(valueAdapterIfAny == null) {
             final NullNode value = NullNode.getInstance();
@@ -160,26 +152,6 @@ extends AbstractObjectMemberReprRenderer<OneToOneAssociation> {
 
     }
 
-    private boolean renderEagerly() {
-        final DefaultViewFacet defaultViewFacet = objectMember.getFacet(DefaultViewFacet.class);
-        return defaultViewFacet != null
-                && Objects.equals(defaultViewFacet.value(), "table");
-    }
-
-    private static <T extends Facet> Optional<T> lookupFacet(
-            final Class<T> facetType,
-            final Can<FacetHolder> holders) {
-        for (FacetHolder holder : holders) {
-            final T facet = holder.getFacet(facetType);
-            if(facet != null) {
-                return Optional.of(facet);
-            }
-        }
-        return Optional.empty();
-    }
-
-
-
     // ///////////////////////////////////////////////////
     // details link
     // ///////////////////////////////////////////////////
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/ActionDescriptionReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/ActionDescriptionReprRenderer.java
index 65f55caea3..16ef1f5306 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/ActionDescriptionReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/ActionDescriptionReprRenderer.java
@@ -18,7 +18,8 @@
  */
 package org.apache.isis.viewer.restfulobjects.rendering.domaintypes;
 
-import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
+import java.util.Optional;
+
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
@@ -81,9 +82,7 @@ extends AbstractTypeMemberReprRenderer<ObjectAction> {
     }
 
     private void addLinkToElementTypeIfAny() {
-        getObjectFeature()
-        .lookupFacet(TypeOfFacet.class)
-        .map(TypeOfFacet::valueSpec)
+        Optional.ofNullable(getObjectFeature().getElementType())
         .ifPresent(typeOfSpec->
             getLinks().arrayAdd(
                 DomainTypeReprRenderer
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/ActionParameterDescriptionReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/ActionParameterDescriptionReprRenderer.java
index e5ed1270ef..598c6dde41 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/ActionParameterDescriptionReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/ActionParameterDescriptionReprRenderer.java
@@ -19,10 +19,10 @@
 package org.apache.isis.viewer.restfulobjects.rendering.domaintypes;
 
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.core.metamodel.util.Facets;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.Rel;
 import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
@@ -101,9 +101,9 @@ extends AbstractTypeFeatureReprRenderer<ObjectActionParameter> {
                 .orElseThrow(_Exceptions::unexpectedCodeReach));
         representation.mapPut("number", getObjectFeature().getParameterIndex());
         representation.mapPut("optional", getObjectFeature().isOptional());
-        getObjectFeature()
-            .lookupNonFallbackFacet(MaxLengthFacet.class)
-            .ifPresent(maxLengthFacet->representation.mapPut("maxLength", maxLengthFacet.value()));
+
+        Facets.maxLength(getObjectFeature())
+            .ifPresent(maxLength->representation.mapPut("maxLength", maxLength));
     }
 
     @Override
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/PropertyDescriptionReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/PropertyDescriptionReprRenderer.java
index 621a1921ae..35ff6eed1a 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/PropertyDescriptionReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/PropertyDescriptionReprRenderer.java
@@ -18,9 +18,9 @@
  */
 package org.apache.isis.viewer.restfulobjects.rendering.domaintypes;
 
-import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.core.metamodel.util.Facets;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.Rel;
 import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
@@ -59,9 +59,8 @@ extends AbstractTypeMemberReprRenderer<OneToOneAssociation> {
     @Override
     protected void addPropertiesSpecificToFeature() {
         representation.mapPut("optional", !getObjectFeature().isMandatory());
-        getObjectFeature()
-            .lookupNonFallbackFacet(MaxLengthFacet.class)
-            .ifPresent(maxLengthFacet->representation.mapPut("maxLength", maxLengthFacet.value()));
+        Facets.maxLength(getObjectFeature())
+            .ifPresent(maxLength->representation.mapPut("maxLength", maxLength));
     }
 
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java
index 61f9efa973..6586747975 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java
@@ -120,7 +120,7 @@ implements HasDynamicallyVisibleContent {
 
             visible = true;
 
-            Facets.cssClassFor(collectionMetaModel, objectAdapter)
+            Facets.cssClass(collectionMetaModel, objectAdapter)
             .ifPresent(cssClass->Wkt.cssAppend(div, cssClass));
 
             final CollectionPanel collectionPanel = newCollectionModel(ID_COLLECTION, collectionModel);
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
index 499f586429..92bea9f340 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
@@ -411,7 +411,7 @@ implements ScalarModelSubscriber {
 
         Wkt.cssAppend(this, scalarModel.getCssClass());
 
-        Facets.cssClassFor(scalarModel.getMetaModel(), scalarModel.getParentUiModel().getManagedObject())
+        Facets.cssClass(scalarModel.getMetaModel(), scalarModel.getParentUiModel().getManagedObject())
         .ifPresent(cssClass->
             Wkt.cssAppend(this, cssClass));
     }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
index 712ada3a98..2e636f7fab 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
@@ -185,7 +185,7 @@ public class EntityPage extends PageAbstract {
         WebMarkupContainer entityPageContainer = new WebMarkupContainer("entityPageContainer");
         Wkt.cssAppend(entityPageContainer, objectSpec.getFeatureIdentifier());
 
-        Facets.cssClassFor(objectSpec, objectAdapter)
+        Facets.cssClass(objectSpec, objectAdapter)
         .ifPresent(cssClass->
             Wkt.cssAppend(entityPageContainer, cssClass)
         );