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 20:29:43 UTC

[isis] branch master updated: ISIS-2871: fixes all markup components to actually use value semantics

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 6fbee7e  ISIS-2871: fixes all markup components to actually use value semantics
6fbee7e is described below

commit 6fbee7e0b53f4a0782e8c6aa844c00f3feb1380a
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Sep 17 22:29:34 2021 +0200

    ISIS-2871: fixes all markup components to actually use value semantics
---
 .../title/parser/TitleFacetUsingValueFacet.java    | 11 ++----
 .../metamodel/facets/object/value/ValueFacet.java  |  2 +
 .../facets/object/value/ValueFacetAbstract.java    | 23 +++++------
 .../schema/chg/v2/ChangesDtoComponentWkt.java      | 21 +++++-----
 .../schema/cmd/v2/CommandDtoComponentWkt.java      | 18 +++++----
 .../schema/ixn/v2/InteractionDtoComponentWkt.java  | 18 +++++----
 .../components/scalars/markup/MarkupComponent.java | 45 ++++++++++++++--------
 7 files changed, 77 insertions(+), 61 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/parser/TitleFacetUsingValueFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/parser/TitleFacetUsingValueFacet.java
index b2f1f8c..7f74e9e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/parser/TitleFacetUsingValueFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/parser/TitleFacetUsingValueFacet.java
@@ -21,8 +21,6 @@ package org.apache.isis.core.metamodel.facets.object.title.parser;
 import java.util.function.BiConsumer;
 
 import org.apache.isis.applib.adapters.Renderer;
-import org.apache.isis.applib.adapters.ValueSemanticsProvider;
-import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -60,8 +58,8 @@ implements TitleFacet {
             return null;
         }
 
