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/18 06:09:47 UTC

[isis] branch master updated: ISIS-2871: prepare: allow plain HTML rendering based on 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 e28fb29  ISIS-2871: prepare: allow plain HTML rendering based on value semantics
e28fb29 is described below

commit e28fb29f2da3bc4f01cc04e7bc23e149b3cceb95
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat Sep 18 08:09:36 2021 +0200

    ISIS-2871: prepare: allow plain HTML rendering based on value semantics
    
    without the need of ever creating additional UI components
---
 .../HasHtml.java => adapters/HtmlRenderer.java}    | 10 ++--
 .../org/apache/isis/applib/adapters/Renderer.java  |  5 +-
 .../java/org/apache/isis/applib/value/Markup.java  | 47 ++++-------------
 .../facets/value/markup/MarkupValueSemantics.java  |  4 +-
 .../dom/types/isisext/sse/AsyncActionMenu.java     |  2 +-
 .../ui/components/markup/MarkupFieldFactory.java   | 28 ++++++----
 .../valuetypes/asciidoc/applib/value/AsciiDoc.java |  8 +--
 .../metamodel/IsisModuleValAsciidocMetaModel.java  |  6 +++
 .../semantics/AsciiDocValueSemantics.java          |  4 +-
 .../semantics/ChangesDtoValueSemantics.java}       | 31 +++++------
 .../semantics/CommandDtoValueSemantics.java}       | 29 +++++-----
 .../semantics/InteractionDtoValueSemantics.java}   | 29 +++++-----
 ...mantics.java => XmlValueSemanticsAbstract.java} | 43 ++++++---------
 .../ui/wkt/IsisModuleValAsciidocUiWkt.java         |  9 ----
 .../schema/chg/v2/ChangesDtoComponentWkt.java      | 44 ----------------
 .../schema/chg/v2/ChangesDtoPanelFactoriesWkt.java | 61 ----------------------
 .../schema/cmd/v2/CommandDtoPanelFactoriesWkt.java | 61 ----------------------
 .../ixn/v2/InteractionDtoPanelFactoriesWkt.java    | 61 ----------------------
 .../valuetypes/markdown/applib/value/Markdown.java |  4 +-
 .../semantics/MarkdownValueSemantics.java          |  4 +-
 .../ui/wkt/webmodule/ServerSentEventsServlet.java  |  2 +-
 21 files changed, 108 insertions(+), 384 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/value/HasHtml.java b/api/applib/src/main/java/org/apache/isis/applib/adapters/HtmlRenderer.java
similarity index 81%
rename from api/applib/src/main/java/org/apache/isis/applib/value/HasHtml.java
rename to api/applib/src/main/java/org/apache/isis/applib/adapters/HtmlRenderer.java
index e6a0a23..afa72e0 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/value/HasHtml.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/adapters/HtmlRenderer.java
@@ -16,14 +16,12 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
-package org.apache.isis.applib.value;
+package org.apache.isis.applib.adapters;
 
 /**
- * @since 2.0 {@index}
+ * Indicates the underlying {@link Renderer} produces plain HTML.
+ * @since 2.x {@index}
  */
