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 2020/09/23 16:04:02 UTC

[isis] branch master updated: ISIS-2437: add relations to c4 diagrams (System Overview)

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 8d1f1bd  ISIS-2437: add relations to c4 diagrams (System Overview)
8d1f1bd is described below

commit 8d1f1bd9fa02b00334f2306cdecccd9427c2733f
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Sep 23 18:03:48 2020 +0200

    ISIS-2437: add relations to c4 diagrams (System Overview)
---
 .../system/modules/ROOT/pages/about.adoc           | 192 ++++++++++++++++++---
 .../commons/internal/math/_AdjacencyMatrix.java    |  53 ++++++
 .../isis/tooling/cli/projdoc/ProjectDocModel.java  |  66 ++++---
 3 files changed, 266 insertions(+), 45 deletions(-)

diff --git a/antora/components/system/modules/ROOT/pages/about.adoc b/antora/components/system/modules/ROOT/pages/about.adoc
index 5d84d3a..877de75 100644
--- a/antora/components/system/modules/ROOT/pages/about.adoc
+++ b/antora/components/system/modules/ROOT/pages/about.adoc
@@ -8,7 +8,7 @@ These tables summarize all Maven artifacts available with _Apache Isis_.
 ----
 @startuml(id=Base)
 title package-ecosystem - Containers
