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/10 10:37:00 UTC

[isis] branch master updated: ISIS-2426: tooling: populate ProjectNode with artifact description and dependencies

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 6a5284e  ISIS-2426: tooling: populate ProjectNode with artifact description and dependencies
6a5284e is described below

commit 6a5284e872b88eb5d3b454a04cba1e9892ecc7e1
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Sep 10 12:36:41 2020 +0200

    ISIS-2426: tooling: populate ProjectNode with artifact description and
    dependencies
---
 .../org/apache/isis/tooling/_infra/_Strings.java   | 42 +++++++++++++++++-----
 .../isis/tooling/model4adoc/AsciiDocWriter.java    |  2 +-
 .../tooling/adocmodel/test/AsciiDocWriterTest.java |  2 +-
 .../isis/tooling/projectmodel/ArtifactKey.java     | 13 ++++---
 .../{ProjectNode.java => Dependency.java}          | 27 +++++++-------
 .../isis/tooling/projectmodel/ProjectNode.java     |  3 ++
 .../tooling/projectmodel/ProjectNodeFactory.java   | 33 +++++++++++++----
 7 files changed, 85 insertions(+), 37 deletions(-)

diff --git a/tooling/commons/src/main/java/org/apache/isis/tooling/_infra/_Strings.java b/tooling/commons/src/main/java/org/apache/isis/tooling/_infra/_Strings.java
index 7989b74..ce5e596 100644
--- a/tooling/commons/src/main/java/org/apache/isis/tooling/_infra/_Strings.java
+++ b/tooling/commons/src/main/java/org/apache/isis/tooling/_infra/_Strings.java
@@ -7,8 +7,39 @@ import java.util.Scanner;
 import javax.annotation.Nullable;
 
 public final class _Strings {
+    
+    /**
+     * @return whether {@code x} is of zero length or null.
+     */
+    public static boolean isNullOrEmpty(final @Nullable CharSequence x){
+        return x==null || x.length()==0;
+    }
+    
+    /**
+     * @param input
+     * @return null if the {@code input} is null or empty, the {@code input} otherwise 
+     */
+    public static @Nullable String emptyToNull(final @Nullable String input) {
+        if(isNullOrEmpty(input)) {
+            return null;
+        }
+        return input;
+    }
 
-    public static String read(final InputStream input) {
+    /**
+     * @param input
+     * @return the empty string if the {@code input} is null, the {@code input} otherwise 
+     */
+    public static String nullToEmpty(final @Nullable String input) {
+        if(input==null) {
+            return "";
+        }
+        return input;
+    }
+    
+    // -- RESOURCE LOADING
+
+    public static String read(final @Nullable InputStream input) {
         if(input==null) {
             return "";
         }
@@ -27,13 +58,6 @@ public final class _Strings {
         return readResource(location.getClass(), name);  
     }
     
-    /**
-     * Same as {@link #isEmpty(CharSequence)}
-     * @param x
-     * @return true only if string is of zero length or null.
-     */
-    public static boolean isNullOrEmpty(@Nullable final CharSequence x){
-        return x==null || x.length()==0;
-    }
+
     
 }
diff --git a/tooling/model4adoc/src/main/java/org/apache/isis/tooling/model4adoc/AsciiDocWriter.java b/tooling/model4adoc/src/main/java/org/apache/isis/tooling/model4adoc/AsciiDocWriter.java
index 5188cc7..e31ed79 100644
--- a/tooling/model4adoc/src/main/java/org/apache/isis/tooling/model4adoc/AsciiDocWriter.java
+++ b/tooling/model4adoc/src/main/java/org/apache/isis/tooling/model4adoc/AsciiDocWriter.java
@@ -76,7 +76,7 @@ public class AsciiDocWriter {
         
         val formatWriter = new FormatWriter(writer);
         
-        formatWriter.ifNonEmpty("= %s\n", doc.getTitle());
+        formatWriter.ifNonEmpty("= %s\n\n", doc.getTitle());
         
         for(val block : doc.getBlocks()) {
             if(block instanceof Table) {
diff --git a/tooling/model4adoc/src/test/java/org/apache/isis/tooling/adocmodel/test/AsciiDocWriterTest.java b/tooling/model4adoc/src/test/java/org/apache/isis/tooling/adocmodel/test/AsciiDocWriterTest.java
index 8a0749f..279f0a6 100644
--- a/tooling/model4adoc/src/test/java/org/apache/isis/tooling/adocmodel/test/AsciiDocWriterTest.java
+++ b/tooling/model4adoc/src/test/java/org/apache/isis/tooling/adocmodel/test/AsciiDocWriterTest.java
@@ -57,7 +57,7 @@ class AsciiDocWriterTest {
         doc.setTitle("Hello World");
         
         String actualAdoc = AsciiDocWriter.toString(doc); 
-        String expectedAdoc = "= Hello World\n";
+        String expectedAdoc = "= Hello World\n\n";
         
         System.out.println(actualAdoc);
         
diff --git a/tooling/project-model/src/main/java/org/apache/isis/tooling/projectmodel/ArtifactKey.java b/tooling/project-model/src/main/java/org/apache/isis/tooling/projectmodel/ArtifactKey.java
index f005357..33d5805 100644
--- a/tooling/project-model/src/main/java/org/apache/isis/tooling/projectmodel/ArtifactKey.java
+++ b/tooling/project-model/src/main/java/org/apache/isis/tooling/projectmodel/ArtifactKey.java
@@ -27,23 +27,26 @@ import lombok.NonNull;
 import lombok.Value;
 
 @Value(staticConstructor = "of")
-public class ArtifactKey implements Comparator<ArtifactKey> {
+public class ArtifactKey implements Comparable<ArtifactKey> {
 
     @NonNull private final String groupId;
     @NonNull private final String artifactId;
+    @NonNull private final String type;
     @NonNull private final String version;
     
     private final AtomicReference<ComparableVersion> comparableVersion = new AtomicReference<ComparableVersion>();
     
     @Override
     public String toString() {
-        return String.format("%s:%s:%s", groupId, artifactId, version); 
+        return String.format("%s:%s:%s:%s", groupId, artifactId, type, version); 
     }
 
     // -- COMPARATOR
     
     private final static Comparator<ArtifactKey> comparator = Comparator
             .comparing(ArtifactKey::getGroupId)
+            .thenComparing(ArtifactKey::getArtifactId)
+            .thenComparing(ArtifactKey::getType)
             .thenComparing(ArtifactKey::getComparableVersion);
     
     private ComparableVersion getComparableVersion() {
@@ -52,10 +55,10 @@ public class ArtifactKey implements Comparator<ArtifactKey> {
         }
         return comparableVersion.get();
     }
-    
+
     @Override
-    public int compare(ArtifactKey o1, ArtifactKey o2) {
-        return comparator.compare(o1, o2);
+    public int compareTo(ArtifactKey o) {
+        return comparator.compare(this, o);
     }
     
 }
diff --git a/tooling/project-model/src/main/java/org/apache/isis/tooling/projectmodel/ProjectNode.java b/tooling/project-model/src/main/java/org/apache/isis/tooling/projectmodel/Dependency.java
similarity index 63%
copy from tooling/project-model/src/main/java/org/apache/isis/tooling/projectmodel/ProjectNode.java
copy to tooling/project-model/src/main/java/org/apache/isis/tooling/projectmodel/Dependency.java
index ff68946..9c57962 100644
--- a/tooling/project-model/src/main/java/org/apache/isis/tooling/projectmodel/ProjectNode.java
+++ b/tooling/project-model/src/main/java/org/apache/isis/tooling/projectmodel/Dependency.java
@@ -18,29 +18,26 @@
  */
 package org.apache.isis.tooling.projectmodel;
 
-import java.util.TreeSet;
+import java.util.Comparator;
 
 import lombok.Builder;
 import lombok.Data;
-import lombok.ToString;
-import lombok.val;
 
 @Data @Builder
-public class ProjectNode {
-
-    @ToString.Exclude private final ProjectNode parent;
-    @ToString.Exclude private final TreeSet<ProjectNode> children = new TreeSet<ProjectNode>(
-            (a,b)->a.getName().compareTo(b.getName()));
+public class Dependency implements Comparable<Dependency> {
     
     private final ArtifactKey artifactKey;
-    private final String name;
-    private final String description;
     
-    public void depthFirst(ProjectVisitor projectVisitor) {
-        projectVisitor.accept(this);
-        for(val child : getChildren()){
-            child.depthFirst(projectVisitor);
-        }
+    // -- COMPARATOR
+    
+    private final static Comparator<Dependency> comparator = Comparator
+            .comparing(Dependency::getArtifactKey);
+    
+
+    @Override
+    public int compareTo(Dependency o) {
+        return comparator.compare(this, o);
     }
+   
 
 }
diff --git a/tooling/project-model/src/main/java/org/apache/isis/tooling/projectmodel/ProjectNode.java b/tooling/project-model/src/main/java/org/apache/isis/tooling/projectmodel/ProjectNode.java
index ff68946..d361d84 100644
--- a/tooling/project-model/src/main/java/org/apache/isis/tooling/projectmodel/ProjectNode.java
+++ b/tooling/project-model/src/main/java/org/apache/isis/tooling/projectmodel/ProjectNode.java
@@ -31,6 +31,7 @@ public class ProjectNode {
     @ToString.Exclude private final ProjectNode parent;
     @ToString.Exclude private final TreeSet<ProjectNode> children = new TreeSet<ProjectNode>(
             (a,b)->a.getName().compareTo(b.getName()));
+    @ToString.Exclude private final TreeSet<Dependency> dependencies = new TreeSet<Dependency>();
     
     private final ArtifactKey artifactKey;
     private final String name;
@@ -43,4 +44,6 @@ public class ProjectNode {
         }
     }
 
+   
+    
 }
diff --git a/tooling/project-model/src/main/java/org/apache/isis/tooling/projectmodel/ProjectNodeFactory.java b/tooling/project-model/src/main/java/org/apache/isis/tooling/projectmodel/ProjectNodeFactory.java
index 61667d0..df86856 100644
--- a/tooling/project-model/src/main/java/org/apache/isis/tooling/projectmodel/ProjectNodeFactory.java
+++ b/tooling/project-model/src/main/java/org/apache/isis/tooling/projectmodel/ProjectNodeFactory.java
@@ -20,6 +20,7 @@ package org.apache.isis.tooling.projectmodel;
 
 import java.io.File;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -29,6 +30,7 @@ import org.apache.maven.model.Model;
 import org.gradle.tooling.GradleConnector;
 import org.gradle.tooling.model.GradleProject;
 
+import org.apache.isis.tooling._infra._Strings;
 import org.apache.isis.tooling.projectmodel.maven.MavenModelFactory;
 import org.apache.isis.tooling.projectmodel.maven.SimpleModelResolver;
 
@@ -78,22 +80,39 @@ public class ProjectNodeFactory {
         val projNode = ProjectNode.builder()
                 .parent(parent)
                 .artifactKey(artifactKeyOf(mavenProj))
-                .name(mavenProj.getName())
+                .name(_Strings.nullToEmpty(mavenProj.getName()))
+                .description(_Strings.nullToEmpty(mavenProj.getDescription()))
                 .build();
-
+        
+        mavenProj.getDependencies()
+        .stream()
+        .map(ProjectNodeFactory::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) {
+        return Dependency.builder()
+                .artifactKey(ArtifactKey.of(
+                        dependency.getGroupId(), 
+                        dependency.getArtifactId(),
+                        dependency.getType(),
+                        Optional.ofNullable(dependency.getVersion()).orElse("<managed>") //TODO to resolve this requires interpolation
+                        ))
+                .build();
     }
     
     private static ArtifactKey artifactKeyOf(final @NonNull Model mavenProj) {
         val groupId = MavenModelFactory.getGroupId(mavenProj);
         val artifactId = mavenProj.getArtifactId();
+        val type = mavenProj.getPackaging();
         val version = MavenModelFactory.getVersion(mavenProj);
-        return ArtifactKey.of(groupId, artifactId, version);
+        return ArtifactKey.of(groupId, artifactId, type, version);
     }
     
     private static Iterable<Model> childrenOf(
@@ -129,7 +148,8 @@ public class ProjectNodeFactory {
         val projNode = ProjectNode.builder()
                 .parent(parent)
                 .artifactKey(artifactKeyOf(gradleProj))
-                .name(gradleProj.getName())
+                .name(_Strings.nullToEmpty(gradleProj.getName()))
+                .description(_Strings.nullToEmpty(gradleProj.getDescription()))
                 .build();
         if(parent!=null) {
             parent.getChildren().add(projNode);
@@ -148,8 +168,9 @@ public class ProjectNodeFactory {
         log.warn("cannot find pom.xml for project {} at {}", gradleProj.getName(), pomFile.getAbsolutePath());
         val groupId = "?";
         val artifactId = gradleProj.getName();
+        val type = "?";
         val version = "?";
-        return ArtifactKey.of(groupId, artifactId, version);
+        return ArtifactKey.of(groupId, artifactId, type, version);
     }
 
 }