You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2021/02/07 14:53:30 UTC

[isis] 06/12: ISIS-2526: suppresses title

This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch ISIS-2444
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 10601ed68986820a75aa99a1b7f6f747d117caae
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Sat Feb 6 14:30:38 2021 +0000

    ISIS-2526: suppresses title
---
 tooling/cli/pom.xml                                |  33 ++++++
 .../main/java/org/apache/isis/tooling/cli/Cli.java |  32 ++----
 .../isis/tooling/cli/CliCommandAbstract.java       |  17 +++
 .../org/apache/isis/tooling/cli/CliConfig.java     |  10 +-
 .../cli/adocfix/OrphanedIncludeStatementFixer.java |  12 ++-
 .../isis/tooling/cli/projdoc/ProjectDocModel.java  |   1 +
 tooling/cli/src/main/resources/log4j2.xml          |   2 +-
 .../apache/isis/tooling/j2adoc/J2AdocContext.java  | 118 +++++++++++----------
 .../tooling/j2adoc/convert/HtmlToAsciiDoc.java     |  75 ++++++-------
 .../j2adoc/format/UnitFormatterAbstract.java       | 108 ++++++++++---------
 .../UnitFormatterWithSourceAndFootNotes.java       |  78 +++++++-------
 tooling/model4adoc/README.adoc                     |  31 +++---
 .../apache/isis/tooling/model4adoc/NodeWriter.java |  52 ++++-----
 .../projectmodel/ProjectNodeFactory_maven.java     |  52 ++++-----
 14 files changed, 334 insertions(+), 287 deletions(-)

diff --git a/tooling/cli/pom.xml b/tooling/cli/pom.xml
index e8a6dac..fdef05b 100644
--- a/tooling/cli/pom.xml
+++ b/tooling/cli/pom.xml
@@ -32,6 +32,7 @@
 
 	<build>
 		<plugins>
+<!--
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-assembly-plugin</artifactId>
@@ -58,6 +59,38 @@
 					</execution>
 				</executions>
 			</plugin>
+-->
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-shade-plugin</artifactId>
+				<version>3.2.4</version>
+				<executions>
+					<execution>
+						<id>shade-my-jar</id>
+						<phase>package</phase>
+						<goals>
+							<goal>shade</goal>
+						</goals>
+						<configuration>
+							<transformers>
+								<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+									<mainClass>org.apache.isis.tooling.cli.Cli</mainClass>
+								</transformer>
+							</transformers>
+							<finalName>isis-tooling-cli</finalName>
+							<filters>
+								<filter>
+									<artifact>*:*</artifact>
+									<excludes>
+										<exclude>**/Log4j2Plugins.dat</exclude>
+									</excludes>
+								</filter>
+							</filters>
+							<minimizeJar>true</minimizeJar>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
 		</plugins>
 	</build>
 
diff --git a/tooling/cli/src/main/java/org/apache/isis/tooling/cli/Cli.java b/tooling/cli/src/main/java/org/apache/isis/tooling/cli/Cli.java
index dace871..5bf16f0 100644
--- a/tooling/cli/src/main/java/org/apache/isis/tooling/cli/Cli.java
+++ b/tooling/cli/src/main/java/org/apache/isis/tooling/cli/Cli.java
@@ -24,7 +24,6 @@ import java.util.concurrent.Callable;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.tooling.cli.projdoc.ProjectDocModel;
-import org.apache.isis.tooling.projectmodel.ProjectNodeFactory;
 
 import lombok.val;
 