-        // support for qualified value semantics, requires a 'where' context,
-        // that is what property, collection, action return or action param this is to be rendered for ...
+        // support for qualified value semantics, requires a 'where' context, that is,
+        // what property, collection, action return or action param this is to be rendered for ...
 
         if(renderRequest.getFeature() instanceof OneToOneAssociation) {
             final Renderer renderer = valueFacet
@@ -76,10 +74,7 @@ implements TitleFacet {
 
         // fall back to default value semantics ...
 
-        return valueFacet.getValueSemantics().stream()
-        .map(ValueSemanticsProvider::getRenderer)
-        .filter(_NullSafe::isPresent)
-        .findFirst()
+        return valueFacet.selectDefaultRenderer()
         .map(renderer->(Renderer) renderer)
         .map(renderer->renderer.presentationValue(valueFacet.createValueSemanticsContext(), pojo))
         .orElseGet(()->String.format("Value type %s has no value semantics for title rendering.",
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java
index 6781a34..da53afd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java
@@ -65,6 +65,8 @@ public interface ValueFacet<T> extends Facet {
 
     // -- RENDERER
 
+    /** no qualifiers allowed when searching the default semantics provider*/
+    Optional<Renderer<T>> selectDefaultRenderer();
     Optional<Renderer<T>> selectRendererForParameter(final ObjectActionParameter param);
     Optional<Renderer<T>> selectRendererForProperty(final OneToOneAssociation prop);
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
index fcb6974..3fe1557 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
@@ -74,7 +74,7 @@ implements ValueFacet<T> {
     @Override
     public boolean semanticEquals(@NonNull final Facet other) {
         return (other instanceof ValueFacetAbstract)
-                ? this.getValueSemantics().equals(((ValueFacetAbstract)other).getValueSemantics())
+                ? this.getValueSemantics().equals(((ValueFacetAbstract<?>)other).getValueSemantics())
                 : false;
     }
 
@@ -124,6 +124,16 @@ implements ValueFacet<T> {
     // -- RENDERER
 
     @Override
+    public Optional<Renderer<T>> selectDefaultRenderer() {
+        return getValueSemantics()
+                .stream()
+                .filter(isMatchingAnyOf(Can.empty()))
+                .map(ValueSemanticsProvider::getRenderer)
+                .filter(_NullSafe::isPresent)
+                .findFirst();
+    }
+
+    @Override
     public Optional<Renderer<T>> selectRendererForParameter(final ObjectActionParameter param) {
         return streamValueSemanticsHonoringQualifiers(param)
                 .map(ValueSemanticsProvider::getRenderer)
@@ -163,21 +173,12 @@ implements ValueFacet<T> {
         .map(_Strings::emptyToNull)
         .stream()
         .collect(Can.toCan());
-
-//      System.err.printf("got: %s %s%n",
-//      prop.getFeatureIdentifier(),
-//      qualifiersRequired);
-//if(prop.getFeatureIdentifier().getLogicalType().getClassName().contains("AsciiDocValueSemanticsWithPreprocessing")
-//      || prop.getFeatureIdentifier().getLogicalType().getClassName().contains("HasAsciiDocDescription")
-//      ) {
-//  System.out.println("bingo: " + qualifiersRequired);
-//}
     }
 
     private Predicate<ValueSemanticsProvider<T>> isMatchingAnyOf(final Can<String> qualifiersAccepted) {
         return valueSemantics->{
 
-            // qualifiers required vs. qualifiers present on bean type
+            // qualifiers accepted vs. qualifiers present on bean type
             // 1. empty     vs. empty      ->  accept
             // 2. empty     vs. not-empty  ->  reject
             // 3. not-empty vs. empty      ->  reject
diff --git a/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/chg/v2/ChangesDtoComponentWkt.java b/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/chg/v2/ChangesDtoComponentWkt.java
index 02d2f46..5791518 100644
--- a/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/chg/v2/ChangesDtoComponentWkt.java
+++ b/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/chg/v2/ChangesDtoComponentWkt.java
@@ -20,24 +20,25 @@ package org.apache.isis.valuetypes.asciidoc.ui.wkt.components.schema.chg.v2;
 
 import org.apache.wicket.model.IModel;
 
-import org.apache.isis.applib.util.schema.ChangesDtoUtils;
-import org.apache.isis.schema.chg.v2.ChangesDto;
 import org.apache.isis.valuetypes.asciidoc.ui.wkt.components.AsciiDocForXmlComponentWkt;
 
+@Deprecated
 public class ChangesDtoComponentWkt extends AsciiDocForXmlComponentWkt {
 
     private static final long serialVersionUID = 1L;
 
-    public ChangesDtoComponentWkt(String id, IModel<?> model) {
+    public ChangesDtoComponentWkt(final String id, final IModel<?> model) {
         super(id, model);
     }
 
-    @Override
-    protected String asHtml(Object value) {
-        if(value instanceof ChangesDto) {
-            return asHtml(ChangesDtoUtils.toXml((ChangesDto) value));
-        }
-        return super.asHtml(value);
-    }
+
+//TODO provide custom value semantics instead
+//    @Override
+//    protected String asHtml(Object value) {
+//        if(value instanceof ChangesDto) {
+//            return asHtml(ChangesDtoUtils.toXml((ChangesDto) value));
+//        }
+//        return super.asHtml(value);
+//    }
 
 }
diff --git a/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/cmd/v2/CommandDtoComponentWkt.java b/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/cmd/v2/CommandDtoComponentWkt.java
index f8df038..0791dfd 100644
--- a/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/cmd/v2/CommandDtoComponentWkt.java
+++ b/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/cmd/v2/CommandDtoComponentWkt.java
@@ -24,20 +24,22 @@ import org.apache.isis.applib.util.schema.CommandDtoUtils;
 import org.apache.isis.schema.cmd.v2.CommandDto;
 import org.apache.isis.valuetypes.asciidoc.ui.wkt.components.AsciiDocForXmlComponentWkt;
 
+@Deprecated
 public class CommandDtoComponentWkt extends AsciiDocForXmlComponentWkt {
 
     private static final long serialVersionUID = 1L;
 
-    public CommandDtoComponentWkt(String id, IModel<?> model) {
+    public CommandDtoComponentWkt(final String id, final IModel<?> model) {
         super(id, model);
     }
 
-    @Override
-    protected String asHtml(Object value) {
-        if(value instanceof CommandDto) {
-            return asHtml(CommandDtoUtils.toXml((CommandDto) value));
-        }
-        return super.asHtml(value);
-    }
+  //TODO provide custom value semantics instead
+//    @Override
+//    protected String asHtml(Object value) {
+//        if(value instanceof CommandDto) {
+//            return asHtml(CommandDtoUtils.toXml((CommandDto) value));
+//        }
+//        return super.asHtml(value);
+//    }
 
 }
diff --git a/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/ixn/v2/InteractionDtoComponentWkt.java b/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/ixn/v2/InteractionDtoComponentWkt.java
index d727b5e..9872c03 100644
--- a/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/ixn/v2/InteractionDtoComponentWkt.java
+++ b/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/ixn/v2/InteractionDtoComponentWkt.java
@@ -24,20 +24,22 @@ import org.apache.isis.applib.util.schema.InteractionDtoUtils;
 import org.apache.isis.schema.ixn.v2.InteractionDto;
 import org.apache.isis.valuetypes.asciidoc.ui.wkt.components.AsciiDocForXmlComponentWkt;
 
+@Deprecated
 public class InteractionDtoComponentWkt extends AsciiDocForXmlComponentWkt {
 
     private static final long serialVersionUID = 1L;
 
-    public InteractionDtoComponentWkt(String id, IModel<?> model) {
+    public InteractionDtoComponentWkt(final String id, final IModel<?> model) {
         super(id, model);
     }
 
-    @Override
-    protected String asHtml(Object value) {
-        if(value instanceof InteractionDto) {
-            return asHtml(InteractionDtoUtils.toXml((InteractionDto) value));
-        }
-        return super.asHtml(value);
-    }
+  //TODO provide custom value semantics instead
+//    @Override
+//    protected String asHtml(Object value) {
+//        if(value instanceof InteractionDto) {
+//            return asHtml(InteractionDtoUtils.toXml((InteractionDto) value));
+//        }
+//        return super.asHtml(value);
+//    }
 
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupComponent.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupComponent.java
index 58d0ca8..d263a01 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupComponent.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupComponent.java
@@ -18,40 +18,43 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.scalars.markup;
 
+import java.util.Optional;
+
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.MarkupStream;
 import org.apache.wicket.markup.html.WebComponent;
 import org.apache.wicket.markup.parser.XmlTag.TagType;
 import org.apache.wicket.model.IModel;
 
-import org.apache.isis.applib.value.HasHtml;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
-
-import lombok.val;
+import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
+import org.apache.isis.viewer.wicket.model.models.ScalarParameterModel;
+import org.apache.isis.viewer.wicket.model.models.ScalarPropertyModel;
+import org.apache.isis.viewer.wicket.model.models.ValueModel;
 
 public class MarkupComponent extends WebComponent {
 
     private static final long serialVersionUID = 1L;
 
-    public MarkupComponent(final String id, IModel<?> model){
+    public MarkupComponent(final String id, final IModel<?> model){
         super(id, model);
     }
 
     @Override
     public void onComponentTagBody(final MarkupStream markupStream, final ComponentTag openTag){
-        val htmlContent = extractHtmlOrElse(getDefaultModelObject(), "" /*fallback*/);
+        final var htmlContent = extractHtmlOrElse(getDefaultModelObject(), "" /*fallback*/);
         replaceComponentTagBody(markupStream, openTag, htmlContent);
     }
 
     @Override
-    protected void onComponentTag(ComponentTag tag)	{
+    protected void onComponentTag(final ComponentTag tag)	{
         super.onComponentTag(tag);
         tag.setType(TagType.OPEN);
     }
 
     // -- HELPER
 
-    protected CharSequence extractHtmlOrElse(Object modelObject, final String fallback) {
+    protected CharSequence extractHtmlOrElse(final Object modelObject, final String fallback) {
 
         if(modelObject==null) {
             return fallback;
@@ -59,14 +62,16 @@ public class MarkupComponent extends WebComponent {
 
         if(modelObject instanceof ManagedObject) {
 
-            val adapter = (ManagedObject) modelObject;
+            final var adapter = (ManagedObject) modelObject;
 
-            if(adapter.getPojo()==null)
+            if(adapter.getPojo()==null) {
                 return fallback;
+            }
 
-            final Object value = adapter.getPojo();
+            final var asHtml = lookupObjectFeatureIn(getDefaultModel())
+            .map(feature->adapter.titleString(conf->conf.feature(feature)))
+            .orElseGet(adapter::titleString);
 
-            val asHtml = asHtml(value);
             if(asHtml != null) {
                 return asHtml;
             }
@@ -75,14 +80,22 @@ public class MarkupComponent extends WebComponent {
         }
 
         return modelObject.toString();
-
     }
 
-    protected String asHtml(Object value) {
-        if (value instanceof HasHtml) {
-            return ((HasHtml)value).asHtml();
+    // -- HELPER
+
+    protected Optional<ObjectFeature> lookupObjectFeatureIn(final IModel<?> model) {
+        if(model instanceof ScalarPropertyModel) {
+            return Optional.of(((ScalarPropertyModel)model).getMetaModel());
+        }
+        if(model instanceof ScalarParameterModel) {
+            return Optional.of(((ScalarParameterModel)model).getMetaModel());
+        }
+        if(model instanceof ValueModel) {
+            return Optional.ofNullable(((ValueModel)model).getActionModelHint())
+                    .map(act->act.getMetaModel());
         }
-        return null;
+        return Optional.empty();
     }
 
 }