-public interface HasHtml {
-
-    String asHtml();
+public interface HtmlRenderer<T> extends Renderer<T> {
 
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/adapters/Renderer.java b/api/applib/src/main/java/org/apache/isis/applib/adapters/Renderer.java
index 6acf062..e865c6bf 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/adapters/Renderer.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/adapters/Renderer.java
@@ -18,10 +18,13 @@
  */
 package org.apache.isis.applib.adapters;
 
+/**
+ * @since 2.x {@index}
+ */
 public interface Renderer<T> {
 
     /**
-     * The value in its read-only presentation form, eg. html. (irreversible)
+     * The value in its read-only presentation form. (irreversible)
      */
     String presentationValue(ValueSemanticsProvider.Context context, T value);
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/value/Markup.java b/api/applib/src/main/java/org/apache/isis/applib/value/Markup.java
index 6933d77..ad1a57e 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/value/Markup.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/value/Markup.java
@@ -29,20 +29,26 @@ import org.apache.isis.applib.IsisModuleApplib;
 import org.apache.isis.applib.annotation.Value;
 import org.apache.isis.commons.internal.base._Strings;
 
+import lombok.EqualsAndHashCode;
+
 /**
- * Intended to be used as a read-only property, to render arbitrary HTML
- * markup into the user interface.
+ * Intended to be used as a read-only property, to render plain HTML.
  *
  * @since 2.0 {@index}
  */
 @Value(logicalTypeName = IsisModuleApplib.NAMESPACE + ".value.Markup")
 @XmlJavaTypeAdapter(Markup.JaxbToStringAdapter.class)   // for JAXB view model support
-public final class Markup implements HasHtml, Serializable {
+@EqualsAndHashCode
+public final class Markup implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
     private final String html;
 
+    public static Markup valueOf(final String html) {
+        return new Markup(html);
+    }
+
     public Markup() {
         this(null);
     }
@@ -51,40 +57,10 @@ public final class Markup implements HasHtml, Serializable {
         this.html = html!=null ? html : "";
     }
 
-    @Override
     public String asHtml() {
         return html;
     }
 
-    public boolean isEqualTo(final Markup other) {
-        return other==null ? false : this.html.equals(other.html);
-    }
-
-    public String title() {
-        return "Markup[length="+html.length()+"]";
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        return isEqualTo((Markup) obj);
-    }
-
-    @Override
-    public int hashCode() {
-        return html.hashCode();
-    }
-
-    @Override
-    public String toString() {
-        return "Markup[length="+html.length()+", html="+html+"]";
-    }
-
     public static final class JaxbToStringAdapter extends XmlAdapter<String, Markup> {
 
         /**
@@ -111,9 +87,6 @@ public final class Markup implements HasHtml, Serializable {
         }
     }
 
-    /** syntactic sugar */
-    public static Markup valueOfHtml(final String html) {
-        return new Markup(html);
-    }
+
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueSemantics.java
index 0e873ea..683b881 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueSemantics.java
@@ -22,8 +22,8 @@ import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.adapters.AbstractValueSemanticsProvider;
 import org.apache.isis.applib.adapters.EncoderDecoder;
+import org.apache.isis.applib.adapters.HtmlRenderer;
 import org.apache.isis.applib.adapters.Parser;
-import org.apache.isis.applib.adapters.Renderer;
 import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.value.Markup;
 
@@ -33,7 +33,7 @@ extends AbstractValueSemanticsProvider<Markup>
 implements
     EncoderDecoder<Markup>,
     Parser<Markup>,
-    Renderer<Markup>{
+    HtmlRenderer<Markup>{
 
     // -- ENCODER DECODER
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/sse/AsyncActionMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/sse/AsyncActionMenu.java
index d6fff00..0ecc8ef 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/sse/AsyncActionMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/sse/AsyncActionMenu.java
@@ -48,7 +48,7 @@ public class AsyncActionMenu {
     public AsyncActionDemo asyncActions(){
         val demo = factoryService.viewModel(new AsyncActionDemo());
         // demo.initDefaults();
-        demo.setProgressView(Markup.valueOfHtml("Please start a task!"));
+        demo.setProgressView(Markup.valueOf("Please start a task!"));
         return demo;
     }
 
diff --git a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/markup/MarkupFieldFactory.java b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/markup/MarkupFieldFactory.java
index 98160ae..f62bf3a8 100644
--- a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/markup/MarkupFieldFactory.java
+++ b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/markup/MarkupFieldFactory.java
@@ -26,14 +26,15 @@ import javax.inject.Inject;
 import org.w3c.dom.events.EventTarget;
 import org.w3c.dom.html.HTMLAnchorElement;
 
+import org.apache.isis.applib.adapters.HtmlRenderer;
 import org.apache.isis.applib.annotation.PriorityPrecedence;
-import org.apache.isis.applib.value.HasHtml;
+import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.incubator.viewer.javafx.ui.components.UiComponentHandlerFx;
 import org.apache.isis.viewer.common.model.components.UiComponentFactory.ComponentRequest;
 
 import lombok.RequiredArgsConstructor;
-import lombok.extern.log4j.Log4j2;
 import lombok.val;
+import lombok.extern.log4j.Log4j2;
 
 import javafx.application.HostServices;
 import javafx.application.Platform;
@@ -55,15 +56,20 @@ public class MarkupFieldFactory implements UiComponentHandlerFx {
     private final HostServices hostServices;
 
     @Override
-    public boolean isHandling(ComponentRequest request) {
-        return request.isFeatureTypeInstanceOf(HasHtml.class);
+    public boolean isHandling(final ComponentRequest request) {
+        return request.getFeatureTypeSpec().hasValueSemantics(HtmlRenderer.class);
     }
 
     @Override
-    public Node handle(ComponentRequest request) {
-        val markupHtml = request.getFeatureValue(HasHtml.class)
-                .map(HasHtml::asHtml)
-                .orElse("");
+    public Node handle(final ComponentRequest request) {
+
+        val pojo = request.getFeatureValue(Object.class);
+
+        val markupHtml = request.getFeatureTypeSpec().streamValueSemantics(HtmlRenderer.class)
+        .map(htmlRenderer->htmlRenderer.presentationValue(null, pojo))
+        .filter(_NullSafe::isPresent)
+        .findFirst()
+        .orElse("");
 
         return new WebViewFitContent(hostServices::showDocument, markupHtml);
     }
@@ -88,7 +94,7 @@ public class MarkupFieldFactory implements UiComponentHandlerFx {
         private final WebView webview = new WebView();
         private final WebEngine webEngine = webview.getEngine();
 
-        public WebViewFitContent(Consumer<String> hrefHandler, String content) {
+        public WebViewFitContent(final Consumer<String> hrefHandler, final String content) {
 
             this.hrefHandler = hrefHandler;
 
@@ -106,7 +112,7 @@ public class MarkupFieldFactory implements UiComponentHandlerFx {
                 }
             });
 
-            webview.getChildrenUnmodifiable().addListener((ListChangeListener.Change<? extends Node> change) -> {
+            webview.getChildrenUnmodifiable().addListener((final ListChangeListener.Change<? extends Node> change) -> {
                 val scrolls = webview.lookupAll(".scroll-bar");
                 for (val scroll : scrolls) {
                     scroll.setVisible(false);
@@ -169,7 +175,7 @@ public class MarkupFieldFactory implements UiComponentHandlerFx {
 
 
 
-        private String getHtml(String content) {
+        private String getHtml(final String content) {
             return "<html><body>" +
                     "<div id=\"mydiv\">" + content + "</div>" +
                     "</body></html>";
diff --git a/valuetypes/asciidoc/applib/src/main/java/org/apache/isis/valuetypes/asciidoc/applib/value/AsciiDoc.java b/valuetypes/asciidoc/applib/src/main/java/org/apache/isis/valuetypes/asciidoc/applib/value/AsciiDoc.java
index f6ee1d1..e845be0 100644
--- a/valuetypes/asciidoc/applib/src/main/java/org/apache/isis/valuetypes/asciidoc/applib/value/AsciiDoc.java
+++ b/valuetypes/asciidoc/applib/src/main/java/org/apache/isis/valuetypes/asciidoc/applib/value/AsciiDoc.java
@@ -24,7 +24,6 @@ import java.util.Objects;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.isis.applib.IsisModuleApplib;
-import org.apache.isis.applib.value.HasHtml;
 import org.apache.isis.valuetypes.asciidoc.applib.jaxb.AsciiDocJaxbAdapter;
 
 import lombok.AccessLevel;
@@ -41,7 +40,7 @@ import lombok.experimental.Accessors;
         logicalTypeName = IsisModuleApplib.NAMESPACE + ".value.AsciiDoc")
 @EqualsAndHashCode
 @XmlJavaTypeAdapter(AsciiDocJaxbAdapter.class)  // for JAXB view model support
-public final class AsciiDoc implements HasHtml, Serializable {
+public final class AsciiDoc implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
@@ -64,7 +63,6 @@ public final class AsciiDoc implements HasHtml, Serializable {
         this.adoc = adoc !=null ? adoc : "";
     }
 
-    @Override
     public String asHtml() {
         return html();
     }
@@ -80,6 +78,10 @@ public final class AsciiDoc implements HasHtml, Serializable {
 
     // -- UTILITY
 
+    /**
+     * Not strictly required, but allows for eager loading.
+     * Is a one-shot, that may take about 5 seconds.
+     */
     public static void loadJRuby() {
         Converter.getAsciidoctor();
     }
diff --git a/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/IsisModuleValAsciidocMetaModel.java b/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/IsisModuleValAsciidocMetaModel.java
index 5a94add..382945e 100644
--- a/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/IsisModuleValAsciidocMetaModel.java
+++ b/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/IsisModuleValAsciidocMetaModel.java
@@ -34,6 +34,9 @@ import org.apache.isis.core.metamodel.valuetypes.ValueTypeProvider;
 import org.apache.isis.schema.common.v2.ValueType;
 import org.apache.isis.valuetypes.asciidoc.applib.value.AsciiDoc;
 import org.apache.isis.valuetypes.asciidoc.metamodel.semantics.AsciiDocValueSemantics;
+import org.apache.isis.valuetypes.asciidoc.metamodel.semantics.ChangesDtoValueSemantics;
+import org.apache.isis.valuetypes.asciidoc.metamodel.semantics.CommandDtoValueSemantics;
+import org.apache.isis.valuetypes.asciidoc.metamodel.semantics.InteractionDtoValueSemantics;
 
 /**
  * @since 2.0 {@index}
@@ -44,6 +47,9 @@ import org.apache.isis.valuetypes.asciidoc.metamodel.semantics.AsciiDocValueSema
         IsisModuleValAsciidocMetaModel.AsciiDocValueTypeProvider.class,
 
         AsciiDocValueSemantics.class,
+        ChangesDtoValueSemantics.class,
+        CommandDtoValueSemantics.class,
+        InteractionDtoValueSemantics.class,
 })
 public class IsisModuleValAsciidocMetaModel {
 
diff --git a/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemantics.java b/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemantics.java
index 47f81d0..1f94cf6 100644
--- a/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemantics.java
+++ b/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemantics.java
@@ -23,8 +23,8 @@ import javax.inject.Named;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.adapters.AbstractValueSemanticsProvider;
+import org.apache.isis.applib.adapters.HtmlRenderer;
 import org.apache.isis.applib.adapters.Parser;
-import org.apache.isis.applib.adapters.Renderer;
 import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.valuetypes.asciidoc.applib.value.AsciiDoc;
 
@@ -33,7 +33,7 @@ import org.apache.isis.valuetypes.asciidoc.applib.value.AsciiDoc;
 public class AsciiDocValueSemantics
 extends AbstractValueSemanticsProvider<AsciiDoc>
 implements
-    Renderer<AsciiDoc>,
+    HtmlRenderer<AsciiDoc>,
     Parser<AsciiDoc> {
 
     // -- RENDERER
diff --git a/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/AsciiDocForXmlComponentWkt.java b/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/ChangesDtoValueSemantics.java
similarity index 55%
rename from valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/AsciiDocForXmlComponentWkt.java
rename to valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/ChangesDtoValueSemantics.java
index 29a4864..82ce7c6 100644
--- a/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/AsciiDocForXmlComponentWkt.java
+++ b/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/ChangesDtoValueSemantics.java
@@ -16,30 +16,25 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.valuetypes.asciidoc.ui.wkt.components;
+package org.apache.isis.valuetypes.asciidoc.metamodel.semantics;
 
-import org.apache.wicket.model.IModel;
+import javax.inject.Named;
 
-import org.apache.isis.valuetypes.asciidoc.applib.value.AsciiDoc;
+import org.springframework.stereotype.Component;
 
-import lombok.val;
+import org.apache.isis.applib.util.schema.ChangesDtoUtils;
+import org.apache.isis.schema.chg.v2.ChangesDto;
 
-public class AsciiDocForXmlComponentWkt extends AsciiDocComponentWkt {
+import lombok.NonNull;
 
-    private static final long serialVersionUID = 1L;
+@Component
+@Named("isis.val.ChangesDtoValueSemantics")
+public class ChangesDtoValueSemantics
+extends XmlValueSemanticsAbstract<ChangesDto> {
 
-    public AsciiDocForXmlComponentWkt(final String id, final IModel<?> model) {
-        super(id, model);
-        setEnabled(false);
-    }
-
-    /**
-     * for convenience of subtypes.
-     * @param xml
-     */
-    protected final String asHtml(final String xml) {
-        val adoc = "[source,xml]\n----\n" + xml + "\n----";
-        return AsciiDoc.valueOf(adoc).asHtml();
+    @Override
+    protected String asXml(@NonNull final ChangesDto value) {
+        return ChangesDtoUtils.toXml(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/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/CommandDtoValueSemantics.java
similarity index 56%
rename from valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/cmd/v2/CommandDtoComponentWkt.java
rename to valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/CommandDtoValueSemantics.java
index 0791dfd..1db01a7 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/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/CommandDtoValueSemantics.java
@@ -16,30 +16,25 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.valuetypes.asciidoc.ui.wkt.components.schema.cmd.v2;
+package org.apache.isis.valuetypes.asciidoc.metamodel.semantics;
 
-import org.apache.wicket.model.IModel;
+import javax.inject.Named;
+
+import org.springframework.stereotype.Component;
 
 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 {
+import lombok.NonNull;
 
-    private static final long serialVersionUID = 1L;
+@Component
+@Named("isis.val.CommandDtoValueSemantics")
+public class CommandDtoValueSemantics
+extends XmlValueSemanticsAbstract<CommandDto> {
 
-    public CommandDtoComponentWkt(final String id, final IModel<?> model) {
-        super(id, model);
+    @Override
+    protected String asXml(@NonNull final CommandDto value) {
+        return CommandDtoUtils.toXml(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/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/InteractionDtoValueSemantics.java
similarity index 56%
rename from valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/ixn/v2/InteractionDtoComponentWkt.java
rename to valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/InteractionDtoValueSemantics.java
index 9872c03..6bacaa3 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/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/InteractionDtoValueSemantics.java
@@ -16,30 +16,25 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.valuetypes.asciidoc.ui.wkt.components.schema.ixn.v2;
+package org.apache.isis.valuetypes.asciidoc.metamodel.semantics;
 
-import org.apache.wicket.model.IModel;
+import javax.inject.Named;
+
+import org.springframework.stereotype.Component;
 
 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 {
+import lombok.NonNull;
 
-    private static final long serialVersionUID = 1L;
+@Component
+@Named("isis.val.InteractionDtoValueSemantics")
+public class InteractionDtoValueSemantics
+extends XmlValueSemanticsAbstract<InteractionDto> {
 
-    public InteractionDtoComponentWkt(final String id, final IModel<?> model) {
-        super(id, model);
+    @Override
+    protected String asXml(@NonNull final InteractionDto value) {
+        return InteractionDtoUtils.toXml(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/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemantics.java b/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/XmlValueSemanticsAbstract.java
similarity index 59%
copy from valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemantics.java
copy to valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/XmlValueSemanticsAbstract.java
index 47f81d0..8386c99 100644
--- a/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemantics.java
+++ b/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/XmlValueSemanticsAbstract.java
@@ -18,46 +18,35 @@
  */
 package org.apache.isis.valuetypes.asciidoc.metamodel.semantics;
 
-import javax.inject.Named;
-
-import org.springframework.stereotype.Component;
-
 import org.apache.isis.applib.adapters.AbstractValueSemanticsProvider;
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.HtmlRenderer;
 import org.apache.isis.applib.adapters.Renderer;
 import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.valuetypes.asciidoc.applib.value.AsciiDoc;
 
-@Component
-@Named("isis.val.AsciiDocValueSemantics")
-public class AsciiDocValueSemantics
-extends AbstractValueSemanticsProvider<AsciiDoc>
+import lombok.NonNull;
+
+/**
+ *  Provides a {@link Renderer} that generates syntax highlighted XML.
+ *  @implNote using ascii-doctor under the hoods
+ */
+abstract class XmlValueSemanticsAbstract<T>
+extends AbstractValueSemanticsProvider<T>
 implements
-    Renderer<AsciiDoc>,
-    Parser<AsciiDoc> {
+    HtmlRenderer<T> {
 
     // -- RENDERER
 
     @Override
-    public String presentationValue(final ValueSemanticsProvider.Context context, final AsciiDoc adoc) {
-        return render(adoc, AsciiDoc::asHtml);
+    public String presentationValue(final ValueSemanticsProvider.Context context, final T value) {
+        return render(value, xmlContainer->asHtml(asXml(xmlContainer)));
     }
 
-    // -- PARSER
+    protected abstract String asXml(@NonNull T value);
 
-    @Override
-    public String parseableTextRepresentation(final ValueSemanticsProvider.Context context, final AsciiDoc adoc) {
-        return adoc!=null ? adoc.getAdoc() : null;
-    }
-
-    @Override
-    public AsciiDoc parseTextRepresentation(final ValueSemanticsProvider.Context context, final String adoc) {
-        return adoc!=null ? AsciiDoc.valueOf(adoc) : null;
-    }
-
-    @Override
-    public int typicalLength() {
-        return 0;
+    private String asHtml(final String xml) {
+        final var adoc = "[source,xml]\n----\n" + xml + "\n----";
+        return AsciiDoc.valueOf(adoc).asHtml();
     }
 
 }
diff --git a/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/IsisModuleValAsciidocUiWkt.java b/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/IsisModuleValAsciidocUiWkt.java
index a7faf59..f05fd13 100644
--- a/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/IsisModuleValAsciidocUiWkt.java
+++ b/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/IsisModuleValAsciidocUiWkt.java
@@ -23,9 +23,6 @@ import org.springframework.context.annotation.Import;
 
 import org.apache.isis.valuetypes.asciidoc.applib.IsisModuleValAsciidocApplib;
 import org.apache.isis.valuetypes.asciidoc.ui.wkt.components.AsciiDocPanelFactoriesWkt;
-import org.apache.isis.valuetypes.asciidoc.ui.wkt.components.schema.chg.v2.ChangesDtoPanelFactoriesWkt;
-import org.apache.isis.valuetypes.asciidoc.ui.wkt.components.schema.cmd.v2.CommandDtoPanelFactoriesWkt;
-import org.apache.isis.valuetypes.asciidoc.ui.wkt.components.schema.ixn.v2.InteractionDtoPanelFactoriesWkt;
 
 /**
  * @since 2.0 {@index}
@@ -35,12 +32,6 @@ import org.apache.isis.valuetypes.asciidoc.ui.wkt.components.schema.ixn.v2.Inter
     IsisModuleValAsciidocApplib.class,
     AsciiDocPanelFactoriesWkt.Parented.class,
     AsciiDocPanelFactoriesWkt.Standalone.class,
-    InteractionDtoPanelFactoriesWkt.Parented.class,
-    InteractionDtoPanelFactoriesWkt.Standalone.class,
-    ChangesDtoPanelFactoriesWkt.Parented.class,
-    ChangesDtoPanelFactoriesWkt.Standalone.class,
-    CommandDtoPanelFactoriesWkt.Parented.class,
-    CommandDtoPanelFactoriesWkt.Standalone.class,
 })
 public class IsisModuleValAsciidocUiWkt {
 }
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
deleted file mode 100644
index 5791518..0000000
--- a/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/chg/v2/ChangesDtoComponentWkt.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.valuetypes.asciidoc.ui.wkt.components.schema.chg.v2;
-
-import org.apache.wicket.model.IModel;
-
-import org.apache.isis.valuetypes.asciidoc.ui.wkt.components.AsciiDocForXmlComponentWkt;
-
-@Deprecated
-public class ChangesDtoComponentWkt extends AsciiDocForXmlComponentWkt {
-
-    private static final long serialVersionUID = 1L;
-
-    public ChangesDtoComponentWkt(final String id, final IModel<?> model) {
-        super(id, model);
-    }
-
-
-//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/chg/v2/ChangesDtoPanelFactoriesWkt.java b/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/chg/v2/ChangesDtoPanelFactoriesWkt.java
deleted file mode 100644
index 93874d9..0000000
--- a/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/chg/v2/ChangesDtoPanelFactoriesWkt.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.valuetypes.asciidoc.ui.wkt.components.schema.chg.v2;
-
-import org.springframework.stereotype.Component;
-
-import org.apache.isis.schema.chg.v2.ChangesDto;
-import org.apache.isis.viewer.wicket.ui.components.scalars.markup.MarkupComponentFactory;
-import org.apache.isis.viewer.wicket.ui.components.scalars.markup.MarkupPanelFactories;
-
-public class ChangesDtoPanelFactoriesWkt {
-
-    // -- PARENTED
-
-    @Component
-    public static class Parented extends MarkupPanelFactories.ParentedAbstract {
-        private static final long serialVersionUID = 1L;
-
-        public Parented() {
-            super(ChangesDto.class);
-        }
-
-        @Override
-        protected MarkupComponentFactory getMarkupComponentFactory() {
-            return ChangesDtoComponentWkt::new;
-        }
-    }
-
-    // -- STANDALONE
-
-    @Component
-    public static class Standalone extends MarkupPanelFactories.StandaloneAbstract {
-        private static final long serialVersionUID = 1L;
-
-        public Standalone() {
-            super(ChangesDto.class);
-        }
-
-        @Override
-        protected MarkupComponentFactory getMarkupComponentFactory() {
-            return ChangesDtoComponentWkt::new;
-        }
-    }
-
-}
diff --git a/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/cmd/v2/CommandDtoPanelFactoriesWkt.java b/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/cmd/v2/CommandDtoPanelFactoriesWkt.java
deleted file mode 100644
index 3fc3db6..0000000
--- a/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/cmd/v2/CommandDtoPanelFactoriesWkt.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.valuetypes.asciidoc.ui.wkt.components.schema.cmd.v2;
-
-import org.springframework.stereotype.Component;
-
-import org.apache.isis.schema.cmd.v2.CommandDto;
-import org.apache.isis.viewer.wicket.ui.components.scalars.markup.MarkupComponentFactory;
-import org.apache.isis.viewer.wicket.ui.components.scalars.markup.MarkupPanelFactories;
-
-public class CommandDtoPanelFactoriesWkt {
-
-    // -- PARENTED
-
-    @Component
-    public static class Parented extends MarkupPanelFactories.ParentedAbstract {
-        private static final long serialVersionUID = 1L;
-
-        public Parented() {
-            super(CommandDto.class);
-        }
-
-        @Override
-        protected MarkupComponentFactory getMarkupComponentFactory() {
-            return CommandDtoComponentWkt::new;
-        }
-    }
-
-    // -- STANDALONE
-
-    @Component
-    public static class Standalone extends MarkupPanelFactories.StandaloneAbstract {
-        private static final long serialVersionUID = 1L;
-
-        public Standalone() {
-            super(CommandDto.class);
-        }
-
-        @Override
-        protected MarkupComponentFactory getMarkupComponentFactory() {
-            return CommandDtoComponentWkt::new;
-        }
-    }
-
-}
diff --git a/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/ixn/v2/InteractionDtoPanelFactoriesWkt.java b/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/ixn/v2/InteractionDtoPanelFactoriesWkt.java
deleted file mode 100644
index 81c9d32..0000000
--- a/valuetypes/asciidoc/ui/wicket/src/main/java/org/apache/isis/valuetypes/asciidoc/ui/wkt/components/schema/ixn/v2/InteractionDtoPanelFactoriesWkt.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.valuetypes.asciidoc.ui.wkt.components.schema.ixn.v2;
-
-import org.springframework.stereotype.Component;
-
-import org.apache.isis.schema.ixn.v2.InteractionDto;
-import org.apache.isis.viewer.wicket.ui.components.scalars.markup.MarkupComponentFactory;
-import org.apache.isis.viewer.wicket.ui.components.scalars.markup.MarkupPanelFactories;
-
-public class InteractionDtoPanelFactoriesWkt {
-
-    // -- PARENTED
-
-    @Component
-    public static class Parented extends MarkupPanelFactories.ParentedAbstract {
-        private static final long serialVersionUID = 1L;
-
-        public Parented() {
-            super(InteractionDto.class);
-        }
-
-        @Override
-        protected MarkupComponentFactory getMarkupComponentFactory() {
-            return InteractionDtoComponentWkt::new;
-        }
-    }
-
-    // -- STANDALONE
-
-    @Component
-    public static class Standalone extends MarkupPanelFactories.StandaloneAbstract {
-        private static final long serialVersionUID = 1L;
-
-        public Standalone() {
-            super(InteractionDto.class);
-        }
-
-        @Override
-        protected MarkupComponentFactory getMarkupComponentFactory() {
-            return InteractionDtoComponentWkt::new;
-        }
-    }
-
-}
diff --git a/valuetypes/markdown/applib/src/main/java/org/apache/isis/valuetypes/markdown/applib/value/Markdown.java b/valuetypes/markdown/applib/src/main/java/org/apache/isis/valuetypes/markdown/applib/value/Markdown.java
index be1949a..ffc6154 100644
--- a/valuetypes/markdown/applib/src/main/java/org/apache/isis/valuetypes/markdown/applib/value/Markdown.java
+++ b/valuetypes/markdown/applib/src/main/java/org/apache/isis/valuetypes/markdown/applib/value/Markdown.java
@@ -24,7 +24,6 @@ import java.util.Objects;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.isis.applib.IsisModuleApplib;
-import org.apache.isis.applib.value.HasHtml;
 import org.apache.isis.valuetypes.markdown.applib.jaxb.MarkdownJaxbAdapter;
 
 import lombok.AccessLevel;
@@ -41,7 +40,7 @@ import lombok.experimental.Accessors;
         logicalTypeName = IsisModuleApplib.NAMESPACE + ".value.Markdown")
 @EqualsAndHashCode
 @XmlJavaTypeAdapter(MarkdownJaxbAdapter.class)  // for JAXB view model support
-public class Markdown implements HasHtml, Serializable {
+public class Markdown implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
@@ -64,7 +63,6 @@ public class Markdown implements HasHtml, Serializable {
         this.markdown = markdown !=null ? markdown : "";
     }
 
-    @Override
     public String asHtml() {
         return html();
     }
diff --git a/valuetypes/markdown/metamodel/src/main/java/org/apache/isis/valuetypes/markdown/metamodel/semantics/MarkdownValueSemantics.java b/valuetypes/markdown/metamodel/src/main/java/org/apache/isis/valuetypes/markdown/metamodel/semantics/MarkdownValueSemantics.java
index 70238e7..5ad5db5 100644
--- a/valuetypes/markdown/metamodel/src/main/java/org/apache/isis/valuetypes/markdown/metamodel/semantics/MarkdownValueSemantics.java
+++ b/valuetypes/markdown/metamodel/src/main/java/org/apache/isis/valuetypes/markdown/metamodel/semantics/MarkdownValueSemantics.java
@@ -24,8 +24,8 @@ import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.adapters.AbstractValueSemanticsProvider;
 import org.apache.isis.applib.adapters.EncoderDecoder;
+import org.apache.isis.applib.adapters.HtmlRenderer;
 import org.apache.isis.applib.adapters.Parser;
-import org.apache.isis.applib.adapters.Renderer;
 import org.apache.isis.valuetypes.markdown.applib.value.Markdown;
 
 @Component
@@ -35,7 +35,7 @@ extends AbstractValueSemanticsProvider<Markdown>
 implements
     EncoderDecoder<Markdown>,
     Parser<Markdown>,
-    Renderer<Markdown> {
+    HtmlRenderer<Markdown> {
 
     // -- ENCODER DECODER
 
diff --git a/valuetypes/sse/ui/wicket/src/main/java/org/apache/isis/valuetypes/sse/ui/wkt/webmodule/ServerSentEventsServlet.java b/valuetypes/sse/ui/wicket/src/main/java/org/apache/isis/valuetypes/sse/ui/wkt/webmodule/ServerSentEventsServlet.java
index c02f18f..5fd8aa3 100644
--- a/valuetypes/sse/ui/wicket/src/main/java/org/apache/isis/valuetypes/sse/ui/wkt/webmodule/ServerSentEventsServlet.java
+++ b/valuetypes/sse/ui/wicket/src/main/java/org/apache/isis/valuetypes/sse/ui/wkt/webmodule/ServerSentEventsServlet.java
@@ -136,7 +136,7 @@ public class ServerSentEventsServlet extends HttpServlet {
                     return false; // stop listening
                 }
 
-                val payload = marshaller.marshal(Markup.valueOfHtml(source.getPayload()));
+                val payload = marshaller.marshal(Markup.valueOf(source.getPayload()));
 
                 writer
                 .append("data: ")