@@ -90,16 +89,10 @@ class Cli implements Callable<Integer> {
 
         @Override
         public Integer call() throws Exception {
-
-            if(getOutputPath()!=null) {
-                getConfig().getGlobal().setOutputRootFolder(getOutputPath());
-            }
-
-            val projTree = ProjectNodeFactory.maven(getProjectRoot());
-            val projectDocModel = new ProjectDocModel(projTree);
-            projectDocModel.generateAsciiDoc(getConfig(), ProjectDocModel.Mode.OVERVIEW);
+            generateAsciidoc(ProjectDocModel.Mode.OVERVIEW);
             return 0;
         }
+
     }
 
     @Command(
@@ -107,19 +100,12 @@ class Cli implements Callable<Integer> {
             description = "Writes a Global Index (AsciiDoc) to given output.")
     static class GlobalIndexCommand extends CliCommandAbstract {
 
-
         @Override
         public Integer call() throws Exception {
-
-            if(getOutputPath() != null) {
-                getConfig().getGlobal().setOutputRootFolder(getOutputPath());
-            }
-
-            val projTree = ProjectNodeFactory.maven(getProjectRoot());
-            val projectDocModel = new ProjectDocModel(projTree);
-            projectDocModel.generateAsciiDoc(getConfig(), ProjectDocModel.Mode.INDEX);
+            generateAsciidoc(ProjectDocModel.Mode.INDEX);
             return 0;
         }
+
     }
 
     @Command(
@@ -129,16 +115,10 @@ class Cli implements Callable<Integer> {
 
         @Override
         public Integer call() throws Exception {
-
-            if(getOutputPath() != null) {
-                getConfig().getGlobal().setOutputRootFolder(getOutputPath());
-            }
-
-            val projTree = ProjectNodeFactory.maven(getProjectRoot());
-            val projectDocModel = new ProjectDocModel(projTree);
-            projectDocModel.generateAsciiDoc(getConfig(), ProjectDocModel.Mode.ALL);
+            generateAsciidoc(ProjectDocModel.Mode.ALL);
             return 0;
         }
+
     }
 
 
diff --git a/tooling/cli/src/main/java/org/apache/isis/tooling/cli/CliCommandAbstract.java b/tooling/cli/src/main/java/org/apache/isis/tooling/cli/CliCommandAbstract.java
index c2956f9..432a1cc 100644
--- a/tooling/cli/src/main/java/org/apache/isis/tooling/cli/CliCommandAbstract.java
+++ b/tooling/cli/src/main/java/org/apache/isis/tooling/cli/CliCommandAbstract.java
@@ -22,6 +22,10 @@ import java.io.File;
 import java.util.concurrent.Callable;
 
 import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.tooling.cli.projdoc.ProjectDocModel;
+import org.apache.isis.tooling.projectmodel.ProjectNodeFactory;
+
+import lombok.val;
 
 abstract class CliCommandAbstract implements Callable<Integer> {
 
@@ -37,5 +41,18 @@ abstract class CliCommandAbstract implements Callable<Integer> {
         return _Context.getElseFail(Cli.class).getOutputPath();
     }
 
+    /**
+     * factor out common logic
+     * @param mode
+     */
+    protected void generateAsciidoc(ProjectDocModel.Mode mode) {
+        if (getOutputPath() != null) {
+            getConfig().getGlobal().setOutputRootFolder(getOutputPath());
+        }
+
+        val projTree = ProjectNodeFactory.maven(getProjectRoot());
+        val projectDocModel = new ProjectDocModel(projTree);
+        projectDocModel.generateAsciiDoc(getConfig(), mode);
+    }
 
 }
diff --git a/tooling/cli/src/main/java/org/apache/isis/tooling/cli/CliConfig.java b/tooling/cli/src/main/java/org/apache/isis/tooling/cli/CliConfig.java
index d0be900..30f514f 100644
--- a/tooling/cli/src/main/java/org/apache/isis/tooling/cli/CliConfig.java
+++ b/tooling/cli/src/main/java/org/apache/isis/tooling/cli/CliConfig.java
@@ -22,6 +22,8 @@ import java.io.File;
 import java.util.LinkedHashMap;
 import java.util.Optional;
 
+import org.yaml.snakeyaml.constructor.ConstructorException;
+
 import org.apache.isis.commons.internal.resources._Yaml;
 
 import lombok.Data;
@@ -89,6 +91,7 @@ public class CliConfig {
             private String documentGlobalIndexXrefPageIdFormat = "system:generated:index/%s.adoc";
 
             private boolean fixOrphanedAdocIncludeStatements = false;
+            private boolean skipTitleHeader = false;
 
             public File getDocumentIndexFolder(File outputRootFolder) {
                 return Optional.ofNullable(outputRootFolder)
@@ -105,7 +108,12 @@ public class CliConfig {
     public static CliConfig read(final @NonNull File file) {
         return _Yaml.readYaml(CliConfig.class, file)
         .ifFailure(e->{
-            System.err.println(String.format("config file '%s' not readable, using defaults", file.getAbsolutePath()));
+            if(e instanceof ConstructorException) {
+                final ConstructorException ce = (ConstructorException) e;
+                throw new RuntimeException(String.format("config file '%s' not readable\n%s", file.getAbsolutePath(), ce.getProblem()));
+            } else {
+                throw new RuntimeException(String.format("config file '%s' not readable\n%s", file.getAbsolutePath(), e));
+            }
         })
         .presentElseGet(CliConfig::new);
     }
diff --git a/tooling/cli/src/main/java/org/apache/isis/tooling/cli/adocfix/OrphanedIncludeStatementFixer.java b/tooling/cli/src/main/java/org/apache/isis/tooling/cli/adocfix/OrphanedIncludeStatementFixer.java
index c14b324..8d36b7e 100644
--- a/tooling/cli/src/main/java/org/apache/isis/tooling/cli/adocfix/OrphanedIncludeStatementFixer.java
+++ b/tooling/cli/src/main/java/org/apache/isis/tooling/cli/adocfix/OrphanedIncludeStatementFixer.java
@@ -32,7 +32,9 @@ import org.apache.isis.tooling.model4adoc.include.IncludeStatements;
 
 import lombok.NonNull;
 import lombok.val;
+import lombok.extern.log4j.Log4j2;
 
+@Log4j2
 public final class OrphanedIncludeStatementFixer {
 
     public static void fixIncludeStatements(
@@ -41,16 +43,16 @@ public final class OrphanedIncludeStatementFixer {
             final @NonNull J2AdocContext j2aContext) {
 
         if(cliConfig.getGlobal().isDryRun()) {
-            System.out.println("IncludeStatementFixer: skip (dry-run)");
+            log.debug("IncludeStatementFixer: skip (dry-run)");
             return;
         }
 
         if(!cliConfig.getCommands().getIndex().isFixOrphanedAdocIncludeStatements()) {
-            System.out.println("IncludeStatementFixer: skip (disabled via config, fixOrphandedAdocIncludeStatements=false)");
+            log.debug("IncludeStatementFixer: skip (disabled via config, fixOrphandedAdocIncludeStatements=false)");
             return;
         }
 
-        System.out.println(String.format("IncludeStatementFixer: about to process %d adoc files", adocFiles.size()));
+        log.debug("IncludeStatementFixer: about to process {} adoc files", adocFiles.size());
 
         val totalFixed = _Refs.intRef(0);
 
@@ -96,7 +98,7 @@ public final class OrphanedIncludeStatementFixer {
                     }
 
                 });
-                
+
                 return correctedIncludeStatement
                         .getValue()
                         .orElse(null); // keep original line, don't mangle
@@ -113,7 +115,7 @@ public final class OrphanedIncludeStatementFixer {
 
         });
 
-        System.out.println(String.format("IncludeStatementFixer: all done. (%d orphanded inlcudes fixed)", totalFixed.getValue()));
+        log.debug("IncludeStatementFixer: all done. ({} orphanded inlcudes fixed)", totalFixed.getValue());
 
     }
 
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 0f42006..9254cc7 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
@@ -108,6 +108,7 @@ public class ProjectDocModel {
                 .licenseHeader(cliConfig.getGlobal().getLicenseHeader())
                 .xrefPageIdFormat(cliConfig.getCommands().getIndex().getDocumentGlobalIndexXrefPageIdFormat())
                 .namespacePartsSkipCount(cliConfig.getGlobal().getNamespacePartsSkipCount())
+                .skipTitleHeader(cliConfig.getCommands().getIndex().isSkipTitleHeader())
                 .build();
 
         val doc = doc();
diff --git a/tooling/cli/src/main/resources/log4j2.xml b/tooling/cli/src/main/resources/log4j2.xml
index 02f72cb..492c207 100644
--- a/tooling/cli/src/main/resources/log4j2.xml
+++ b/tooling/cli/src/main/resources/log4j2.xml
@@ -23,4 +23,4 @@
             <appender-ref ref="console" />
         </Root>
     </Loggers>
-</Configuration>
\ No newline at end of file
+</Configuration>
diff --git a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/J2AdocContext.java b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/J2AdocContext.java
index 9404831..a6f1829 100644
--- a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/J2AdocContext.java
+++ b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/J2AdocContext.java
@@ -46,126 +46,130 @@ import lombok.Getter;
 import lombok.NonNull;
 import lombok.Value;
 import lombok.val;
+import lombok.extern.log4j.Log4j2;
 
-@Value @Builder
+@Value @Builder @Log4j2
 public class J2AdocContext {
 
     private final @NonNull String xrefPageIdFormat;
     private final @Nullable String licenseHeader;
-    
+
     @Builder.Default
     private final int namespacePartsSkipCount = 0;
-    
+
+    @Builder.Default
+    private final boolean skipTitleHeader = false;
+
     @Builder.Default
     private final @NonNull String memberNameFormat = "[teal]#*%s*#";
-    
+
     @Builder.Default
     private final @NonNull String staticMemberNameFormat = "[teal]#*_%s_*#";
-    
+
     @Builder.Default
     private final @NonNull String deprecatedMemberNameFormat = "[line-through gray]#*%s*#";
-    
+
     @Builder.Default
     private final @NonNull String deprecatedStaticMemberNameFormat = "[line-through gray]#*_%s_*#";
-    
+
     // -- CONVERTER
-    
+
     private final @NonNull Function<J2AdocContext, J2AdocConverter> converterFactory;
-    
+
     @Getter(lazy=true)
     private final J2AdocConverter converter = getConverterFactory().apply(this);
-    
+
     // -- FORMATTER
-    
+
     private final @NonNull Function<J2AdocContext, UnitFormatter> formatterFactory;
-    
+
     @Getter(lazy=true)
     private final UnitFormatter formatter = getFormatterFactory().apply(this);
 
     // -- UNIT INDEX
-    
+
     private final Map<LookupKey, J2AdocUnit> unitIndex = _Maps.newTreeMap();
     private final ListMultimap<String, J2AdocUnit> unitsByTypeSimpleName = _Multimaps.newListMultimap();
-    
+
     public J2AdocContext add(final @NonNull J2AdocUnit unit) {
         val unitKey = LookupKey.of(unit.getResourceCoordinates());
         val previousKey = unitIndex.put(unitKey, unit);
         if(previousKey!=null) {
             throw _Exceptions.unrecoverableFormatted(
                     "J2AUnit index entries must be unique, "
-                    + "index key collision on \nexists: %s\nnew:    %s", 
+                    + "index key collision on \nexists: %s\nnew:    %s",
                     previousKey,
                     unit);
         }
         unitsByTypeSimpleName.putElement(unit.getName().stream().collect(Collectors.joining(".")), unit);
         return this;
     }
-    
+
     public Stream<J2AdocUnit> add(final @NonNull File sourceFile) {
         return J2AdocUnit.parse(sourceFile)
         .peek(this::add)
-        // ensure the stream is consumed here, 
+        // ensure the stream is consumed here,
         // optimized for 1 result per source file, but can be more
-        .collect(Collectors.toCollection(()->new ArrayList<>(1))) 
+        .collect(Collectors.toCollection(()->new ArrayList<>(1)))
         .stream();
     }
-    
+
     /**
      * Find the J2AdocUnit by given search parameters.
      * @param partialName - can be anything, originating eg. from java-doc {@literal link} tags.
      * @param unit - the referring (originating) unit, that is currently processed
      */
     public Optional<J2AdocUnit> findUnit(
-            final @Nullable String partialName, 
+            final @Nullable String partialName,
             final @NonNull  J2AdocUnit unit) {
-        
+
         if(_Strings.isNullOrEmpty(partialName)) {
             return Optional.empty();
         }
-        
+
         val partialNameNoWhiteSpaces = partialName.split("\\s")[0];
-        
-        
+
+
         if(partialNameNoWhiteSpaces.contains("#")) {
             // skip member reference lookup
-            //XXX reserved for future extensions ... 
+            //XXX reserved for future extensions ...
             //val partialNameWithoutMember = _Refs.stringRef(partialName).cutAtIndexOf("#");
-            return Optional.empty();  
+            return Optional.empty();
         }
-        
+
         //XXX debug entry point (keep)
 //        if(unit.getFriendlyName().contains("")
 //                && partialNameNoWhiteSpaces.equals("Blob")) {
-//            System.out.println("!!! debug entry point");
+//            log.debug("!!! debug entry point");
 //        }
-        
+
         // given the partialNameNoWhiteSpaces, we split it into parts delimited by '.'
-        // any possible ordered subset reachable through removing only leading parts 
+        // any possible ordered subset reachable through removing only leading parts
         // is a candidate representation of the typeSimpleName
         // eg. given a.b.c.d the candidates are in order of likelihood ...
         // d
         // c.d
         // b.c.d
         // a.b.c.d
-        
+
         final Can<String> nameDiscriminator = Can.ofStream(
                 _Strings.splitThenStream(partialNameNoWhiteSpaces, "."));
-        
+
         val nameDiscriminatorPartIterator = nameDiscriminator.reverseIterator();
-        
+
         val typeSimpleNameCandidates = Stream.iterate(
-                Can.ofSingleton(nameDiscriminatorPartIterator.next()), 
+                Can.ofSingleton(nameDiscriminatorPartIterator.next()),
                 parts->parts.add(nameDiscriminatorPartIterator.next()))
         .limit(nameDiscriminator.size())
         .collect(Can.toCan());
-        
-        // each Can<String> represents a fully qualified name, where all its String parts are 
-        // collected; which are the Java package-name parts and the Java simple-name parts combined 
+
+        // each Can<String> represents a fully qualified name, where all its String parts are
+        // collected; which are the Java package-name parts and the Java simple-name parts combined
         // note: Java simple-name parts, are multiple when the class is nested
         final Can<Can<String>> potentialFqns = Can.ofStream(
                 ImportDeclarations
                 .streamPotentialFqns(nameDiscriminator, unit.getImportDeclarations()));
-        
+
         // for performance reasons we only search the units that are hash mapped
         // by the typeSimpleNameCandidates using the unitsByTypeSimpleName map
         val searchResult = typeSimpleNameCandidates.stream()
@@ -176,16 +180,16 @@ public class J2AdocContext {
                 .stream())
         // we have a match if either the candidate unit's namespace matches the one of the potentialFqns
         // or otherwise if candidate unit and originating unit share the same Java package;
-        // that is, in Java sources, types may refer to other types within the same package without the 
+        // that is, in Java sources, types may refer to other types within the same package without the
         // need for declaring an import statement, hence the second option is a fallback
         .filter((J2AdocUnit referredUnit)->potentialFqns.stream()
                 .anyMatch(potentialFqn->potentialFqn.isEqualTo(referredUnit.getFqnParts()))
                 || unit.getNamespace().equals(referredUnit.getNamespace()) //same package
         )
         .collect(Can.toCan());
-        
+
         // what's left to do at this point is to log empty or ambiguous search results
-        // while also trying to suppress cases that are of no interest   
+        // while also trying to suppress cases that are of no interest
 
         val skipLog = searchResult.isEmpty() && (
                 unit.getFqnParts().endsWith(nameDiscriminator) // self referential
@@ -206,62 +210,62 @@ public class J2AdocContext {
                 || nameDiscriminator.isEqualTo(Can.of("Math"))
                 || nameDiscriminator.isEqualTo(Can.of("Thread"))
                 || potentialFqns.stream().anyMatch(fqn->
-                    // known packages, we'll never find in the index                    
+                    // known packages, we'll never find in the index
                     fqn.startsWith(Can.of("java"))
                     || fqn.startsWith(Can.of("javax")))
         );
 
         // don't log self-referential lookups, as these are not an issue
         if(!skipLog) {
-            logIfEmptyOrAmbiguous(searchResult, 
+            logIfEmptyOrAmbiguous(searchResult,
                     String.format("while processing %s searching referenced unit by partial name '%s'",
                             unit.getFriendlyName(),
                             partialNameNoWhiteSpaces));
         }
-        
+
         return searchResult.getSingleton();
     }
-    
+
     public Optional<J2AdocUnit> findUnitByTypeSimpleName(final @Nullable String typeSimpleName) {
-        
+
         if(_Strings.isNullOrEmpty(typeSimpleName)) {
             return Optional.empty();
         }
-        
+
         val searchResult = Can.ofCollection(unitsByTypeSimpleName.getOrElseEmpty(typeSimpleName));
-        
-        logIfEmptyOrAmbiguous(searchResult, 
+
+        logIfEmptyOrAmbiguous(searchResult,
                 String.format("searching unit by type-simple-name '%s'", typeSimpleName));
-        
+
         return searchResult.getSingleton();
     }
-    
+
     public Stream<J2AdocUnit> streamUnits() {
         return unitIndex.values().stream();
     }
 
     /**
-     * @param key - unique key for types 
+     * @param key - unique key for types
      * @return optionally the unit available for given key
      */
     public Optional<J2AdocUnit> getUnit(final @NonNull LookupKey key) {
         return Optional.ofNullable(unitIndex.get(key));
     }
-    
+
     // -- PREDEFINED FORMATS
-    
+
     public static J2AdocContextBuilder javaSourceWithFootnotesFormat() {
         return J2AdocContext.builder()
                 .converterFactory(J2AdocConverter::createDefault)
                 .formatterFactory(UnitFormatterWithSourceAndFootNotes::new)
                 ;
     }
-    
+
     public static J2AdocContextBuilder compactFormat() {
         return J2AdocContext.builder()
                 .converterFactory(J2AdocConverter::createDefault)
                 .formatterFactory(UnitFormatterCompact::new)
-                ;        
+                ;
     }
 
     // -- LOG
@@ -275,5 +279,5 @@ public class J2AdocContext {
         }
     }
 
-    
+
 }
diff --git a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/convert/HtmlToAsciiDoc.java b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/convert/HtmlToAsciiDoc.java
index 875bc94..1619a50 100644
--- a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/convert/HtmlToAsciiDoc.java
+++ b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/convert/HtmlToAsciiDoc.java
@@ -36,35 +36,35 @@ import lombok.SneakyThrows;
 import lombok.val;
 
 final class HtmlToAsciiDoc {
-    
+
     @SneakyThrows
     public static Document body(Element body) {
-        
+
         val adoc = AsciiDocFactory.doc();
-        
+
         val helper = new BlockHelper(adoc);
-        
+
         NodeTraversor.traverse(new NodeVisitor() {
-            
+
             @Override
             public void head(Node node, int depth) {
-                
+
                 val tag = _Strings.nullToEmpty(node.nodeName()).toLowerCase();
-                
+
                 if(node instanceof TextNode) {
-                    
+
                     val textNode = (TextNode)node;
-                    
+
                     val text = helper.isPreFormatted()
                             ? textNode.getWholeText()
                             : textNode.text().trim();
-                            
+
                     if(!text.isBlank()) {
-                        helper.blockAppend(text);    
+                        helper.blockAppend(text);
                     }
                     return;
-                } 
-                
+                }
+
                 switch(tag) {
                 case "ul":
                     helper.nextList();
@@ -84,6 +84,7 @@ final class HtmlToAsciiDoc {
                     helper.blockAppend(" *");
                     return;
                 case "tt":
+                case "code":
                     helper.blockAppend(" `");
                     return;
                 case "i":
@@ -91,12 +92,12 @@ final class HtmlToAsciiDoc {
                     return;
                 }
             }
-            
+
             @Override
             public void tail(Node node, int depth) {
-                
+
                 val tag = _Strings.nullToEmpty(node.nodeName()).toLowerCase();
-                
+
                 switch(tag) {
                 case "ul":
                     helper.popList();
@@ -118,63 +119,63 @@ final class HtmlToAsciiDoc {
                     helper.blockAppend("_ ");
                     return;
                 }
-                
+
             }
-            
-            
+
+
         }, body);
 
         return adoc;
     }
-    
+
     // -- HELPER
-    
+
     private final static class BlockHelper {
-        
+
         private final Stack<StructuralNode> nodeStack = new Stack<>();
         private final Stack<org.asciidoctor.ast.List> listStack = new Stack<>();
-        
+
 
         // first element on the stack is the document, that is the the root of the adoc abstract syntax tree
         BlockHelper(Document adoc){
-            nodeStack.push(adoc);  
+            nodeStack.push(adoc);
         }
-        
+
         void pop() {
             nodeStack.pop();
         }
-        
+
         void popList() {
             nodeStack.pop();
             listStack.pop();
         }
-        
+
         // create a new block on top of the current stack
         Block nextBlock() {
             val block = AsciiDocFactory.block(nodeStack.peek());
             nodeStack.push(block);
             return block;
         }
-        
+
         // create a new block on top of the current stack
         Block nextListingBlock() {
             val block = AsciiDocFactory.listingBlock(nodeStack.peek(), "");
             nodeStack.push(block);
             return block;
         }
-        
+
         // if the stack top is already a block reuse it or create a new one
         Block getBlock() {
             return (nodeStack.peek() instanceof Block)
                     ? (Block) nodeStack.peek()
                     : nextBlock();
         }
-        
+
         void blockAppend(String source) {
             val block = getBlock();
             block.setSource(block.getSource()+source);
         }
-        
+
         org.asciidoctor.ast.List nextList() {
             val nextList = AsciiDocFactory.list(nodeStack.peek());
             nodeStack.push(nextList);
@@ -186,7 +187,7 @@ final class HtmlToAsciiDoc {
             val list = listStack.isEmpty()
                     ? nextList()
                     : listStack.peek();
-            
+
             // pop until stack top points to list
             while(!list.equals(nodeStack.peek())) {
                 nodeStack.pop();
@@ -195,23 +196,23 @@ final class HtmlToAsciiDoc {
             val openBlock = AsciiDocFactory.openBlock(listItem);
             nodeStack.push(openBlock);
         }
-        
+
         // -- PRE HANDLING
-        
+
         int preDepth = 0;
 
         void onPreHead() {
             ++preDepth;
         }
-        
+
         void onPreTail() {
             --preDepth;
         }
-        
+
         boolean isPreFormatted() {
             return preDepth>0;
         }
-        
+
     }
 
 }
diff --git a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatterAbstract.java b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatterAbstract.java
index a587325..7e6fba0 100644
--- a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatterAbstract.java
+++ b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatterAbstract.java
@@ -39,31 +39,31 @@ import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 @RequiredArgsConstructor(access = AccessLevel.PROTECTED)
-public abstract class UnitFormatterAbstract 
+public abstract class UnitFormatterAbstract
 implements UnitFormatter {
-    
+
     private final @NonNull J2AdocContext j2aContext;
-    
+
     @Override
     public String getEnumConstantFormat() {
         return "`%s`";
     }
-    
+
     @Override
     public String getAnnotationMemberFormat() {
         return "`%2$s` : `%1$s`";
     }
-    
+
     @Override
     public String getFieldFormat() {
         return "`%2$s` : `%1$s`";
     }
-    
+
     @Override
     public String getConstructorFormat() {
         return "`%1$s(%2$s)`";
     }
-    
+
     @Override
     public String getGenericConstructorFormat() {
         return "`%2$s%1$s(%3$s)`";
@@ -78,14 +78,14 @@ implements UnitFormatter {
     public String getGenericMethodFormat() {
         return "`%3$s%1$s(%4$s)` : `%2$s`";
     }
-    
+
     protected Optional<String> title(final J2AdocUnit unit) {
         return Optional.of(
-                String.format("%s : _%s_", 
+                String.format("%s : _%s_",
                         unit.getFriendlyName(),
                         unit.getDeclarationKeywordFriendlyName().toLowerCase()));
     }
-    
+
     protected void intro(final J2AdocUnit unit, final StructuralNode parent) {
 
         unit.getJavadoc()
@@ -93,139 +93,141 @@ implements UnitFormatter {
         .map(javadoc->getConverter().javadoc(javadoc, unit))
         .ifPresent(doc->parent.getBlocks().addAll(doc.getBlocks()));
     }
-    
+
     protected Optional<String> javaSource(final J2AdocUnit unit) {
         return Optional.empty();
     }
-    
+
     protected abstract StructuralNode getMemberDescriptionContainer(StructuralNode parent);
-    
+
     protected void appendMemberDescription(StructuralNode ul, String member, Document javadoc) {
         val li = AsciiDocFactory.listItem((List) ul, member);
         val openBlock = AsciiDocFactory.openBlock(li);
         val javaDocBlock = AsciiDocFactory.block(openBlock);
         javaDocBlock.getBlocks().addAll(javadoc.getBlocks());
     }
-    
+
     protected void memberDescriptions(final J2AdocUnit unit, final StructuralNode parent) {
-        
+
         val ul = getMemberDescriptionContainer(parent);
-        
+
         unit.getTypeDeclaration().getEnumConstantDeclarations().stream()
         .filter(Javadocs::presentAndNotHidden)
         .forEach(ecd->{
             ecd.getJavadoc()
             .ifPresent(javadoc->{
-                
-                appendMemberDescription(ul, 
+
+                appendMemberDescription(ul,
                                 getConverter().enumConstantDeclaration(ecd),
                                 getConverter().javadoc(javadoc, unit));
             });
         });
-        
+
         unit.getTypeDeclaration().getPublicFieldDeclarations().stream()
         .filter(Javadocs::presentAndNotHidden)
         .forEach(fd->{
-            
+
             fd.getJavadoc()
             .ifPresent(javadoc->{
-                
+
                 appendMemberDescription(ul,
                         getConverter().fieldDeclaration(fd, unit),
                         getConverter().javadoc(javadoc, unit));
             });
-            
+
         });
-        
+
         unit.getTypeDeclaration().getAnnotationMemberDeclarations().stream()
         .filter(Javadocs::presentAndNotHidden)
         .forEach(ecd->{
             ecd.getJavadoc()
             .ifPresent(javadoc->{
-                
-                appendMemberDescription(ul, 
+
+                appendMemberDescription(ul,
                                 getConverter().annotationMemberDeclaration(ecd, unit),
                                 getConverter().javadoc(javadoc, unit));
             });
         });
-        
+
         unit.getTypeDeclaration().getPublicConstructorDeclarations().stream()
         .filter(Javadocs::presentAndNotHidden)
         .forEach(cd->{
-            
+
             cd.getJavadoc()
             .ifPresent(javadoc->{
-                
+
                 appendMemberDescription(ul,
                         getConverter().constructorDeclaration(cd, unit),
                         getConverter().javadoc(javadoc, unit));
             });
-            
+
         });
-        
+
         unit.getTypeDeclaration().getPublicMethodDeclarations().stream()
         .filter(Javadocs::presentAndNotHidden)
         .forEach(md->{
-            
+
             md.getJavadoc()
             .ifPresent(javadoc->{
-                
+
                 appendMemberDescription(ul,
                         getConverter().methodDeclaration(md, unit),
                         getConverter().javadoc(javadoc, unit));
             });
-            
+
         });
     }
-    
+
 
     protected Optional<String> outro(final J2AdocUnit unit) {
         return Optional.empty();
     }
-    
+
 
     @Override
     public Document apply(final J2AdocUnit unit) {
-        
+
         val doc = AsciiDocFactory.doc();
-        
+
         // -- title
-        
-        title(unit)
-        .ifPresent(doc::setTitle);
-        
+
+        if(!j2aContext.isSkipTitleHeader()) {
+            title(unit)
+            .ifPresent(doc::setTitle);
+        }
+
         // -- license
-        
+
         _Strings.nonEmpty(getContext().getLicenseHeader())
         .ifPresent(notice->AsciiDocFactory.attrNotice(doc, notice));
 
         // -- intro
-        
+
         intro(unit, doc);
-        
+
         // -- java source
-        
+
         javaSource(unit)
         .ifPresent(block(doc)::setSource);
-            
+
         // -- member descriptions
-        
+
         memberDescriptions(unit, doc);
-        
+
         // -- outro
-        
+
         outro(unit)
         .ifPresent(block(doc)::setSource);
-        
+
         return doc;
     }
-    
+
     // -- DEPENDENCIES
-    
+
     protected final J2AdocContext getContext() {
         return j2aContext;
     }
-    
+
     protected final J2AdocConverter getConverter() {
         return j2aContext.getConverter();
     }
diff --git a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatterWithSourceAndFootNotes.java b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatterWithSourceAndFootNotes.java
index 0760c06..f539e5f 100644
--- a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatterWithSourceAndFootNotes.java
+++ b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatterWithSourceAndFootNotes.java
@@ -34,86 +34,86 @@ import org.apache.isis.tooling.model4adoc.AsciiDocFactory;
 
 import lombok.val;
 
-public class UnitFormatterWithSourceAndFootNotes 
+public class UnitFormatterWithSourceAndFootNotes
 extends UnitFormatterAbstract {
 
     public UnitFormatterWithSourceAndFootNotes(final J2AdocContext j2aContext) {
         super(j2aContext);
     }
-    
+
     protected Optional<String> javaSource(final J2AdocUnit unit) {
-        
+
         val java = new StringBuilder();
-        
-        java.append(String.format("%s %s {\n", 
-                unit.getDeclarationKeyword(), 
+
+        java.append(String.format("%s %s {\n",
+                unit.getDeclarationKeyword(),
                 unit.getSimpleName()));
-        
+
         unit.getTypeDeclaration().getEnumConstantDeclarations().stream()
         .filter(Javadocs::notExplicitlyHidden)
         .forEach(ecd->{
-            
+
             val memberFormat = javaSourceMemberFormat(ecd.getJavadoc().isPresent());
-            
-            java.append(String.format(memberFormat, 
+
+            java.append(String.format(memberFormat,
                     EnumConstantDeclarations.asNormalized(ecd)));
-            
+
         });
-        
+
         unit.getTypeDeclaration().getPublicFieldDeclarations().stream()
         .filter(Javadocs::notExplicitlyHidden)
         .forEach(fd->{
-            
+
             val memberFormat = javaSourceMemberFormat(fd.getJavadoc().isPresent());
-            
-            java.append(String.format(memberFormat, 
+
+            java.append(String.format(memberFormat,
                     FieldDeclarations.asNormalized(fd)));
-            
+
         });
-        
+
         unit.getTypeDeclaration().getAnnotationMemberDeclarations().stream()
         .filter(Javadocs::notExplicitlyHidden)
         .forEach(fd->{
-            
+
             val memberFormat = javaSourceMemberFormat(fd.getJavadoc().isPresent());
-            
-            java.append(String.format(memberFormat, 
+
+            java.append(String.format(memberFormat,
                     AnnotationMemberDeclarations.asNormalized(fd)));
-            
+
         });
-        
+
         unit.getTypeDeclaration().getPublicConstructorDeclarations().stream()
         .filter(Javadocs::notExplicitlyHidden)
         .forEach(cd->{
-            
+
             val memberFormat = javaSourceMemberFormat(cd.getJavadoc().isPresent());
-            
-            java.append(String.format(memberFormat, 
+
+            java.append(String.format(memberFormat,
                     ConstructorDeclarations.asNormalized(cd)));
-            
+
         });
-        
+
         unit.getTypeDeclaration().getPublicMethodDeclarations().stream()
         .filter(Javadocs::notExplicitlyHidden)
         .forEach(md->{
-            
+
             val memberFormat = javaSourceMemberFormat(md.getJavadoc().isPresent());
 
-            java.append(String.format(memberFormat, 
+            java.append(String.format(memberFormat,
                     MethodDeclarations.asNormalized(md)));
-            
+
         });
 
         java.append("}\n");
-        
-        
+
+
         return Optional.of(
-                AsciiDocFactory.SourceFactory.java(java.toString(), "Java Sources"));
-            
+                AsciiDocFactory.SourceFactory.java(java.toString(), unit.getCanonicalName() + ".java"));
+
     }
 
 //XXX java language syntax (for footnote text), but not used any more
-//    
+//
 //    @Override
 //    public String getEnumConstantFormat() {
 //        return "`%s`";
@@ -123,7 +123,7 @@ extends UnitFormatterAbstract {
 //    public String getFieldFormat() {
 //        return "`%s %s`";
 //    }
-//    
+//
 //    @Override
 //    public String getConstructorFormat() {
 //        return "`%s(%s)`";
@@ -149,14 +149,14 @@ extends UnitFormatterAbstract {
         val ul = AsciiDocFactory.footnotes(parent);
         return ul;
     }
-    
+
     // -- HELPER
-    
+
     private String javaSourceMemberFormat(boolean addFootnote) {
         return addFootnote
                 ? "\n  %s // <.>\n"
                 : "\n  %s\n";
     }
-    
+
 
 }
diff --git a/tooling/model4adoc/README.adoc b/tooling/model4adoc/README.adoc
index 32690ea..7af9f71 100644
--- a/tooling/model4adoc/README.adoc
+++ b/tooling/model4adoc/README.adoc
@@ -1,14 +1,14 @@
 = Tooling - Model for AsciiDoc
 :Notice: 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 ag [...]
 
-Allows for programmatic generation of ascii-doc representing document models. 
+Allows for programmatic generation of ascii-doc representing document models.
 
 NOTE: The _AsciiDoc_ name is trademarked by the https://www.eclipse.org/[_Eclipse Foundation_].
-This project is *not* part of the specification effort for _AsciiDoc_ under the 
+This project is *not* part of the specification effort for _AsciiDoc_ under the
 _AsciiDoc Working Group_. See https://projects.eclipse.org/proposals/asciidoc-language[]
-and https://accounts.eclipse.org/mailing-list/asciidoc-wg[]. However, we are happy to 
-help with transfer of source code, if any project (under the umbrella of the 
-_AsciiDoc Working Group_) is willing to take over.   
+and https://accounts.eclipse.org/mailing-list/asciidoc-wg[]. However, we are happy to
+help with transfer of source code, if any project (under the umbrella of the
+_AsciiDoc Working Group_) is willing to take over.
 
 WARNING: This is work-in-progress, no official Maven artifacts are published yet at the time of writing.
 However, snapshots are available with our nightly-builds:
@@ -20,10 +20,10 @@ Say we have a list of employees, which we want to express as ascii-doc table.
 
 [source,java]
 ----
-public static class Employee {  
-    private int id;  
-    private String firstName;  
-    private String sirName;
+public static class Employee {
+    private int id;
+    private String firstName;
+    private String surName;
     ...
 }
 
@@ -33,7 +33,7 @@ List<Employee> employees = List.of(
 );
 ----
 
-Lets generate a _Document_ model programmatically, then print it to _System.out_. 
+Lets generate a _Document_ model programmatically, then print it to _System.out_.
 
 [source,java]
 ----
@@ -58,14 +58,14 @@ Row headRow = headRow(table);
 
 cell(table, headRow, "ID");
 cell(table, headRow, "Firstname");
-cell(table, headRow, "Sirname");
+cell(table, headRow, "Surname");
 
 for(Employee employee : employees) {
-    
+
     Row row = row(table);
     cell(table, row, "" + employee.getId());
     cell(table, row, employee.getFirstName());
-    cell(table, row, employee.getSirName());
+    cell(table, row, employee.getSurName());
 }
 
 System.out.println(AsciiDocWriter.toString(doc));
@@ -83,7 +83,7 @@ A simple block corresponds to a normal paragraph.
 .Employees
 [cols="1m,3,3", options="header"]
 |===
-|ID |Firstname |Sirname 
+|ID |Firstname |Surname
 
 |1
 |Alice
@@ -104,7 +104,7 @@ A simple block corresponds to a normal paragraph.
 .Employees
 [cols="1m,3,3", options="header"]
 |===
-|ID |Firstname |Sirname 
+|ID |Firstname |Surname
 
 |1
 |Alice
@@ -130,4 +130,3 @@ https://github.com/apache-isis-committers/isis-nightly#maven[]
 ----
 
 
- 
\ No newline at end of file
diff --git a/tooling/model4adoc/src/main/java/org/apache/isis/tooling/model4adoc/NodeWriter.java b/tooling/model4adoc/src/main/java/org/apache/isis/tooling/model4adoc/NodeWriter.java
index 750d4e8..730375d 100644
--- a/tooling/model4adoc/src/main/java/org/apache/isis/tooling/model4adoc/NodeWriter.java
+++ b/tooling/model4adoc/src/main/java/org/apache/isis/tooling/model4adoc/NodeWriter.java
@@ -70,7 +70,7 @@ final class NodeWriter implements StructuralNodeVisitor {
                 .ifPresent(attrValue->printfln(":%s: %s", knownAttrKey, attrValue));
             }
         }
-        
+
         return true; // continue visit
     }
 
@@ -117,7 +117,7 @@ final class NodeWriter implements StructuralNodeVisitor {
     @Override
     public boolean blockHead(Block block, int depth) {
 
-        val style = Style.parse(block);        
+        val style = Style.parse(block);
 
         if(style.isOpenBlock()) {
             pushNewWriter(); // write the open block to a StringWriter, such that can handle empty blocks
@@ -129,13 +129,13 @@ final class NodeWriter implements StructuralNodeVisitor {
         } else if(!isContinuation) {
             if(newLineCount<=1) {
                 printNewLine();
-            }    
+            }
         }
 
         if(style.isAdmonition()) {
             if(block.getBlocks().size()>0) {
                 printfln("[%s]", block.getStyle());
-                println("====");    
+                println("====");
                 isContinuation = true; // set continuation flag, so other blocks don't add newlines
             } else {
                 printf("%s: ", block.getStyle());
@@ -162,14 +162,14 @@ final class NodeWriter implements StructuralNodeVisitor {
             bulletCount = bulletCountStack.pop();
         } else if(style.isAdmonition()){
             if(block.getBlocks().size()>0) {
-                println("====");    
+                println("====");
             }
         } else if(style.isListingBlock()) {
             println("----");
         }
     }
 
-    // -_ LIST 
+    // -_ LIST
 
     @Override
     public boolean listHead(org.asciidoctor.ast.List list, int depth) {
@@ -182,7 +182,7 @@ final class NodeWriter implements StructuralNodeVisitor {
 
         _Strings.nonEmpty(list.getTitle())
         .ifPresent(this::printBlockTitle);
-        
+
         return true; // continue visit
     }
 
@@ -195,7 +195,7 @@ final class NodeWriter implements StructuralNodeVisitor {
     public boolean listItemHead(ListItem listItem, int depth) {
 
         val isFootnoteStyle = Style.parse((org.asciidoctor.ast.List)(listItem.getParent()))
-                .isFootnoteList(); 
+                .isFootnoteList();
 
         val bullets = isFootnoteStyle
                 ? "<.>"
@@ -206,19 +206,19 @@ final class NodeWriter implements StructuralNodeVisitor {
             printfln("%s %s", bullets, listItemSource);
             return true; // continue visit
         }
-        
+
         if(_NullSafe.isEmpty(listItem.getBlocks())) {
             printfln("%s _missing listitem text_", bullets);
             return true; // continue visit
         }
-        
+
         //there is a special case, if source is blank
         //the first block replaces the source
-        
+
         //find the first block that has a source, use it and blank it out, so is not written twice
-        
-        val isFixed = _Refs.booleanRef(false); 
-        
+
+        val isFixed = _Refs.booleanRef(false);
+
         StructuralNodeTraversor.depthFirst(new BlockVisitor(block->{
             val blockSource = _Strings.nullToEmpty(block.getSource()).trim();
             if(!blockSource.isEmpty()) {
@@ -229,7 +229,7 @@ final class NodeWriter implements StructuralNodeVisitor {
             }
             return true; // continue the visit
         }), listItem);
-        
+
         if(isFixed.isFalse()) {
             printfln("%s _missing listitem text_", bullets);
         }
@@ -245,7 +245,7 @@ final class NodeWriter implements StructuralNodeVisitor {
 
     //  [cols="3m,2a", options="header"]
     //  |===
-    //  |Name of Column 1 |Name of Column 2 |Name of Column 3 
+    //  |Name of Column 1 |Name of Column 2 |Name of Column 3
     //
     //  |Cell in column 1, row 1
     //  |Cell in column 2, row 1
@@ -269,7 +269,7 @@ final class NodeWriter implements StructuralNodeVisitor {
 
         for(val headRow : table.getHeader()) {
             for(val cell : headRow.getCells()) {
-                printf("|%s ", cell.getSource());    
+                printf("|%s ", cell.getSource());
             }
             printNewLine();
         }
@@ -278,12 +278,12 @@ final class NodeWriter implements StructuralNodeVisitor {
             printNewLine(); // empty line before each row
             for(val cell : row.getCells()) {
                 //bypass newline tracking
-                printfln("|%s", cell.getSource());    
+                printfln("|%s", cell.getSource());
             }
         }
 
         println("|===");
-        
+
         return true; // continue visit
     }
 
@@ -341,15 +341,15 @@ final class NodeWriter implements StructuralNodeVisitor {
 
     private boolean hasWrittenAnythingYet = false;
     private boolean isContinuation = false;
-    private Stack<Integer> bulletCountStack = new Stack<>();
+    private final Stack<Integer> bulletCountStack = new Stack<>();
+
 
-    
     // -- EMPTY CONTINUATION BLOCK HANDLING
 
     private final static int EMPTY_CONTINUATION_BLOCK_SIZE = 8;
-    
-    private Stack<StringWriter> stringWriterStack = new Stack<>();
-    
+
+    private final Stack<StringWriter> stringWriterStack = new Stack<>();
+
     private Writer currentWriter;
     private Writer currentWriter() {
         if(currentWriter == null) {
@@ -370,7 +370,7 @@ final class NodeWriter implements StructuralNodeVisitor {
                 : stringWriterStack.peek();
         val continuationBlockAsString = sw.toString();
         if(continuationBlockAsString.length()>EMPTY_CONTINUATION_BLOCK_SIZE) {
-            writer.append(continuationBlockAsString); // write directly to the current writer, no side-effects wanted    
+            writer.append(continuationBlockAsString); // write directly to the current writer, no side-effects wanted
         }
     }
 
@@ -391,7 +391,7 @@ final class NodeWriter implements StructuralNodeVisitor {
         if(line.contains("\n")) {
             val lineIter = _Text.normalize(_Text.getLines(line)).iterator();
             while(lineIter.hasNext()) {
-                val nextLine = lineIter.next(); 
+                val nextLine = lineIter.next();
                 currentWriter().append(nextLine);
                 if(!nextLine.isEmpty()) {
                     hasWrittenAnythingYet = true;
diff --git a/tooling/projectmodel/src/main/java/org/apache/isis/tooling/projectmodel/ProjectNodeFactory_maven.java b/tooling/projectmodel/src/main/java/org/apache/isis/tooling/projectmodel/ProjectNodeFactory_maven.java
index 07fcda1..7cb98f0 100644
--- a/tooling/projectmodel/src/main/java/org/apache/isis/tooling/projectmodel/ProjectNodeFactory_maven.java
+++ b/tooling/projectmodel/src/main/java/org/apache/isis/tooling/projectmodel/ProjectNodeFactory_maven.java
@@ -45,7 +45,7 @@ class ProjectNodeFactory_maven {
         val rootModel = modelResolver.getRootModel();
         val interpolate = false; //XXX interpolation is experimental
         val projTree = visitMavenProject(null, rootModel, modelResolver, interpolate);
-        
+
         postProcessDependencyLocation(projTree);
         postProcessDependencyVersion(projTree);
         return projTree;
@@ -60,21 +60,21 @@ class ProjectNodeFactory_maven {
         projTree.depthFirst(projModel->{
             localArtifacts.add(projModel.getArtifactCoordinates().toStringWithGroupAndId());
         });
-        
+
         projTree.depthFirst(projModel->{
             projModel.getDependencies().stream()
             .filter(dep->localArtifacts.contains(dep.getArtifactCoordinates().toStringWithGroupAndId()))
             .forEach(localDep->localDep.setLocation(Location.LOCAL));
         });
     }
-    
+
     private static void postProcessDependencyVersion(final @NonNull ProjectNode projTree) {
-        
+
         // first pass: collect external artifacts, that provide a non-empty version
         // second pass: update all external dependencies' versions
         val externalVersionByArtifact = new HashMap<String, String>();
         projTree.depthFirst(projModel->{
-            
+
             projModel.getDependencies().stream()
             .filter(dependency->dependency.getLocation().isExternal())
             .map(Dependency::getArtifactCoordinates)
@@ -84,20 +84,20 @@ class ProjectNodeFactory_maven {
                         coors.toStringWithGroupAndId(),
                         coors.getVersion());
             });
-            
+
         });
 
-        System.out.println("externalVersionbyArtifact " + externalVersionByArtifact);
+        // log.debug("externalVersionbyArtifact {}",  externalVersionByArtifact);
 
     }
-    
+
     private static ProjectNode visitMavenProject(
-            final @Nullable ProjectNode parent, 
-            final @NonNull Model mavenProj, 
+            final @Nullable ProjectNode parent,
+            final @NonNull Model mavenProj,
             final @NonNull SimpleModelResolver modelResolver,
             boolean interpolate) {
-        
-        val interpolatedProj = interpolate 
+
+        val interpolatedProj = interpolate
                 ? MavenModelFactory.interpolateModel(mavenProj, modelResolver)
                 : mavenProj;
         val projNode = toProjectNode(parent, interpolatedProj);
@@ -106,9 +106,9 @@ class ProjectNodeFactory_maven {
         }
         return projNode;
     }
-    
+
     private static ProjectNode toProjectNode(
-            final @Nullable ProjectNode parent, 
+            final @Nullable ProjectNode parent,
             final @NonNull Model mavenProj) {
         val projNode = ProjectNode.builder()
                 .parent(parent)
@@ -117,34 +117,34 @@ class ProjectNodeFactory_maven {
                 .description(_Strings.nullToEmpty(mavenProj.getDescription()))
                 .projectDirectory(mavenProj.getProjectDirectory())
                 .build();
-        
+
         mavenProj.getDependencies()
         .stream()
         .map(ProjectNodeFactory_maven::toDependency)
         .forEach(projNode.getDependencies()::add);
-        
+
         if(parent!=null) {
             parent.getChildren().add(projNode);
         }
 
         return projNode;
     }
-    
+
     private static Dependency toDependency(final @NonNull org.apache.maven.model.Dependency dependency) {
         val artifactCoordinates = ArtifactCoordinates.of(
-                dependency.getGroupId(), 
+                dependency.getGroupId(),
                 dependency.getArtifactId(),
                 dependency.getType(),
                 Optional.ofNullable(dependency.getVersion()).orElse(ArtifactCoordinates.MANAGED_VERSION) //TODO to resolve this requires interpolation
                 );
-        
+
         return Dependency.builder()
                 .artifactCoordinates(artifactCoordinates)
                 .location(Location.EXTERNAL) // just priming here to be overwritten in post-processing if required
                 .shortName(ArtifactShortNameFactory.toShortName(artifactCoordinates))
                 .build();
     }
-    
+
     static ArtifactCoordinates artifactCoordinatesOf(final @NonNull Model mavenProj) {
         val groupId = MavenModelFactory.getGroupId(mavenProj);
         val artifactId = mavenProj.getArtifactId();
@@ -152,11 +152,11 @@ class ProjectNodeFactory_maven {
         val version = MavenModelFactory.getVersion(mavenProj);
         return ArtifactCoordinates.of(groupId, artifactId, type, version);
     }
-    
+
     private static Iterable<Model> childrenOf(
-            final @NonNull Model mavenProj, 
+            final @NonNull Model mavenProj,
             final @NonNull SimpleModelResolver modelResolver) {
-        
+
         return Stream.<String>concat(
                 mavenProj.getProfiles().stream().flatMap(profile->profile.getModules().stream()),
                 mavenProj.getModules().stream())
@@ -165,8 +165,8 @@ class ProjectNodeFactory_maven {
         .filter(Objects::nonNull)
         .collect(Collectors.toList());
     }
-    
-    
 
-    
+
+
+
 }