isis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ahu...@apache.org
Subject [isis] branch master updated: ISIS-2333: adds Object_inspectMetamodel
Date Fri, 27 Mar 2020 14:01:17 GMT
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 7758ccc  ISIS-2333: adds Object_inspectMetamodel
7758ccc is described below

commit 7758ccc5c7a80c15d98e00ea47c91dcafeb243ad
Author: Andi Huber <ahuber@apache.org>
AuthorDate: Fri Mar 27 15:01:06 2020 +0100

    ISIS-2333: adds Object_inspectMetamodel
---
 .../org/apache/isis/applib/IsisModuleApplib.java   |  5 +-
 ...elXml.java => Object_downloadMetamodelXml.java} |  6 +-
 .../core/metamodel/IsisModuleCoreMetamodel.java    |  3 +
 .../inspect/IsisModuleCoreMetamodelInspection.java | 46 +++++++++++
 .../metamodel/inspect/Object_inspectMetamodel.java | 63 ++++++--------
 .../core/metamodel/inspect/model/ActionNode.java   | 86 ++++++++++++++++++++
 .../core/metamodel/inspect/model/ActionNode.svg    | 87 ++++++++++++++++++++
 .../metamodel/inspect/model/CollectionNode.java    | 76 +++++++++++++++++
 .../metamodel/inspect/model/CollectionNode.svg     | 87 ++++++++++++++++++++
 .../metamodel/inspect/model/FacetAttrNode.java     | 74 +++++++++++++++++
 .../core/metamodel/inspect/model/FacetAttrNode.svg | 87 ++++++++++++++++++++
 .../core/metamodel/inspect/model/FacetNode.java    | 77 ++++++++++++++++++
 .../core/metamodel/inspect/model/FacetNode.svg     | 87 ++++++++++++++++++++
 .../isis/core/metamodel/inspect/model/MMNode.java  | 49 +++++++++++
 .../metamodel/inspect/model/MMNodeFactory.java     | 83 +++++++++++++++++++
 .../metamodel/inspect/model/MMTreeAdapter.java     | 43 ++++++++++
 .../metamodel/inspect/model/ParameterNode.java     | 75 +++++++++++++++++
 .../core/metamodel/inspect/model/ParameterNode.svg | 87 ++++++++++++++++++++
 .../core/metamodel/inspect/model/PropertyNode.java | 75 +++++++++++++++++
 .../core/metamodel/inspect/model/PropertyNode.svg  | 87 ++++++++++++++++++++
 .../core/metamodel/inspect/model/TypeNode.java     | 95 ++++++++++++++++++++++
 .../isis/core/metamodel/inspect/model/TypeNode.svg | 87 ++++++++++++++++++++
 22 files changed, 1423 insertions(+), 42 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java b/api/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java
index 819b1ea..61dc1cb 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java
@@ -26,7 +26,7 @@ import org.apache.isis.applib.mixins.dto.Dto_downloadXsd;
 import org.apache.isis.applib.mixins.layout.Object_downloadLayoutXml;
 import org.apache.isis.applib.mixins.layout.Object_openRestApi;
 import org.apache.isis.applib.mixins.layout.Object_rebuildMetamodel;
-import org.apache.isis.applib.mixins.metamodel.Object_downloadMetaModelXml;
+import org.apache.isis.applib.mixins.metamodel.Object_downloadMetamodelXml;
 import org.apache.isis.applib.mixins.metamodel.Object_objectIdentifier;
 import org.apache.isis.applib.mixins.metamodel.Object_objectType;
 import org.apache.isis.applib.services.audit.AuditerServiceLogging;
@@ -42,7 +42,6 @@ import org.apache.isis.applib.services.jaxb.JaxbServiceDefault;
 import org.apache.isis.applib.services.layout.LayoutServiceMenu;
 import org.apache.isis.applib.services.metamodel.MetaModelServiceMenu;
 import org.apache.isis.applib.services.publish.PublisherServiceLogging;
-import org.apache.isis.applib.services.scratchpad.Scratchpad;
 import org.apache.isis.applib.services.session.SessionLoggingServiceLogging;
 import org.apache.isis.applib.services.wrapper.control.AsyncControlService;
 import org.apache.isis.schema.IsisModuleSchema;
@@ -58,7 +57,7 @@ import org.apache.isis.schema.IsisModuleSchema;
         Dto_downloadXml.class,
         Dto_downloadXsd.class,
         Object_downloadLayoutXml.class,
-        Object_downloadMetaModelXml.class,
+        Object_downloadMetamodelXml.class,
         Object_objectIdentifier.class,
         Object_objectType.class,
         Object_openRestApi.class,
diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_downloadMetaModelXml.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_downloadMetamodelXml.java
similarity index 95%
copy from api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_downloadMetaModelXml.java
copy to api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_downloadMetamodelXml.java
index 1cbb51b..0129e8e 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_downloadMetaModelXml.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_downloadMetamodelXml.java
@@ -39,7 +39,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 @Action(
-        domainEvent = Object_downloadMetaModelXml.ActionDomainEvent.class,
+        domainEvent = Object_downloadMetamodelXml.ActionDomainEvent.class,
         semantics = SemanticsOf.SAFE,
         restrictTo = RestrictTo.PROTOTYPING
         )
@@ -48,12 +48,12 @@ import lombok.val;
         position = ActionLayout.Position.PANEL_DROPDOWN
         )
 @RequiredArgsConstructor
-public class Object_downloadMetaModelXml {
+public class Object_downloadMetamodelXml {
 
     private final Object holder;
 
     public static class ActionDomainEvent 
-    extends org.apache.isis.applib.IsisModuleApplib.ActionDomainEvent<Object_downloadMetaModelXml> {}
+    extends org.apache.isis.applib.IsisModuleApplib.ActionDomainEvent<Object_downloadMetamodelXml> {}
 
     @MemberOrder(name = MixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "700.2")
     public Object act(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
index 11f39bd..3b34bde 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
@@ -24,6 +24,7 @@ import org.springframework.context.annotation.Import;
 import org.apache.isis.applib.IsisModuleApplib;
 import org.apache.isis.core.config.IsisModuleCoreConfig;
 import org.apache.isis.core.metamodel.context.MetaModelContexts;
+import org.apache.isis.core.metamodel.inspect.IsisModuleCoreMetamodelInspection;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManagerDefault;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModelInitFilterDefault;
 import org.apache.isis.core.metamodel.services.ServiceInjectorDefault;
@@ -63,6 +64,7 @@ import org.apache.isis.core.security.IsisModuleCoreSecurity;
 
         // @Configuration's
         MetaModelContexts.class,
+        IsisModuleCoreMetamodelInspection.class,
         MetamodelEventSupport_Spring.class,
 
         // @Component's
@@ -97,6 +99,7 @@ import org.apache.isis.core.security.IsisModuleCoreSecurity;
 
         // @Repository's
         ApplicationFeatureRepositoryDefault.class,
+        
 
 })
 public class IsisModuleCoreMetamodel {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/IsisModuleCoreMetamodelInspection.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/IsisModuleCoreMetamodelInspection.java
new file mode 100644
index 0000000..9276340
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/IsisModuleCoreMetamodelInspection.java
@@ -0,0 +1,46 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.inspect;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+
+import org.apache.isis.core.metamodel.inspect.model.ActionNode;
+import org.apache.isis.core.metamodel.inspect.model.CollectionNode;
+import org.apache.isis.core.metamodel.inspect.model.FacetAttrNode;
+import org.apache.isis.core.metamodel.inspect.model.FacetNode;
+import org.apache.isis.core.metamodel.inspect.model.ParameterNode;
+import org.apache.isis.core.metamodel.inspect.model.PropertyNode;
+import org.apache.isis.core.metamodel.inspect.model.TypeNode;
+
+@Configuration
+@Import({
+        Object_inspectMetamodel.class,
+        ActionNode.class,
+        CollectionNode.class,
+        FacetAttrNode.class,
+        FacetNode.class,
+        ParameterNode.class,
+        PropertyNode.class,
+        TypeNode.class,
+        
+})
+public class IsisModuleCoreMetamodelInspection {
+
+}
diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_downloadMetaModelXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/Object_inspectMetamodel.java
similarity index 60%
rename from api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_downloadMetaModelXml.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/Object_inspectMetamodel.java
index 1cbb51b..629ee29 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_downloadMetaModelXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/Object_inspectMetamodel.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.applib.mixins.metamodel;
+package org.apache.isis.core.metamodel.inspect;
 
 import java.util.Objects;
 
@@ -24,45 +24,41 @@ import javax.inject.Inject;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.Contributed;
 import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.applib.graph.tree.TreeNode;
+import org.apache.isis.applib.graph.tree.TreePath;
 import org.apache.isis.applib.mixins.MixinConstants;
-import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.services.metamodel.MetaModelService;
-import org.apache.isis.applib.services.metamodel.MetaModelServiceMenu;
-import org.apache.isis.applib.value.Clob;
-import org.apache.isis.applib.value.NamedWithMimeType.CommonMimeType;
+import org.apache.isis.core.commons.internal.exceptions._Exceptions;
+import org.apache.isis.core.metamodel.inspect.model.MMNodeFactory;
+import org.apache.isis.core.metamodel.inspect.model.MMTreeAdapter;
 
 import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 @Action(
-        domainEvent = Object_downloadMetaModelXml.ActionDomainEvent.class,
+        domainEvent = Object_inspectMetamodel.ActionDomainEvent.class,
         semantics = SemanticsOf.SAFE,
         restrictTo = RestrictTo.PROTOTYPING
         )
 @ActionLayout(
-        cssClassFa = "fa-download",
-        position = ActionLayout.Position.PANEL_DROPDOWN
+        cssClassFa = "fa-sitemap",
+        position = ActionLayout.Position.PANEL_DROPDOWN,
+        contributed = Contributed.AS_ACTION
         )
 @RequiredArgsConstructor
-public class Object_downloadMetaModelXml {
+public class Object_inspectMetamodel {
 
     private final Object holder;
 
     public static class ActionDomainEvent 
-    extends org.apache.isis.applib.IsisModuleApplib.ActionDomainEvent<Object_downloadMetaModelXml> {}
+    extends org.apache.isis.applib.IsisModuleApplib.ActionDomainEvent<Object_inspectMetamodel> {}
 
-    @MemberOrder(name = MixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "700.2")
-    public Object act(
-
-            // PARAM 0
-            @ParameterLayout(
-                    named = MixinConstants.FILENAME_PROPERTY_NAME,
-                    describedAs = MixinConstants.FILENAME_PROPERTY_DESCRIPTION)
-            final String fileName) {
+    @MemberOrder(name = MixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "700.2.1")
+    public Object act() {
 
         val pkg = holder.getClass().getPackage().getName();
 
@@ -78,26 +74,21 @@ public class Object_downloadMetaModelXml {
 
         val className = holder.getClass().getName();
 
-        val domainClassDtos = metamodelDto.getDomainClassDto();
-        domainClassDtos.removeIf(classDto->!Objects.equals(classDto.getId(), className));
-
-        val xmlString = jaxbService.toXml(metamodelDto);
-
-        return Clob.of(fileName, CommonMimeType.XML, xmlString);
-    }
-
-    // -- PARAM 0
-
-    public String default0Act() {
-        return holder.getClass().getSimpleName();
+        val domainClassDto = metamodelDto.getDomainClassDto()
+            .stream()
+            .filter(classDto->Objects.equals(classDto.getId(), className))
+            .findFirst()
+            .orElseThrow(_Exceptions::noSuchElement);
+        
+        val root = MMNodeFactory.type(domainClassDto, null);
+        val tree = TreeNode.lazy(root, MMTreeAdapter.class);
+        tree.expand(TreePath.of(0)); // expand the root node
+        return tree;
     }
 
     // -- DEPENDENCIES
 
-    @Inject MetaModelService metaModelService;
-    @Inject JaxbService jaxbService;
-    @Inject MetaModelServiceMenu metaModelServiceMenu;
-
-
+    @Inject private MetaModelService metaModelService;
+    //@Inject private SpecificationLoader specificationLoader;
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/ActionNode.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/ActionNode.java
new file mode 100644
index 0000000..114765a
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/ActionNode.java
@@ -0,0 +1,86 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.inspect.model;
+
+import java.util.stream.Stream;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.schema.metamodel.v2.Action;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@DomainObject(nature=Nature.VIEW_MODEL, objectType = "isis.metamodel.ActionNode")
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+@ToString
+public class ActionNode extends MMNode {
+
+    @Property(hidden = Where.EVERYWHERE)
+    @Getter @Setter private Action action;
+    
+    @Override
+    public String title() {
+        return String.format("%s(...) : %s", action.getId(), typeToString(action.getReturnType())); 
+    }
+    
+    @Override
+    public String iconName() {
+        return "";
+    }
+    
+    // -- TREE NODE STUFF
+    
+    @Getter @Setter @XmlTransient 
+    private TypeNode parentNode;
+
+    @Override
+    public int getChildNodeCount() {
+        return action.getFacets().getFacet().size()
+                + action.getParams().getParam().size();
+    }
+
+    @Override
+    public Stream<MMNode> streamChildNodes() {
+        
+        return Stream.<MMNode>concat(
+                
+                action.getFacets().getFacet()
+                .stream()
+                .map(facet->MMNodeFactory.facet(facet, this)),
+                
+                action.getParams().getParam()
+                .stream()
+                .map(param->MMNodeFactory.param(param, this))
+                
+                );
+        
+    }
+    
+}
+
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/ActionNode.svg b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/ActionNode.svg
new file mode 100644
index 0000000..5c75692
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/ActionNode.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="160mm"
+   height="160mm"
+   viewBox="0 0 160 160"
+   version="1.1"
+   id="svg4563"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
+   sodipodi:docname="ActionNode.svg">
+  <defs
+     id="defs4557" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.62"
+     inkscape:cx="-146.03225"
+     inkscape:cy="189.64982"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1602"
+     inkscape:window-height="1005"
+     inkscape:window-x="899"
+     inkscape:window-y="198"
+     inkscape:window-maximized="0"
+     units="mm" />
+  <metadata
+     id="metadata4560">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-137)">
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:50.79999924px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:1;fill:#a60000;fill-opacity:1;stroke:none;stroke-width:0.26458332;"
+       x="46.869045"
+       y="110.27975"
+       id="text5110"><tspan
+         sodipodi:role="line"
+         id="tspan5108"
+         x="46.869045"
+         y="155.22585"
+         style="font-size:50.79999924px;stroke-width:0.26458332;fill:#a60000;fill-opacity:1;" /></text>
+    <rect
+       style="opacity:0.98000004;fill:#e77b71;fill-opacity:1;stroke:#7b7b7b;stroke-width:6.82075405;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect5116"
+       width="148.51277"
+       height="148.95171"
+       x="5.0820398"
+       y="142.35172" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       x="15.365664"
+       y="206.60106"
+       id="text5114-6"><tspan
+         sodipodi:role="line"
+         id="tspan5112-5"
+         x="15.365664"
+         y="206.60106"
+         style="font-size:50.79999924px;stroke-width:0.26458332">act</tspan></text>
+  </g>
+</svg>
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/CollectionNode.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/CollectionNode.java
new file mode 100644
index 0000000..81e990d
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/CollectionNode.java
@@ -0,0 +1,76 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.inspect.model;
+
+import java.util.stream.Stream;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.schema.metamodel.v2.Collection;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@DomainObject(nature=Nature.VIEW_MODEL, objectType = "isis.metamodel.CollectionNode")
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+@ToString
+public class CollectionNode extends MMNode {
+
+    @Property(hidden = Where.EVERYWHERE)
+    @Getter @Setter private Collection collection;
+    
+    @Override
+    public String title() {
+        return String.format("%s : %s", collection.getId(), typeToString(collection.getType()));  
+    }
+    
+    @Override
+    public String iconName() {
+        return "";
+    }
+    
+    // -- TREE NODE STUFF
+    
+    @Getter @Setter @XmlTransient 
+    private TypeNode parentNode;
+
+    @Override
+    public int getChildNodeCount() {
+        return collection.getFacets().getFacet().size();
+    }
+
+    @Override
+    public Stream<MMNode> streamChildNodes() {
+        return collection.getFacets().getFacet()
+                .stream()
+                .map(facet->MMNodeFactory.facet(facet, this));
+    }
+   
+    
+}
+
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/CollectionNode.svg b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/CollectionNode.svg
new file mode 100644
index 0000000..760b538
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/CollectionNode.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="160mm"
+   height="160mm"
+   viewBox="0 0 160 160"
+   version="1.1"
+   id="svg4563"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
+   sodipodi:docname="CollectionNode.svg">
+  <defs
+     id="defs4557" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.62"
+     inkscape:cx="-146.03225"
+     inkscape:cy="172.90323"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1602"
+     inkscape:window-height="1005"
+     inkscape:window-x="899"
+     inkscape:window-y="198"
+     inkscape:window-maximized="0"
+     units="mm" />
+  <metadata
+     id="metadata4560">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-137)">
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:50.79999924px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       x="46.869045"
+       y="110.27975"
+       id="text5110"><tspan
+         sodipodi:role="line"
+         id="tspan5108"
+         x="46.869045"
+         y="155.22585"
+         style="font-size:50.79999924px;stroke-width:0.26458332" /></text>
+    <rect
+       style="opacity:0.98000004;fill:#cad17d;fill-opacity:1;stroke:#7b7b7b;stroke-width:6.82075405;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect5116"
+       width="148.51277"
+       height="148.95171"
+       x="5.0820398"
+       y="142.35172" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       x="15.365664"
+       y="206.60106"
+       id="text5114-6"><tspan
+         sodipodi:role="line"
+         id="tspan5112-5"
+         x="15.365664"
+         y="206.60106"
+         style="font-size:50.79999924px;stroke-width:0.26458332">coll</tspan></text>
+  </g>
+</svg>
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetAttrNode.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetAttrNode.java
new file mode 100644
index 0000000..85c62d1
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetAttrNode.java
@@ -0,0 +1,74 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.inspect.model;
+
+import java.util.stream.Stream;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.schema.metamodel.v2.FacetAttr;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@DomainObject(nature=Nature.VIEW_MODEL, objectType = "isis.metamodel.FacetAttrNode")
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+@ToString
+public class FacetAttrNode extends MMNode {
+
+    @Property(hidden = Where.EVERYWHERE)
+    @Getter @Setter private FacetAttr facetAttr;
+    
+    @Override
+    public String title() {
+        return String.format("%s: %s", facetAttr.getName(), facetAttr.getValue());  
+    }
+    
+    @Override
+    public String iconName() {
+        return "";
+    }
+    
+    // -- TREE NODE STUFF
+    
+    @Getter @Setter @XmlTransient 
+    private FacetNode parentNode;
+
+    @Override
+    public int getChildNodeCount() {
+        return 0;
+    }
+
+    @Override
+    public Stream<MMNode> streamChildNodes() {
+        return Stream.empty();
+    }
+   
+    
+}
+
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetAttrNode.svg b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetAttrNode.svg
new file mode 100644
index 0000000..cf04655
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetAttrNode.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="160mm"
+   height="160mm"
+   viewBox="0 0 160 160"
+   version="1.1"
+   id="svg4563"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
+   sodipodi:docname="FacetAttrNode.svg">
+  <defs
+     id="defs4557" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.62"
+     inkscape:cx="116.06452"
+     inkscape:cy="172.90323"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1602"
+     inkscape:window-height="1005"
+     inkscape:window-x="1031"
+     inkscape:window-y="231"
+     inkscape:window-maximized="0"
+     units="mm" />
+  <metadata
+     id="metadata4560">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-137)">
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:50.79999924px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       x="46.869045"
+       y="110.27975"
+       id="text5110"><tspan
+         sodipodi:role="line"
+         id="tspan5108"
+         x="46.869045"
+         y="155.22585"
+         style="font-size:50.79999924px;stroke-width:0.26458332" /></text>
+    <rect
+       style="opacity:0.98000004;fill:#b3d4d4;fill-opacity:1;stroke:#7b7b7b;stroke-width:6.82075405;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect5116"
+       width="148.51277"
+       height="148.95171"
+       x="5.0820398"
+       y="142.35172" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       x="15.365664"
+       y="206.60106"
+       id="text5114-6"><tspan
+         sodipodi:role="line"
+         id="tspan5112-5"
+         x="15.365664"
+         y="206.60106"
+         style="font-size:50.79999924px;stroke-width:0.26458332">attr</tspan></text>
+  </g>
+</svg>
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetNode.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetNode.java
new file mode 100644
index 0000000..0a7d31f
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetNode.java
@@ -0,0 +1,77 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.inspect.model;
+
+import java.util.stream.Stream;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.schema.metamodel.v2.Facet;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@DomainObject(nature=Nature.VIEW_MODEL, objectType = "isis.metamodel.FacetNode")
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+@ToString
+public class FacetNode extends MMNode {
+
+    @Property(hidden = Where.EVERYWHERE)
+    @Getter @Setter private Facet facet;
+    
+    @Override
+    public String title() {
+        return facet.getFqcn()
+                .replace("org.apache.isis.core.metamodel.facets.", "»")
+                .replace("org.apache.isis.core.metamodel.", "»");
+    }
+    
+    @Override
+    public String iconName() {
+        return "";
+    }
+    
+    // -- TREE NODE STUFF
+    
+    @Getter @Setter @XmlTransient 
+    private MMNode parentNode;
+
+    @Override
+    public int getChildNodeCount() {
+        return facet.getAttr().size();
+    }
+
+    @Override
+    public Stream<MMNode> streamChildNodes() {
+        return facet.getAttr().stream()
+                .map(facetAttr->MMNodeFactory.facetAttr(facetAttr, this));
+    }
+   
+    
+}
+
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetNode.svg b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetNode.svg
new file mode 100644
index 0000000..11437ea
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetNode.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="160mm"
+   height="160mm"
+   viewBox="0 0 160 160"
+   version="1.1"
+   id="svg4563"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
+   sodipodi:docname="FacetNode.svg">
+  <defs
+     id="defs4557" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.62"
+     inkscape:cx="378.16129"
+     inkscape:cy="172.90323"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1602"
+     inkscape:window-height="1005"
+     inkscape:window-x="1031"
+     inkscape:window-y="231"
+     inkscape:window-maximized="0"
+     units="mm" />
+  <metadata
+     id="metadata4560">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-137)">
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:50.79999924px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       x="46.869045"
+       y="110.27975"
+       id="text5110"><tspan
+         sodipodi:role="line"
+         id="tspan5108"
+         x="46.869045"
+         y="155.22585"
+         style="font-size:50.79999924px;stroke-width:0.26458332" /></text>
+    <rect
+       style="opacity:0.98000004;fill:#c0d4b3;fill-opacity:1;stroke:#7b7b7b;stroke-width:6.82075405;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect5116"
+       width="148.51277"
+       height="148.95171"
+       x="5.0820398"
+       y="142.35172" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       x="15.365664"
+       y="206.60106"
+       id="text5114-6"><tspan
+         sodipodi:role="line"
+         id="tspan5112-5"
+         x="15.365664"
+         y="206.60106"
+         style="font-size:50.79999924px;stroke-width:0.26458332">facet</tspan></text>
+  </g>
+</svg>
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/MMNode.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/MMNode.java
new file mode 100644
index 0000000..5fd9d9a
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/MMNode.java
@@ -0,0 +1,49 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.inspect.model;
+
+import java.util.stream.Stream;
+
+import javax.xml.bind.annotation.XmlTransient;
+
+import org.apache.isis.applib.annotation.Navigable;
+import org.apache.isis.applib.annotation.PropertyLayout;
+import org.apache.isis.applib.annotation.Where;
+
+@XmlTransient
+public abstract class MMNode {
+    
+    @PropertyLayout(navigable=Navigable.PARENT, hidden=Where.EVERYWHERE)
+    public abstract MMNode getParentNode();
+
+    public abstract int getChildNodeCount();
+    
+    public abstract Stream<MMNode> streamChildNodes();
+
+    public abstract String title();
+
+    public abstract String iconName();
+
+    protected String typeToString(Object type) {
+        return type!=null
+                ? ""+type
+                : "void";
+    }
+    
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/MMNodeFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/MMNodeFactory.java
new file mode 100644
index 0000000..92c271a
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/MMNodeFactory.java
@@ -0,0 +1,83 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.inspect.model;
+
+import org.apache.isis.schema.metamodel.v2.Action;
+import org.apache.isis.schema.metamodel.v2.Collection;
+import org.apache.isis.schema.metamodel.v2.DomainClassDto;
+import org.apache.isis.schema.metamodel.v2.Facet;
+import org.apache.isis.schema.metamodel.v2.FacetAttr;
+import org.apache.isis.schema.metamodel.v2.Param;
+import org.apache.isis.schema.metamodel.v2.Property;
+
+import lombok.val;
+
+public class MMNodeFactory {
+    
+    public static MMNode type(DomainClassDto domainClassDto, MMNode parentNode) {
+        val node = new TypeNode();
+        node.setDomainClassDto(domainClassDto);
+        node.setParentNode(parentNode);
+        return node;
+    }
+    
+    public static MMNode facet(Facet facet, MMNode parentNode) {
+        val node = new FacetNode();
+        node.setFacet(facet);
+        node.setParentNode(parentNode);
+        return node;
+    }
+
+    public static MMNode facetAttr(FacetAttr facetAttr, FacetNode parentNode) {
+        val node = new FacetAttrNode();
+        node.setFacetAttr(facetAttr);
+        node.setParentNode(parentNode);
+        return node;
+    }
+
+    public static MMNode action(Action action, TypeNode parentNode) {
+        val node = new ActionNode();
+        node.setAction(action);
+        node.setParentNode(parentNode);
+        return node;
+    }
+
+    public static MMNode property(Property property, TypeNode parentNode) {
+        val node = new PropertyNode();
+        node.setProperty(property);
+        node.setParentNode(parentNode);
+        return node;
+    }
+
+    public static MMNode collection(Collection collection, TypeNode parentNode) {
+        val node = new CollectionNode();
+        node.setCollection(collection);
+        node.setParentNode(parentNode);
+        return node;
+    }
+
+    public static MMNode param(Param param, ActionNode parentNode) {
+        val node = new ParameterNode();
+        node.setParameter(param);
+        node.setParentNode(parentNode);
+        return node;
+    }
+    
+    
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/MMTreeAdapter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/MMTreeAdapter.java
new file mode 100644
index 0000000..8922c29
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/MMTreeAdapter.java
@@ -0,0 +1,43 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.inspect.model;
+
+import java.util.Optional;
+import java.util.stream.Stream;
+
+import org.apache.isis.applib.graph.tree.TreeAdapter;
+
+public class MMTreeAdapter implements TreeAdapter<MMNode> {
+
+    @Override
+    public Optional<MMNode> parentOf(MMNode node) {
+        return Optional.ofNullable(node.getParentNode());
+    }
+
+    @Override
+    public int childCountOf(MMNode node) {
+        return node.getChildNodeCount();
+    }
+
+    @Override
+    public Stream<MMNode> childrenOf(MMNode node) {
+        return node.streamChildNodes();
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/ParameterNode.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/ParameterNode.java
new file mode 100644
index 0000000..d771f0f
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/ParameterNode.java
@@ -0,0 +1,75 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.inspect.model;
+
+import java.util.stream.Stream;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.schema.metamodel.v2.Param;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@DomainObject(nature=Nature.VIEW_MODEL, objectType = "isis.metamodel.ParameterNode")
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+@ToString
+public class ParameterNode extends MMNode {
+
+    @Property(hidden = Where.EVERYWHERE)
+    @Getter @Setter private Param parameter;
+    
+    @Override
+    public String title() {
+        return String.format("%s : %s", parameter.getId(), typeToString(parameter.getType()));  
+    }
+    
+    @Override
+    public String iconName() {
+        return "";
+    }
+    
+    // -- TREE NODE STUFF
+    
+    @Getter @Setter @XmlTransient 
+    private ActionNode parentNode;
+
+    @Override
+    public int getChildNodeCount() {
+        return parameter.getFacets().getFacet().size();
+    }
+
+    @Override
+    public Stream<MMNode> streamChildNodes() {
+        return parameter.getFacets().getFacet()
+                .stream()
+                .map(facet->MMNodeFactory.facet(facet, this));
+    }
+
+}
+
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/ParameterNode.svg b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/ParameterNode.svg
new file mode 100644
index 0000000..9af8b42
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/ParameterNode.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="160mm"
+   height="160mm"
+   viewBox="0 0 160 160"
+   version="1.1"
+   id="svg4563"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
+   sodipodi:docname="ParameterNode.svg">
+  <defs
+     id="defs4557" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.62"
+     inkscape:cx="-132.48666"
+     inkscape:cy="172.90323"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1602"
+     inkscape:window-height="1005"
+     inkscape:window-x="899"
+     inkscape:window-y="198"
+     inkscape:window-maximized="0"
+     units="mm" />
+  <metadata
+     id="metadata4560">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-137)">
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:50.79999924px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       x="46.869045"
+       y="110.27975"
+       id="text5110"><tspan
+         sodipodi:role="line"
+         id="tspan5108"
+         x="46.869045"
+         y="155.22585"
+         style="font-size:50.79999924px;stroke-width:0.26458332" /></text>
+    <rect
+       style="opacity:0.98000004;fill:#f47d57;fill-opacity:1;stroke:#7b7b7b;stroke-width:6.82075405;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect5116"
+       width="148.51277"
+       height="148.95171"
+       x="5.0820398"
+       y="142.35172" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       x="15.365664"
+       y="206.60106"
+       id="text5114-6"><tspan
+         sodipodi:role="line"
+         id="tspan5112-5"
+         x="15.365664"
+         y="206.60106"
+         style="font-size:50.79999924px;stroke-width:0.26458332">prm</tspan></text>
+  </g>
+</svg>
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/PropertyNode.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/PropertyNode.java
new file mode 100644
index 0000000..afbcd1e
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/PropertyNode.java
@@ -0,0 +1,75 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.inspect.model;
+
+import java.util.stream.Stream;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.Where;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@DomainObject(nature=Nature.VIEW_MODEL, objectType = "isis.metamodel.PropertyNode")
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+@ToString
+public class PropertyNode extends MMNode {
+
+    @Property(hidden = Where.EVERYWHERE)
+    @Getter @Setter private org.apache.isis.schema.metamodel.v2.Property property;
+    
+    @Override
+    public String title() {
+        return String.format("%s : %s", property.getId(), typeToString(property.getType()));  
+    }
+    
+    @Override
+    public String iconName() {
+        return "";
+    }
+    
+    // -- TREE NODE STUFF
+    
+    @Getter @Setter @XmlTransient 
+    private TypeNode parentNode;
+
+    @Override
+    public int getChildNodeCount() {
+        return property.getFacets().getFacet().size();
+    }
+
+    @Override
+    public Stream<MMNode> streamChildNodes() {
+        return property.getFacets().getFacet()
+                .stream()
+                .map(facet->MMNodeFactory.facet(facet, this));
+    }
+   
+    
+}
+
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/PropertyNode.svg b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/PropertyNode.svg
new file mode 100644
index 0000000..8a8334d
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/PropertyNode.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="160mm"
+   height="160mm"
+   viewBox="0 0 160 160"
+   version="1.1"
+   id="svg4563"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
+   sodipodi:docname="PropertyNode.svg">
+  <defs
+     id="defs4557" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.62"
+     inkscape:cx="-146.03225"
+     inkscape:cy="172.90323"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1602"
+     inkscape:window-height="1005"
+     inkscape:window-x="899"
+     inkscape:window-y="198"
+     inkscape:window-maximized="0"
+     units="mm" />
+  <metadata
+     id="metadata4560">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-137)">
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:50.79999924px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       x="46.869045"
+       y="110.27975"
+       id="text5110"><tspan
+         sodipodi:role="line"
+         id="tspan5108"
+         x="46.869045"
+         y="155.22585"
+         style="font-size:50.79999924px;stroke-width:0.26458332" /></text>
+    <rect
+       style="opacity:0.98000004;fill:#c3ec5d;fill-opacity:1;stroke:#7b7b7b;stroke-width:6.82075405;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect5116"
+       width="148.51277"
+       height="148.95171"
+       x="5.0820398"
+       y="142.35172" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       x="15.365664"
+       y="206.60106"
+       id="text5114-6"><tspan
+         sodipodi:role="line"
+         id="tspan5112-5"
+         x="15.365664"
+         y="206.60106"
+         style="font-size:50.79999924px;stroke-width:0.26458332">prop</tspan></text>
+  </g>
+</svg>
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/TypeNode.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/TypeNode.java
new file mode 100644
index 0000000..55f0fc7
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/TypeNode.java
@@ -0,0 +1,95 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.inspect.model;
+
+import java.util.stream.Stream;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.commons.internal.collections._Streams;
+import org.apache.isis.schema.metamodel.v2.DomainClassDto;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@DomainObject(nature=Nature.VIEW_MODEL, objectType = "isis.metamodel.DomainClassNode")
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+@ToString
+public class TypeNode extends MMNode {
+    
+    @Property(hidden = Where.EVERYWHERE)
+    @Getter @Setter private DomainClassDto domainClassDto;
+
+    @Override
+    public String title() {
+        return domainClassDto.getId();
+    }
+
+    @Override
+    public String iconName() {
+        return "";
+    }
+
+    
+    // -- TREE NODE STUFF
+    
+    @Getter @Setter @XmlTransient 
+    private MMNode parentNode;
+
+    @Override
+    public int getChildNodeCount() {
+        return domainClassDto.getFacets().getFacet().size()
+                + domainClassDto.getActions().getAct().size()
+                + domainClassDto.getProperties().getProp().size()
+                + domainClassDto.getCollections().getColl().size()
+                ;
+    }
+
+    @Override
+    public Stream<MMNode> streamChildNodes() {
+        return _Streams.<MMNode>concat(
+                
+                domainClassDto.getFacets().getFacet()
+                .stream()
+                .map(facet->MMNodeFactory.facet(facet, this)),
+                
+                domainClassDto.getActions().getAct()
+                .stream()
+                .map(action->MMNodeFactory.action(action, this)),
+                
+                domainClassDto.getProperties().getProp()
+                .stream()
+                .map(prop->MMNodeFactory.property(prop, this)),
+                
+                domainClassDto.getCollections().getColl()
+                .stream()
+                .map(coll->MMNodeFactory.collection(coll, this)));
+                
+    }
+    
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/TypeNode.svg b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/TypeNode.svg
new file mode 100644
index 0000000..88f4293
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/TypeNode.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="160mm"
+   height="160mm"
+   viewBox="0 0 160 160"
+   version="1.1"
+   id="svg4563"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
+   sodipodi:docname="TypeNode.svg">
+  <defs
+     id="defs4557" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.62"
+     inkscape:cx="-146.03225"
+     inkscape:cy="172.90323"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1602"
+     inkscape:window-height="1005"
+     inkscape:window-x="899"
+     inkscape:window-y="198"
+     inkscape:window-maximized="0"
+     units="mm" />
+  <metadata
+     id="metadata4560">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-137)">
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:50.79999924px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       x="46.869045"
+       y="110.27975"
+       id="text5110"><tspan
+         sodipodi:role="line"
+         id="tspan5108"
+         x="46.869045"
+         y="155.22585"
+         style="font-size:50.79999924px;stroke-width:0.26458332" /></text>
+    <rect
+       style="opacity:0.98000004;fill:#d8bfe3;fill-opacity:1;stroke:#7b7b7b;stroke-width:6.82075405;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect5116"
+       width="148.51277"
+       height="148.95171"
+       x="5.0820398"
+       y="142.35172" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       x="15.365664"
+       y="206.60106"
+       id="text5114-6"><tspan
+         sodipodi:role="line"
+         id="tspan5112-5"
+         x="15.365664"
+         y="206.60106"
+         style="font-size:50.79999924px;stroke-width:0.26458332">type</tspan></text>
+  </g>
+</svg>


Mime
View raw message