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/06/26 04:48:38 UTC

[isis] branch master updated: ISIS-1720: remove PropertyLayout#namedEscaped

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 7f47868  ISIS-1720: remove PropertyLayout#namedEscaped
7f47868 is described below

commit 7f4786803d7992509504f059ade824c5395f963c
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat Jun 26 06:48:27 2021 +0200

    ISIS-1720: remove PropertyLayout#namedEscaped
    
    also some housekeeping around HasNoun
---
 .../modules/ROOT/pages/2021/2.0.0-M6/mignotes.adoc |  3 ++
 .../isis/applib/annotation/PropertyLayout.java     | 13 -----
 .../applib/layout/component/ActionLayoutData.java  | 41 +++++----------
 .../layout/component/CollectionLayoutData.java     | 35 ++++---------
 .../layout/component/DomainObjectLayoutData.java   | 27 +++-------
 .../isis/applib/layout/component/HasNamed.java     |  6 ---
 .../layout/component/PropertyLayoutData.java       | 34 ++++--------
 .../metamodel/facets/all/i8n/noun/HasNoun.java     | 56 +++++++++++++-------
 .../facets/all/i8n/noun/HasNounFacetAbstract.java  | 19 ++-----
 .../metamodel/facets/all/i8n/noun/NounForms.java   | 12 +++--
 .../core/metamodel/layout/LayoutFacetUtil.java     | 27 +++-------
 .../specimpl/ObjectSpecificationAbstract.java      |  6 +--
 .../named/PropertyLayoutNamedVm-description.adoc   | 45 ----------------
 .../named/PropertyLayoutNamedVm.java               | 31 +----------
 ...pertyLayoutNamedVm_updateWithEscapedMarkup.java | 59 ---------------------
 .../PropertyLayoutNamedVm_updateWithMarkup.java    | 60 ----------------------
 16 files changed, 105 insertions(+), 369 deletions(-)

diff --git a/antora/components/relnotes/modules/ROOT/pages/2021/2.0.0-M6/mignotes.adoc b/antora/components/relnotes/modules/ROOT/pages/2021/2.0.0-M6/mignotes.adoc
index 1756d2f..e99b2d7 100644
--- a/antora/components/relnotes/modules/ROOT/pages/2021/2.0.0-M6/mignotes.adoc
+++ b/antora/components/relnotes/modules/ROOT/pages/2021/2.0.0-M6/mignotes.adoc
@@ -34,6 +34,9 @@ there is no counterpart for _Collection_
 | `@Model` (from extensions) removed
 | use `@MemberSupport`  (Applib) instead
 
+| `@PropertyLayout(namedEscaped=...)` removed
+| (translatable) text is now always escaped
+
 |===
 
 == Configuration
diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/PropertyLayout.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/PropertyLayout.java
index 6686aa2..32be2a0 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/annotation/PropertyLayout.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/PropertyLayout.java
@@ -183,24 +183,11 @@ public @interface PropertyLayout {
      * @see CollectionLayout#named()
      * @see DomainObjectLayout#named()
      * @see DomainServiceLayout#named()
-     * @see PropertyLayout#namedEscaped()
      */
     String named()
             default "";
 
     /**
-     * A flag indicating whether the value of {@linkplain #named()} should be
-     * HTML escaped or not.
-     *
-     * @see ParameterLayout#namedEscaped()
-     * @see CollectionLayout#namedEscaped()
-     * @see PropertyLayout#named()
-     */
-    @Deprecated
-    boolean namedEscaped()
-            default true;
-
-    /**
      * Whether this property should be used to construct the navigable chain of breadcrumbs in the UI.
      *
      * <p>
diff --git a/api/applib/src/main/java/org/apache/isis/applib/layout/component/ActionLayoutData.java b/api/applib/src/main/java/org/apache/isis/applib/layout/component/ActionLayoutData.java
index cf53bfa..3272e10 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/layout/component/ActionLayoutData.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/layout/component/ActionLayoutData.java
@@ -33,7 +33,7 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.layout.links.Link;
 
 /**
- * Describes the layout of a single action, broadly corresponding to 
+ * Describes the layout of a single action, broadly corresponding to
  * {@link org.apache.isis.applib.annotation.ActionLayout}.
  *
  * @since 1.x {@index}
@@ -75,7 +75,7 @@ HasDescribedAs, HasHidden, HasNamed, HasBookmarking {
         return id;
     }
 
-    public void setId(String id) {
+    public void setId(final String id) {
         this.id = id;
     }
 
@@ -90,7 +90,7 @@ HasDescribedAs, HasHidden, HasNamed, HasBookmarking {
     }
 
     @Override
-    public void setBookmarking(BookmarkPolicy bookmarking) {
+    public void setBookmarking(final BookmarkPolicy bookmarking) {
         this.bookmarking = bookmarking;
     }
 
@@ -104,7 +104,7 @@ HasDescribedAs, HasHidden, HasNamed, HasBookmarking {
     }
 
     @Override
-    public void setCssClass(String cssClass) {
+    public void setCssClass(final String cssClass) {
         this.cssClass = cssClass;
     }
 
@@ -118,7 +118,7 @@ HasDescribedAs, HasHidden, HasNamed, HasBookmarking {
     }
 
     @Override
-    public void setCssClassFa(String cssClassFa) {
+    public void setCssClassFa(final String cssClassFa) {
         this.cssClassFa = cssClassFa;
     }
 
@@ -132,7 +132,7 @@ HasDescribedAs, HasHidden, HasNamed, HasBookmarking {
     }
 
     @Override
-    public void setCssClassFaPosition(CssClassFaPosition cssClassFaPosition) {
+    public void setCssClassFaPosition(final CssClassFaPosition cssClassFaPosition) {
         this.cssClassFaPosition = cssClassFaPosition;
     }
 
@@ -146,7 +146,7 @@ HasDescribedAs, HasHidden, HasNamed, HasBookmarking {
     }
 
     @Override
-    public void setDescribedAs(String describedAs) {
+    public void setDescribedAs(final String describedAs) {
         this.describedAs = describedAs;
     }
 
@@ -161,7 +161,7 @@ HasDescribedAs, HasHidden, HasNamed, HasBookmarking {
     }
 
     @Override
-    public void setHidden(Where hidden) {
+    public void setHidden(final Where hidden) {
         this.hidden = hidden;
     }
 
@@ -176,27 +176,10 @@ HasDescribedAs, HasHidden, HasNamed, HasBookmarking {
     }
 
     @Override
-    public void setNamed(String named) {
+    public void setNamed(final String named) {
         this.named = named;
     }
 
-
-
-    private Boolean namedEscaped;
-
-    @Override
-    @XmlAttribute(required = false)
-    public Boolean getNamedEscaped() {
-        return namedEscaped;
-    }
-
-    @Override
-    public void setNamedEscaped(Boolean namedEscaped) {
-        this.namedEscaped = namedEscaped;
-    }
-
-
-
     private org.apache.isis.applib.annotation.ActionLayout.Position position;
 
     @XmlAttribute(required = false)
@@ -204,7 +187,7 @@ HasDescribedAs, HasHidden, HasNamed, HasBookmarking {
         return position;
     }
 
-    public void setPosition(org.apache.isis.applib.annotation.ActionLayout.Position position) {
+    public void setPosition(final org.apache.isis.applib.annotation.ActionLayout.Position position) {
         this.position = position;
     }
 
@@ -216,7 +199,7 @@ HasDescribedAs, HasHidden, HasNamed, HasBookmarking {
         return promptStyle;
     }
 
-    public void setPromptStyle(PromptStyle promptStyle) {
+    public void setPromptStyle(final PromptStyle promptStyle) {
         this.promptStyle = promptStyle;
     }
 
@@ -229,7 +212,7 @@ HasDescribedAs, HasHidden, HasNamed, HasBookmarking {
         return redirect;
     }
 
-    public void setRedirect(Redirect redirect) {
+    public void setRedirect(final Redirect redirect) {
         this.redirect = redirect;
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/layout/component/CollectionLayoutData.java b/api/applib/src/main/java/org/apache/isis/applib/layout/component/CollectionLayoutData.java
index ecb1292..44bf460 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/layout/component/CollectionLayoutData.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/layout/component/CollectionLayoutData.java
@@ -32,7 +32,7 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.layout.links.Link;
 
 /**
- * Describes the layout of a single collection, broadly corresponds to the 
+ * Describes the layout of a single collection, broadly corresponds to the
  * {@link org.apache.isis.applib.annotation.CollectionLayout} annotation.
  *
  * @since 1.x {@index}
@@ -76,7 +76,7 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed {
         return id;
     }
 
-    public void setId(String id) {
+    public void setId(final String id) {
         this.id = id;
     }
 
@@ -91,7 +91,7 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed {
     }
 
     @Override
-    public void setCssClass(String cssClass) {
+    public void setCssClass(final String cssClass) {
         this.cssClass = cssClass;
     }
 
@@ -106,7 +106,7 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed {
     }
 
     @Override
-    public void setDescribedAs(String describedAs) {
+    public void setDescribedAs(final String describedAs) {
         this.describedAs = describedAs;
     }
 
@@ -123,7 +123,7 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed {
         return defaultView;
     }
 
-    public void setDefaultView(String defaultView) {
+    public void setDefaultView(final String defaultView) {
         this.defaultView = defaultView;
     }
 
@@ -137,7 +137,7 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed {
     }
 
     @Override
-    public void setHidden(Where hidden) {
+    public void setHidden(final Where hidden) {
         this.hidden = hidden;
     }
 
@@ -151,25 +151,10 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed {
     }
 
     @Override
-    public void setNamed(String named) {
+    public void setNamed(final String named) {
         this.named = named;
     }
 
-
-    private Boolean namedEscaped;
-
-    @Override
-    @XmlAttribute(required = false)
-    public Boolean getNamedEscaped() {
-        return namedEscaped;
-    }
-
-    @Override
-    public void setNamedEscaped(Boolean namedEscaped) {
-        this.namedEscaped = namedEscaped;
-    }
-
-
     private Integer paged;
 
     @XmlAttribute(required = false)
@@ -177,7 +162,7 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed {
         return paged;
     }
 
-    public void setPaged(Integer paged) {
+    public void setPaged(final Integer paged) {
         this.paged = paged;
     }
 
@@ -190,7 +175,7 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed {
         return sortedBy;
     }
 
-    public void setSortedBy(String sortedBy) {
+    public void setSortedBy(final String sortedBy) {
         this.sortedBy = sortedBy;
     }
 
@@ -206,7 +191,7 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed {
     }
 
     @Override
-    public void setActions(List<ActionLayoutData> actionLayoutDatas) {
+    public void setActions(final List<ActionLayoutData> actionLayoutDatas) {
         this.actions = actionLayoutDatas;
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/layout/component/DomainObjectLayoutData.java b/api/applib/src/main/java/org/apache/isis/applib/layout/component/DomainObjectLayoutData.java
index 7493d72..dfecad3 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/layout/component/DomainObjectLayoutData.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/layout/component/DomainObjectLayoutData.java
@@ -65,7 +65,7 @@ HasBookmarking, HasCssClass, HasCssClassFa, HasDescribedAs, HasNamed {
     }
 
     @Override
-    public void setBookmarking(BookmarkPolicy bookmarking) {
+    public void setBookmarking(final BookmarkPolicy bookmarking) {
         this.bookmarking = bookmarking;
     }
 
@@ -80,7 +80,7 @@ HasBookmarking, HasCssClass, HasCssClassFa, HasDescribedAs, HasNamed {
     }
 
     @Override
-    public void setCssClass(String cssClass) {
+    public void setCssClass(final String cssClass) {
         this.cssClass = cssClass;
     }
 
@@ -94,7 +94,7 @@ HasBookmarking, HasCssClass, HasCssClassFa, HasDescribedAs, HasNamed {
     }
 
     @Override
-    public void setCssClassFa(String cssClassFa) {
+    public void setCssClassFa(final String cssClassFa) {
         this.cssClassFa = cssClassFa;
     }
 
@@ -109,7 +109,7 @@ HasBookmarking, HasCssClass, HasCssClassFa, HasDescribedAs, HasNamed {
     }
 
     @Override
-    public void setCssClassFaPosition(CssClassFaPosition cssClassFaPosition) {
+    public void setCssClassFaPosition(final CssClassFaPosition cssClassFaPosition) {
         this.cssClassFaPosition = cssClassFaPosition;
     }
 
@@ -123,7 +123,7 @@ HasBookmarking, HasCssClass, HasCssClassFa, HasDescribedAs, HasNamed {
     }
 
     @Override
-    public void setDescribedAs(String describedAs) {
+    public void setDescribedAs(final String describedAs) {
         this.describedAs = describedAs;
     }
 
@@ -138,24 +138,11 @@ HasBookmarking, HasCssClass, HasCssClassFa, HasDescribedAs, HasNamed {
     }
 
     @Override
-    public void setNamed(String named) {
+    public void setNamed(final String named) {
         this.named = named;
     }
 
 
-    private Boolean namedEscaped;
-
-    @Override
-    @XmlAttribute(required = false)
-    public Boolean getNamedEscaped() {
-        return namedEscaped;
-    }
-
-    @Override
-    public void setNamedEscaped(Boolean namedEscaped) {
-        this.namedEscaped = namedEscaped;
-    }
-
 
 
     private String plural;
@@ -165,7 +152,7 @@ HasBookmarking, HasCssClass, HasCssClassFa, HasDescribedAs, HasNamed {
         return plural;
     }
 
-    public void setPlural(String plural) {
+    public void setPlural(final String plural) {
         this.plural = plural;
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/layout/component/HasNamed.java b/api/applib/src/main/java/org/apache/isis/applib/layout/component/HasNamed.java
index 158ce1b..56a74f7 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/layout/component/HasNamed.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/layout/component/HasNamed.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.applib.layout.component;
 
-import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 
 /**
@@ -30,9 +29,4 @@ public interface HasNamed {
     String getNamed();
     void setNamed(String named);
 
-    @Deprecated // ignored
-    @XmlAttribute(required = false)
-    Boolean getNamedEscaped();
-    void setNamedEscaped(Boolean namedEscaped);
-
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/layout/component/PropertyLayoutData.java b/api/applib/src/main/java/org/apache/isis/applib/layout/component/PropertyLayoutData.java
index f8e37d4..d520e59 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/layout/component/PropertyLayoutData.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/layout/component/PropertyLayoutData.java
@@ -78,7 +78,7 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed  {
         return id;
     }
 
-    public void setId(String id) {
+    public void setId(final String id) {
         this.id = id;
     }
 
@@ -93,7 +93,7 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed  {
     }
 
     @Override
-    public void setCssClass(String cssClass) {
+    public void setCssClass(final String cssClass) {
         this.cssClass = cssClass;
     }
 
@@ -107,7 +107,7 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed  {
     }
 
     @Override
-    public void setDescribedAs(String describedAs) {
+    public void setDescribedAs(final String describedAs) {
         this.describedAs = describedAs;
     }
 
@@ -121,7 +121,7 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed  {
     }
 
     @Override
-    public void setHidden(Where hidden) {
+    public void setHidden(final Where hidden) {
         this.hidden = hidden;
     }
 
@@ -133,7 +133,7 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed  {
         return labelPosition;
     }
 
-    public void setLabelPosition(LabelPosition labelPosition) {
+    public void setLabelPosition(final LabelPosition labelPosition) {
         this.labelPosition = labelPosition;
     }
 
@@ -145,7 +145,7 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed  {
         return multiLine;
     }
 
-    public void setMultiLine(Integer multiLine) {
+    public void setMultiLine(final Integer multiLine) {
         this.multiLine = multiLine;
     }
 
@@ -159,25 +159,11 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed  {
     }
 
     @Override
-    public void setNamed(String named) {
+    public void setNamed(final String named) {
         this.named = named;
     }
 
 
-    private Boolean namedEscaped;
-
-    @Override
-    @XmlAttribute(required = false)
-    public Boolean getNamedEscaped() {
-        return namedEscaped;
-    }
-
-    @Override
-    public void setNamedEscaped(Boolean namedEscaped) {
-        this.namedEscaped = namedEscaped;
-    }
-
-
     private PromptStyle promptStyle;
 
     @XmlAttribute(required = false)
@@ -185,7 +171,7 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed  {
         return promptStyle;
     }
 
-    public void setPromptStyle(PromptStyle promptStyle) {
+    public void setPromptStyle(final PromptStyle promptStyle) {
         this.promptStyle = promptStyle;
     }
 
@@ -208,7 +194,7 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed  {
         return typicalLength;
     }
 
-    public void setTypicalLength(Integer typicalLength) {
+    public void setTypicalLength(final Integer typicalLength) {
         this.typicalLength = typicalLength;
     }
 
@@ -234,7 +220,7 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed  {
     }
 
     @Override
-    public void setActions(List<ActionLayoutData> actionLayoutDatas) {
+    public void setActions(final List<ActionLayoutData> actionLayoutDatas) {
         this.actions = actionLayoutDatas;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/HasNoun.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/HasNoun.java
index d68ef2c..5207060 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/HasNoun.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/HasNoun.java
@@ -18,46 +18,66 @@
  */
 package org.apache.isis.core.metamodel.facets.all.i8n.noun;
 
+import java.util.Optional;
+
 import javax.annotation.Nullable;
 
 import org.apache.isis.commons.collections.ImmutableEnumSet;
 import org.apache.isis.core.metamodel.facets.all.i8n.HasMemoizableTranslation;
 
+import lombok.NonNull;
+
 public interface HasNoun
 extends HasMemoizableTranslation {
 
     /**
-     * Originating text of preferred NounForm to be translated before use in the UI.
+     * Originating text to be translated before use in the UI.
+     * @return {@code Optional.empty()} if {@code nounForm} is not supported
      */
-    String preferredText();
+    Optional<String> text(@NonNull NounForm nounForm);
 
     /**
-     * Translated text of preferred NounForm to be used in the UI.
+     * Translated text to be used in the UI.
+     * @return {@code Optional.empty()} if {@code nounForm} is not supported
      */
-    String preferredTranslated();
+    Optional<String> translated(@NonNull NounForm nounForm);
+
+    ImmutableEnumSet<NounForm> getSupportedNounForms();
+
+    @Override
+    default void memoizeTranslations() {
+        getSupportedNounForms().forEach(this::translated);
+    }
+
+    // -- SHORTCUTS
 
     /**
-     * Originating text to be translated before use in the UI.
+     * Originating text of singular noun-form to be translated before use in the UI.
      */
-    String text(NounForm nounForm);
+    default @Nullable String singular() {
+        return text(NounForm.SINGULAR).orElse(null);
+    }
 
     /**
-     * Translated text to be used in the UI.
+     * Translated text of singular noun-form to be used in the UI.
      */
-    String translated(NounForm nounForm);
-
-    ImmutableEnumSet<NounForm> getSupportedNounForms();
+    default @Nullable String singularTranslated() {
+        return translated(NounForm.SINGULAR).orElse(null);
+    }
 
-    @Nullable
-    default String translatedElseNull(final NounForm nounForm) {
-        return getSupportedNounForms().contains(nounForm)
-                ? translated(nounForm)
-                : null;
+    /**
+     * Originating text of plural noun-form to be translated before use in the UI.
+     */
+    default @Nullable String plural() {
+        return text(NounForm.PLURAL).orElse(null);
     }
 
-    @Override
-    default void memoizeTranslations() {
-        getSupportedNounForms().forEach(this::translated);
+    /**
+     * Translated text of plural noun-form to be used in the UI.
+     */
+    default @Nullable String pluralTranslated() {
+        return translated(NounForm.PLURAL).orElse(null);
     }
 
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/HasNounFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/HasNounFacetAbstract.java
index bcd2d42..07bf642 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/HasNounFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/HasNounFacetAbstract.java
@@ -19,6 +19,7 @@
 package org.apache.isis.core.metamodel.facets.all.i8n.noun;
 
 import java.util.Objects;
+import java.util.Optional;
 import java.util.function.BiConsumer;
 import java.util.stream.Collectors;
 
@@ -63,23 +64,13 @@ implements HasNoun {
     }
 
     @Override
-    public final String preferredText() {
-        return text(nounForms.getPreferredNounForm());
+    public final Optional<String> text(final @NonNull NounForm nounForm) {
+        return nounForms.lookup(nounForm);
     }
 
     @Override
-    public final String preferredTranslated() {
-        return translated(nounForms.getPreferredNounForm());
-    }
-
-    @Override
-    public final String text(final @NonNull NounForm nounForm) {
-        return nounForms.get(nounForm);
-    }
-
-    @Override
-    public final String translated(final NounForm nounForm) {
-        return translatedNounForms.get().get(nounForm);
+    public final Optional<String> translated(final @NonNull NounForm nounForm) {
+        return translatedNounForms.get().lookup(nounForm);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/NounForms.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/NounForms.java
index bb7861e..d8dd489 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/NounForms.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/NounForms.java
@@ -19,6 +19,7 @@
 package org.apache.isis.core.metamodel.facets.all.i8n.noun;
 
 import java.util.EnumSet;
+import java.util.Optional;
 
 import javax.annotation.Nullable;
 
@@ -75,15 +76,17 @@ public class NounForms {
         return ImmutableEnumSet.from(supportedNounForms);
     }
 
-    public String get(final @NonNull NounForm nounForm) {
+    public Optional<String> lookup(final @NonNull NounForm nounForm) {
         if(!getSupportedNounForms().contains(nounForm)) {
-            throw _Exceptions.illegalArgument("NounForm %s not supported with this instance", nounForm);
+            return Optional.empty();
         };
         switch(nounForm) {
         case SINGULAR:
-            return getSingular();
+            // non-null, as nulls are guarded by getSupportedNounForms()
+            return Optional.of(getSingular());
         case PLURAL:
-            return getPlural();
+            // non-null, as nulls are guarded by getSupportedNounForms()
+            return Optional.of(getPlural());
         default:
             break;
         }
@@ -98,7 +101,6 @@ public class NounForms {
                 .builder()
                 .preferredNounForm(preferredNounForm);
 
-
         getSupportedNounForms()
         .forEach(nounForm->{
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layout/LayoutFacetUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layout/LayoutFacetUtil.java
index d163db4..2737412 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layout/LayoutFacetUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layout/LayoutFacetUtil.java
@@ -136,13 +136,8 @@ public class LayoutFacetUtil {
 
         facetHolder.lookupNonFallbackFacet(ObjectNamedFacet.class)
         .filter(namedFacet->namedFacet.getSupportedNounForms().contains(NounForm.SINGULAR))
-        .ifPresent(namedFacet->{
-            final String named = namedFacet.translated(NounForm.SINGULAR);
-            if(!_Strings.isNullOrEmpty(named)){
-                hasNamed.setNamed(named);
-            }
-            hasNamed.setNamedEscaped(true);
-        });
+        .map(ObjectNamedFacet::singularTranslated)
+        .ifPresent(hasNamed::setNamed);
     }
 
     private void setObjectDescribedIfAny(
@@ -151,11 +146,8 @@ public class LayoutFacetUtil {
 
         facetHolder.lookupNonFallbackFacet(ObjectDescribedFacet.class)
         .map(ObjectDescribedFacet::translated)
-        .ifPresent(describedAs->{
-            if(_Strings.isNotEmpty(describedAs)) {
-                hasDescribedAs.setDescribedAs(describedAs);
-            }
-        });
+        .filter(_Strings::isNotEmpty)
+        .ifPresent(hasDescribedAs::setDescribedAs);
     }
 
     private void setMemberNamedIfAny(
@@ -250,14 +242,11 @@ public class LayoutFacetUtil {
             final DomainObjectLayoutData domainObjectLayoutData,
             final FacetHolder facetHolder) {
 
-        facetHolder.lookupNonFallbackFacet(ObjectNamedFacet.class)
+        facetHolder
+        .lookupNonFallbackFacet(ObjectNamedFacet.class)
         .filter(namedFacet->namedFacet.getSupportedNounForms().contains(NounForm.PLURAL))
-        .ifPresent(namedFacet->{
-            val plural = namedFacet.translated(NounForm.PLURAL);
-            if(!_Strings.isNullOrEmpty(plural)) {
-                domainObjectLayoutData.setPlural(plural);
-            }
-        });
+        .map(ObjectNamedFacet::pluralTranslated)
+        .ifPresent(domainObjectLayoutData::setPlural);
     }
 
     public void setActionPositionIfAny(
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 8078b88..dfbf254 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
@@ -485,15 +485,15 @@ implements ObjectSpecification {
     @Override
     public String getSingularName() {
         return lookupFacet(ObjectNamedFacet.class)
-            .map(textFacet->textFacet.translatedElseNull(NounForm.SINGULAR))
+            .flatMap(textFacet->textFacet.translated(NounForm.SINGULAR))
             .orElseGet(this::getFullIdentifier);
     }
 
     @Override
     public String getPluralName() {
         return lookupFacet(ObjectNamedFacet.class)
-                .map(textFacet->textFacet.translatedElseNull(NounForm.PLURAL))
-                .orElseGet(this::getFullIdentifier);
+            .flatMap(textFacet->textFacet.translated(NounForm.PLURAL))
+            .orElseGet(this::getFullIdentifier);
     }
 
     /**
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/named/PropertyLayoutNamedVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/named/PropertyLayoutNamedVm-description.adoc
index bf86fb7..1d8751b 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/named/PropertyLayoutNamedVm-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/named/PropertyLayoutNamedVm-description.adoc
@@ -113,48 +113,3 @@ include::PropertyLayoutNamedVm_updateWithMetaAnnotationOverridden.java[tags=meta
 <.> name from meta-annotation ...
 <.> \... is overridden by the `@PropertyLayout` annotation
 
-
-== Markup
-
-The name can include HTML markup:
-
-* for a property:
-+
-[source,java,indent=0]
-----
-include::PropertyLayoutNamedVm.java[tags=markup]
-----
-<.> Name includes HTML markup
-<.> which is rendered as HTML provided that escaping is switched off
-
-* and for a parameter:
-+
-[source,java,indent=0]
-----
-include::PropertyLayoutNamedVm_updateWithMarkup.java[tags=markup]
-----
-<.> Name includes HTML markup
-<.> which is rendered as HTML provided that escaping is switched off
-
-
-
-The HTML markup can also be escaped, using the `namedEscaped` attribute:
-
-* for a property:
-+
-[source,java,indent=0]
-----
-include::PropertyLayoutNamedVm.java[tags=markup-escaped]
-----
-<.> Name includes HTML markup
-<.> which is rendered as is if escaping is enabled
-
-* and for a parameter:
-+
-[source,java,indent=0]
-----
-include::PropertyLayoutNamedVm_updateWithEscapedMarkup.java[tags=escaped-markup]
-----
-<.> Name includes HTML markup
-<.> which is rendered as is if escaping is enabled
-
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/named/PropertyLayoutNamedVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/named/PropertyLayoutNamedVm.java
index ed3c6f8..175ce6d 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/named/PropertyLayoutNamedVm.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/named/PropertyLayoutNamedVm.java
@@ -31,10 +31,11 @@ import org.apache.isis.applib.annotation.Optionality;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 
-import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 import lombok.Getter;
 import lombok.Setter;
 
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+
 //tag::class[]
 @XmlRootElement(name = "root")
 @XmlType
@@ -100,33 +101,5 @@ public class PropertyLayoutNamedVm implements HasAsciiDocDescription {
     private String propertyUsingMetaAnnotationButOverridden;
 //end::meta-annotated-overridden[]
 
-    //tag::markup[]
-    @Property(optionality = Optionality.OPTIONAL)
-    @PropertyLayout(
-        named = "Named <b>uses</b> <i>markup</i>",          // <.>
-        namedEscaped = false                                // <.>
-        , describedAs =
-            "@PropertyLayout(named= \"...\", namedEscaped=false)",
-        fieldSetId = "markup", sequence = "1")
-    @XmlElement(required = false)
-    @Getter @Setter
-    private String propertyUsingMarkup;
-//end::markup[]
-
-    //tag::markup-escaped[]
-    @Property(optionality = Optionality.OPTIONAL)
-    @PropertyLayout(
-        named = "Named <b>but</b> <i>escaped</i>",          // <.>
-        namedEscaped = true                                 // <.>
-        , describedAs =
-            "@PropertyLayout(" +
-            "named = \"...\", namedEscaped=true)",
-        fieldSetId = "markup", sequence = "2")
-    @XmlElement(required = false)
-    @Getter @Setter
-    private String propertyUsingEscapedMarkup;
-//end::markup-escaped[]
-
-
 }
 //end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/named/PropertyLayoutNamedVm_updateWithEscapedMarkup.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/named/PropertyLayoutNamedVm_updateWithEscapedMarkup.java
deleted file mode 100644
index 606f971..0000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/named/PropertyLayoutNamedVm_updateWithEscapedMarkup.java
+++ /dev/null
@@ -1,59 +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 demoapp.dom.domain.properties.PropertyLayout.named;
-
-import org.apache.isis.applib.annotation.Action;
-import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.applib.annotation.Optionality;
-import org.apache.isis.applib.annotation.Parameter;
-import org.apache.isis.applib.annotation.ParameterLayout;
-import org.apache.isis.applib.annotation.SemanticsOf;
-
-import lombok.RequiredArgsConstructor;
-
-@Action(
-    semantics = SemanticsOf.IDEMPOTENT
-)
-@ActionLayout(
-    associateWith = "propertyUsingEscapedMarkup"
-    , sequence = "1")
-@RequiredArgsConstructor
-public class PropertyLayoutNamedVm_updateWithEscapedMarkup {
-
-    private final PropertyLayoutNamedVm propertyLayoutNamedVm;
-
-//tag::escaped-markup[]
-    public PropertyLayoutNamedVm act(
-            @Parameter(optionality = Optionality.OPTIONAL)
-            @ParameterLayout(
-                named = "Named <b>but</b> <i>escaped</i>",          // <.>
-                namedEscaped = true,                                // <.>
-                describedAs =
-                    "@ParameterLayout(named = \"...\", namedEscaped = true)"
-            )
-            final String newValue) {
-        propertyLayoutNamedVm.setPropertyUsingEscapedMarkup(newValue);
-        return propertyLayoutNamedVm;
-    }
-//end::escaped-markup[]
-    public String default0Act() {
-        return propertyLayoutNamedVm.getPropertyUsingEscapedMarkup();
-    }
-
-}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/named/PropertyLayoutNamedVm_updateWithMarkup.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/named/PropertyLayoutNamedVm_updateWithMarkup.java
deleted file mode 100644
index 257efab..0000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/named/PropertyLayoutNamedVm_updateWithMarkup.java
+++ /dev/null
@@ -1,60 +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 demoapp.dom.domain.properties.PropertyLayout.named;
-
-import org.apache.isis.applib.annotation.Action;
-import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.applib.annotation.Optionality;
-import org.apache.isis.applib.annotation.Parameter;
-import org.apache.isis.applib.annotation.ParameterLayout;
-import org.apache.isis.applib.annotation.SemanticsOf;
-
-import lombok.RequiredArgsConstructor;
-
-@Action(
-    semantics = SemanticsOf.IDEMPOTENT
-)
-@ActionLayout(
-    associateWith = "propertyUsingMarkup"
-    , sequence = "1")
-@RequiredArgsConstructor
-public class PropertyLayoutNamedVm_updateWithMarkup {
-
-    private final PropertyLayoutNamedVm propertyLayoutNamedVm;
-
-//tag::markup[]
-    public PropertyLayoutNamedVm act(
-            @Parameter(optionality = Optionality.OPTIONAL)
-            @ParameterLayout(
-                named = "Named <b>uses</b> <i>markup</i>",      // <.>
-                namedEscaped = false,                           // <.>
-                describedAs =
-                    "@ParameterLayout(" +
-                        "named = \"...\", namedEscaped = false)"
-            )
-            final String newValue) {
-        propertyLayoutNamedVm.setPropertyUsingMarkup(newValue);
-        return propertyLayoutNamedVm;
-    }
-//end::markup[]
-    public String default0Act() {
-        return propertyLayoutNamedVm.getPropertyUsingMarkup();
-    }
-
-}