-caption Artifact Dependency Diagram
+caption Artifact Dependency Diagram (Maven)
 
 skinparam {
   shadowing false
@@ -44,6 +44,8 @@ package "package-ecosystem\n[Software System]" {
   rectangle "==Apache Isis Antora\n<size:10>[Container: packaging: pom]</size>" <<3>> as 3
   rectangle "==Apache Isis Supplemental - Legal Info\n<size:10>[Container: packaging: jar]</size>" <<5>> as 5
 }
+2 .[#707070].> 4 : ""
+2 .[#707070].> 3 : ""
 @enduml
 ----
 
@@ -98,7 +100,7 @@ package "package-ecosystem\n[Software System]" {
 ----
 @startuml(id=Commons)
 title package-ecosystem - Containers
-caption Artifact Dependency Diagram
+caption Artifact Dependency Diagram (Maven)
 
 skinparam {
   shadowing false
@@ -156,7 +158,7 @@ _Dependencies_
 ----
 @startuml(id=Core)
 title package-ecosystem - Containers
-caption Artifact Dependency Diagram
+caption Artifact Dependency Diagram (Maven)
 
 skinparam {
   shadowing false
@@ -234,6 +236,16 @@ package "package-ecosystem\n[Software System]" {
   rectangle "==Apache Isis Core - Unit Test Support\n<size:10>[Container: packaging: jar]</size>" <<6>> as 6
   rectangle "==Apache Isis Core - WebApp\n<size:10>[Container: packaging: jar]</size>" <<11>> as 11
 }
+2 .[#707070].> 3 : ""
+2 .[#707070].> 4 : ""
+2 .[#707070].> 5 : ""
+2 .[#707070].> 7 : ""
+2 .[#707070].> 8 : ""
+2 .[#707070].> 9 : ""
+2 .[#707070].> 12 : ""
+2 .[#707070].> 10 : ""
+2 .[#707070].> 6 : ""
+2 .[#707070].> 11 : ""
 @enduml
 ----
 
@@ -553,7 +565,7 @@ _Dependencies_
 ----
 @startuml(id=App)
 title package-ecosystem - Containers
-caption Artifact Dependency Diagram
+caption Artifact Dependency Diagram (Maven)
 
 skinparam {
   shadowing false
@@ -596,7 +608,7 @@ package "package-ecosystem\n[Software System]" {
 ----
 @startuml(id=Mavendeps)
 title package-ecosystem - Containers
-caption Artifact Dependency Diagram
+caption Artifact Dependency Diagram (Maven)
 
 skinparam {
   shadowing false
@@ -644,6 +656,11 @@ package "package-ecosystem\n[Software System]" {
   rectangle "==Apache Isis Maven Deps - Testing\n<size:10>[Container: packaging: pom]</size>" <<6>> as 6
   rectangle "==Apache Isis Maven Deps - Webapp\n<size:10>[Container: packaging: pom]</size>" <<7>> as 7
 }
+2 .[#707070].> 3 : ""
+2 .[#707070].> 4 : ""
+2 .[#707070].> 5 : ""
+2 .[#707070].> 6 : ""
+2 .[#707070].> 7 : ""
 @enduml
 ----
 
@@ -750,7 +767,7 @@ _Dependencies_
 ----
 @startuml(id=Mappings)
 title package-ecosystem - Containers
-caption Artifact Dependency Diagram
+caption Artifact Dependency Diagram (Maven)
 
 skinparam {
   shadowing false
@@ -798,6 +815,11 @@ package "package-ecosystem\n[Software System]" {
   rectangle "==Apache Isis Map - JaxRS Client (parent)\n<size:10>[Container: packaging: pom]</size>" <<3>> as 3
   rectangle "==Apache Isis Mappings\n<size:10>[Container: packaging: pom]</size>" <<2>> as 2
 }
+6 .[#707070].> 7 : ""
+3 .[#707070].> 4 : ""
+3 .[#707070].> 5 : ""
+2 .[#707070].> 6 : ""
+2 .[#707070].> 3 : ""
 @enduml
 ----
 
@@ -883,7 +905,7 @@ _Dependencies_
 ----
 @startuml(id=Persistence)
 title package-ecosystem - Containers
-caption Artifact Dependency Diagram
+caption Artifact Dependency Diagram (Maven)
 
 skinparam {
   shadowing false
@@ -931,6 +953,10 @@ package "package-ecosystem\n[Software System]" {
   rectangle "==Apache Isis Persistence - JPA (applib)\n<size:10>[Container: packaging: jar]</size>" <<6>> as 6
   rectangle "==Apache Isis Persistence - JPA (model)\n<size:10>[Container: packaging: jar]</size>" <<7>> as 7
 }
+2 .[#707070].> 3 : ""
+2 .[#707070].> 4 : ""
+5 .[#707070].> 6 : ""
+5 .[#707070].> 7 : ""
 @enduml
 ----
 
@@ -1048,7 +1074,7 @@ _Dependencies_
 ----
 @startuml(id=Security)
 title package-ecosystem - Containers
-caption Artifact Dependency Diagram
+caption Artifact Dependency Diagram (Maven)
 
 skinparam {
   shadowing false
@@ -1155,7 +1181,7 @@ _Dependencies_
 ----
 @startuml(id=Valuetypes)
 title package-ecosystem - Containers
-caption Artifact Dependency Diagram
+caption Artifact Dependency Diagram (Maven)
 
 skinparam {
   shadowing false
@@ -1293,6 +1319,26 @@ package "package-ecosystem\n[Software System]" {
   rectangle "==Apache Isis Val - Server Sent Events (ui wicket)\n<size:10>[Container: packaging: jar]</size>" <<22>> as 22
   rectangle "==Apache Isis Value types\n<size:10>[Container: packaging: pom]</size>" <<2>> as 2
 }
+6 .[#707070].> 7 : ""
+3 .[#707070].> 5 : ""
+3 .[#707070].> 6 : ""
+3 .[#707070].> 4 : ""
+3 .[#707070].> 8 : ""
+8 .[#707070].> 9 : ""
+8 .[#707070].> 10 : ""
+14 .[#707070].> 15 : ""
+11 .[#707070].> 13 : ""
+11 .[#707070].> 14 : ""
+11 .[#707070].> 12 : ""
+11 .[#707070].> 16 : ""
+16 .[#707070].> 17 : ""
+21 .[#707070].> 22 : ""
+18 .[#707070].> 21 : ""
+18 .[#707070].> 19 : ""
+18 .[#707070].> 20 : ""
+2 .[#707070].> 3 : ""
+2 .[#707070].> 11 : ""
+2 .[#707070].> 18 : ""
 @enduml
 ----
 
@@ -1593,7 +1639,7 @@ _Dependencies_
 ----
 @startuml(id=Viewer)
 title package-ecosystem - Containers
-caption Artifact Dependency Diagram
+caption Artifact Dependency Diagram (Maven)
 
 skinparam {
   shadowing false
@@ -1671,6 +1717,14 @@ package "package-ecosystem\n[Software System]" {
   rectangle "==Apache Isis Viewer - Wicket (UI Components)\n<size:10>[Container: packaging: jar]</size>" <<11>> as 11
   rectangle "==Apache Isis Viewer - Wicket (Viewer)\n<size:10>[Container: packaging: jar]</size>" <<12>> as 12
 }
+3 .[#707070].> 4 : ""
+3 .[#707070].> 5 : ""
+3 .[#707070].> 6 : ""
+3 .[#707070].> 7 : ""
+3 .[#707070].> 8 : ""
+9 .[#707070].> 10 : ""
+9 .[#707070].> 11 : ""
+9 .[#707070].> 12 : ""
 @enduml
 ----
 
@@ -1914,7 +1968,7 @@ _Dependencies_
 ----
 @startuml(id=Testing)
 title package-ecosystem - Containers
-caption Artifact Dependency Diagram
+caption Artifact Dependency Diagram (Maven)
 
 skinparam {
   shadowing false
@@ -2028,6 +2082,22 @@ package "package-ecosystem\n[Software System]" {
   rectangle "==Apache Isis Tst - Unit Test Support (applib)\n<size:10>[Container: packaging: jar]</size>" <<18>> as 18
   rectangle "==Apache Isis Tst - Unit Test Support (parent)\n<size:10>[Container: packaging: pom]</size>" <<17>> as 17
 }
+2 .[#707070].> 3 : ""
+2 .[#707070].> 7 : ""
+2 .[#707070].> 9 : ""
+2 .[#707070].> 11 : ""
+2 .[#707070].> 13 : ""
+2 .[#707070].> 15 : ""
+2 .[#707070].> 17 : ""
+3 .[#707070].> 4 : ""
+3 .[#707070].> 5 : ""
+3 .[#707070].> 6 : ""
+7 .[#707070].> 8 : ""
+9 .[#707070].> 10 : ""
+11 .[#707070].> 12 : ""
+13 .[#707070].> 14 : ""
+15 .[#707070].> 16 : ""
+17 .[#707070].> 18 : ""
 @enduml
 ----
 
@@ -2278,7 +2348,7 @@ _Dependencies_
 ----
 @startuml(id=Regression_Tests)
 title package-ecosystem - Containers
-caption Artifact Dependency Diagram
+caption Artifact Dependency Diagram (Maven)
 
 skinparam {
   shadowing false
@@ -2302,6 +2372,7 @@ package "package-ecosystem\n[Software System]" {
   rectangle "==Apache Isis - Regression Tests\n<size:10>[Container: packaging: pom]</size>" <<2>> as 2
   rectangle "==Apache Isis - Regression Tests (stable)\n<size:10>[Container: packaging: jar]</size>" <<3>> as 3
 }
+2 .[#707070].> 3 : ""
 @enduml
 ----
 
@@ -2367,7 +2438,7 @@ _Dependencies_
 ----
 @startuml(id=Extensions)
 title package-ecosystem - Containers
-caption Artifact Dependency Diagram
+caption Artifact Dependency Diagram (Maven)
 
 skinparam {
   shadowing false
@@ -2559,6 +2630,35 @@ package "package-ecosystem\n[Software System]" {
   rectangle "==Apache Isis Ext - Wicket Viewer - pdf.js (ui)\n<size:10>[Container: packaging: jar]</size>" <<21>> as 21
   rectangle "==Apache Isis Extensions\n<size:10>[Container: packaging: pom]</size>" <<2>> as 2
 }
+8 .[#707070].> 9 : ""
+3 .[#707070].> 4 : ""
+5 .[#707070].> 6 : ""
+5 .[#707070].> 7 : ""
+12 .[#707070].> 13 : ""
+22 .[#707070].> 23 : ""
+24 .[#707070].> 25 : ""
+24 .[#707070].> 26 : ""
+24 .[#707070].> 27 : ""
+24 .[#707070].> 28 : ""
+24 .[#707070].> 29 : ""
+30 .[#707070].> 31 : ""
+10 .[#707070].> 11 : ""
+14 .[#707070].> 15 : ""
+14 .[#707070].> 16 : ""
+18 .[#707070].> 19 : ""
+18 .[#707070].> 20 : ""
+18 .[#707070].> 21 : ""
+2 .[#707070].> 17 : ""
+2 .[#707070].> 8 : ""
+2 .[#707070].> 3 : ""
+2 .[#707070].> 5 : ""
+2 .[#707070].> 12 : ""
+2 .[#707070].> 22 : ""
+2 .[#707070].> 24 : ""
+2 .[#707070].> 30 : ""
+2 .[#707070].> 10 : ""
+2 .[#707070].> 14 : ""
+2 .[#707070].> 18 : ""
 @enduml
 ----
 
@@ -2998,7 +3098,7 @@ _Dependencies_
 ----
 @startuml(id=Subdomains)
 title package-ecosystem - Containers
-caption Artifact Dependency Diagram
+caption Artifact Dependency Diagram (Maven)
 
 skinparam {
   shadowing false
@@ -3008,22 +3108,22 @@ skinparam {
   maxMessageSize 100
 }
 hide stereotype
-skinparam rectangle<<11>> {
+skinparam rectangle<<22>> {
   BackgroundColor #438dd5
   FontColor #fffffe
   BorderColor #2E6295
 }
-skinparam rectangle<<22>> {
+skinparam rectangle<<11>> {
   BackgroundColor #438dd5
   FontColor #fffffe
   BorderColor #2E6295
 }
-skinparam rectangle<<23>> {
+skinparam rectangle<<12>> {
   BackgroundColor #438dd5
   FontColor #fffffe
   BorderColor #2E6295
 }
-skinparam rectangle<<12>> {
+skinparam rectangle<<23>> {
   BackgroundColor #438dd5
   FontColor #fffffe
   BorderColor #2E6295
@@ -3108,12 +3208,12 @@ skinparam rectangle<<20>> {
   FontColor #fffffe
   BorderColor #2E6295
 }
-skinparam rectangle<<21>> {
+skinparam rectangle<<10>> {
   BackgroundColor #438dd5
   FontColor #fffffe
   BorderColor #2E6295
 }
-skinparam rectangle<<10>> {
+skinparam rectangle<<21>> {
   BackgroundColor #438dd5
   FontColor #fffffe
   BorderColor #2E6295
@@ -3142,6 +3242,27 @@ package "package-ecosystem\n[Software System]" {
   rectangle "==Apache Isis Sub - Zip (parent)\n<size:10>[Container: packaging: pom]</size>" <<22>> as 22
   rectangle "==Apache Isis Subdomains\n<size:10>[Container: packaging: pom]</size>" <<2>> as 2
 }
+3 .[#707070].> 4 : ""
+5 .[#707070].> 6 : ""
+7 .[#707070].> 9 : ""
+7 .[#707070].> 10 : ""
+7 .[#707070].> 8 : ""
+7 .[#707070].> 11 : ""
+12 .[#707070].> 13 : ""
+14 .[#707070].> 15 : ""
+16 .[#707070].> 17 : ""
+18 .[#707070].> 19 : ""
+20 .[#707070].> 21 : ""
+22 .[#707070].> 23 : ""
+2 .[#707070].> 3 : ""
+2 .[#707070].> 5 : ""
+2 .[#707070].> 7 : ""
+2 .[#707070].> 12 : ""
+2 .[#707070].> 14 : ""
+2 .[#707070].> 16 : ""
+2 .[#707070].> 18 : ""
+2 .[#707070].> 20 : ""
+2 .[#707070].> 22 : ""
 @enduml
 ----
 
@@ -3442,7 +3563,7 @@ _Dependencies_
 ----
 @startuml(id=Tooling)
 title package-ecosystem - Containers
-caption Artifact Dependency Diagram
+caption Artifact Dependency Diagram (Maven)
 
 skinparam {
   shadowing false
@@ -3490,6 +3611,11 @@ package "package-ecosystem\n[Software System]" {
   rectangle "==Apache Isis Tooling - Model for AsciiDoc\n<size:10>[Container: packaging: jar]</size>" <<6>> as 6
   rectangle "==Apache Isis Tooling - Project Model (Code mining)\n<size:10>[Container: packaging: jar]</size>" <<7>> as 7
 }
+2 .[#707070].> 3 : ""
+2 .[#707070].> 4 : ""
+2 .[#707070].> 5 : ""
+2 .[#707070].> 6 : ""
+2 .[#707070].> 7 : ""
 @enduml
 ----
 
@@ -3612,7 +3738,7 @@ _Dependencies_
 ----
 @startuml(id=Examples)
 title package-ecosystem - Containers
-caption Artifact Dependency Diagram
+caption Artifact Dependency Diagram (Maven)
 
 skinparam {
   shadowing false
@@ -3660,6 +3786,11 @@ package "package-ecosystem\n[Software System]" {
   rectangle "==Demo - Web\n<size:10>[Container: packaging: jar]</size>" <<6>> as 6
   rectangle "==Demo - Wicket\n<size:10>[Container: packaging: jar]</size>" <<7>> as 7
 }
+2 .[#707070].> 3 : ""
+2 .[#707070].> 4 : ""
+2 .[#707070].> 5 : ""
+2 .[#707070].> 6 : ""
+2 .[#707070].> 7 : ""
 @enduml
 ----
 
@@ -3963,7 +4094,7 @@ _Dependencies_
 ----
 @startuml(id=Incubator)
 title package-ecosystem - Containers
-caption Artifact Dependency Diagram
+caption Artifact Dependency Diagram (Maven)
 
 skinparam {
   shadowing false
@@ -4035,6 +4166,14 @@ package "package-ecosystem\n[Software System]" {
   rectangle "==Apache Isis Inc - Viewer Vaadin (Viewer)\n<size:10>[Container: packaging: jar]</size>" <<11>> as 11
   rectangle "==Apache Isis Incubator\n<size:10>[Container: packaging: pom]</size>" <<2>> as 2
 }
+4 .[#707070].> 5 : ""
+4 .[#707070].> 6 : ""
+4 .[#707070].> 7 : ""
+8 .[#707070].> 9 : ""
+8 .[#707070].> 10 : ""
+8 .[#707070].> 11 : ""
+2 .[#707070].> 4 : ""
+2 .[#707070].> 8 : ""
 @enduml
 ----
 
@@ -4207,7 +4346,7 @@ _Dependencies_
 ----
 @startuml(id=Legacy)
 title package-ecosystem - Containers
-caption Artifact Dependency Diagram
+caption Artifact Dependency Diagram (Maven)
 
 skinparam {
   shadowing false
@@ -4255,6 +4394,11 @@ package "package-ecosystem\n[Software System]" {
   rectangle "==Apache Isis Legacy - REST Client\n<size:10>[Container: packaging: jar]</size>" <<6>> as 6
   rectangle "==Apache Isis Legacy - Runtime\n<size:10>[Container: packaging: jar]</size>" <<7>> as 7
 }
+2 .[#707070].> 3 : ""
+2 .[#707070].> 4 : ""
+2 .[#707070].> 5 : ""
+2 .[#707070].> 6 : ""
+2 .[#707070].> 7 : ""
 @enduml
 ----
 
diff --git a/commons/src/main/java/org/apache/isis/commons/internal/math/_AdjacencyMatrix.java b/commons/src/main/java/org/apache/isis/commons/internal/math/_AdjacencyMatrix.java
new file mode 100644
index 0000000..8ac7a6d
--- /dev/null
+++ b/commons/src/main/java/org/apache/isis/commons/internal/math/_AdjacencyMatrix.java
@@ -0,0 +1,53 @@
+/*
+ *  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.commons.internal.math;
+
+import java.util.function.BiPredicate;
+import java.util.stream.Stream;
+
+import org.apache.isis.commons.collections.Can;
+
+import lombok.RequiredArgsConstructor;
+
+/**
+ * <h1>- internal use only -</h1>
+ * <p>
+ * Adjacency Matrix
+ * </p>
+ * <p>
+ * <b>WARNING</b>: Do <b>NOT</b> use any of the classes provided by this package! <br/>
+ * These may be changed or removed without notice!
+ * </p>
+ *
+ * @since 2.0
+ */
+@RequiredArgsConstructor(staticName = "of")
+public class _AdjacencyMatrix<T> {
+
+    private final Can<T> nodes;
+    private final BiPredicate<T, T> relationPredicate;
+    
+    public Stream<T> streamNeighbors(T a) {
+        return nodes.stream()
+        .filter(b->!a.equals(b))
+        .filter(b->relationPredicate.test(a, b));
+    }
+    
+    
+}
diff --git a/tooling/cli/src/main/java/org/apache/isis/tooling/cli/projdoc/ProjectDocModel.java b/tooling/cli/src/main/java/org/apache/isis/tooling/cli/projdoc/ProjectDocModel.java
index 2c21c20..ff5ed65 100644
--- a/tooling/cli/src/main/java/org/apache/isis/tooling/cli/projdoc/ProjectDocModel.java
+++ b/tooling/cli/src/main/java/org/apache/isis/tooling/cli/projdoc/ProjectDocModel.java
@@ -20,7 +20,9 @@ package org.apache.isis.tooling.cli.projdoc;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
@@ -28,12 +30,14 @@ import java.util.stream.Collectors;
 
 import javax.annotation.Nullable;
 
-import com.structurizr.model.SoftwareSystem;
+import com.structurizr.model.Container;
 
 import org.asciidoctor.ast.Document;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Files;
 import org.apache.isis.commons.internal.base._Strings;
+import org.apache.isis.commons.internal.math._AdjacencyMatrix;
 import org.apache.isis.tooling.c4.C4;
 import org.apache.isis.tooling.cli.CliConfig.ProjectDoc;
 import org.apache.isis.tooling.javamodel.AnalyzerConfigFactory;
@@ -51,6 +55,7 @@ import static org.apache.isis.tooling.model4adoc.AsciiDocFactory.row;
 import static org.apache.isis.tooling.model4adoc.AsciiDocFactory.table;
 
 import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 import guru.nidi.codeassert.config.Language;
@@ -78,10 +83,10 @@ public class ProjectDocModel {
 
         val doc = doc();
         doc.setTitle("System Overview");
-        
+
         val block = block(doc);
         block.setSource(projectDocConfig.getDescription());
-        
+
         projectDocConfig.getArtifactGroups().forEach((section, groupId)->{
             createSection(doc, section, groupId);
         });
@@ -98,44 +103,63 @@ public class ProjectDocModel {
         } 
 
     }
-    
+
     // -- HELPER
 
     private static class GroupDiagram {
+
+        @RequiredArgsConstructor(staticName = "of")
+        private static class ProjectAndContainerTuple {
+            final ProjectNode projectNode;
+            final Container container;
+        }
         
         private final C4 c4;
-        private final SoftwareSystem softwareSystem;
-        
+        private final List<ProjectNode> projectNodes = new ArrayList<>(); 
+
         public GroupDiagram(C4 c4) {
             this.c4 = c4;
-            this.softwareSystem = c4.softwareSystem("package-ecosystem", null);
         }
 
         public void collect(ProjectNode module) {
-            softwareSystem.addContainer(
-                    module.getName(), 
-                    "",//module.getDescription(), 
-                    String.format("packaging: %s", module.getArtifactCoordinates().getPackaging()));
+            projectNodes.add(module);
         }
 
         public String toPlantUml() {
-            
             val key = c4.getWorkspaceName();
-            
-            val containerView = c4.getViewSet().createContainerView(softwareSystem, key, "Artifact Dependency Diagram");
+            val softwareSystem = c4.softwareSystem("package-ecosystem", null);
+
+            val tuples = Can.ofCollection(projectNodes)
+                    .map(projectNode->{
+                        val name = projectNode.getName();
+                        val description = ""; //projectNode.getDescription() XXX needs sanitizing, potentially breaks plantuml/asciidoc syntax
+                        val technology = String.format("packaging: %s", projectNode.getArtifactCoordinates().getPackaging());
+                        val container = softwareSystem.addContainer(name, description, technology);
+                        return ProjectAndContainerTuple.of(projectNode, container);
+                    });
+
+            val adjMatrix = _AdjacencyMatrix.of(tuples, (a, b)->a.projectNode.getChildren().contains(b.projectNode));
+
+            tuples.forEach(tuple->{
+                adjMatrix.streamNeighbors(tuple)
+                .forEach(dependentTuple->{
+                    tuple.container.uses(dependentTuple.container, "");
+                });
+            });
+
+            val containerView = c4.getViewSet().createContainerView(softwareSystem, key, "Artifact Dependency Diagram (Maven)");
             containerView.addAllContainers();
-            
+
             val plantUmlSource = c4.toPlantUML(containerView);
             return plantUmlSource;
         }
-        
+
         public String toAsciiDoc() {
-            
             val key = c4.getWorkspaceName();
-            
+
             return AsciiDocFactory.SourceFactory.plantuml(toPlantUml(), key, null);
         }
-        
+
     }
 
     private void createSection(
@@ -146,7 +170,7 @@ public class ProjectDocModel {
         val titleBlock = block(doc);
 
         titleBlock.setSource(String.format("== %s", sectionName));
-        
+
         val descriptionBlock = block(doc);
         val groupDiagram = new GroupDiagram(C4.of(sectionName, null));
 
@@ -188,7 +212,7 @@ public class ProjectDocModel {
         });
 
         descriptionBlock.setSource(groupDiagram.toAsciiDoc());
-        
+
         modules.removeAll(modulesWritten);
 
     }