display more info for DigestItem

Signed-off-by: Olivier Lamy <olamy@apache.org>
diff --git a/src/main/java/org/apache/maven/buildcache/checksum/DigestUtils.java b/src/main/java/org/apache/maven/buildcache/checksum/DigestUtils.java
index da0f3f2..d890312 100644
--- a/src/main/java/org/apache/maven/buildcache/checksum/DigestUtils.java
+++ b/src/main/java/org/apache/maven/buildcache/checksum/DigestUtils.java
@@ -49,14 +49,15 @@ public class DigestUtils {
     private static final ThreadLocal<UniversalDetector> ENCODING_DETECTOR =
             ThreadLocal.withInitial(() -> new UniversalDetector(null));
 
-    public static DigestItem pom(HashChecksum checksum, String effectivePom) {
-        return item("pom", effectivePom, checksum.update(effectivePom.getBytes(UTF_8)));
+    public static DigestItem pom(HashChecksum checksum, String effectivePom, String info) {
+        return item("pom", effectivePom, checksum.update(effectivePom.getBytes(UTF_8)), info);
     }
 
     public static DigestItem file(HashChecksum checksum, Path basedir, Path file) throws IOException {
         byte[] content = Files.readAllBytes(file);
         String normalized = normalize(basedir, file);
-        DigestItem item = item("file", normalized, checksum.update(content));
+        DigestItem item = item(
+                "file", normalized, checksum.update(content), file.getFileName().toString());
         try {
             populateContentDetails(file, content, item);
         } catch (IOException ignore) {
@@ -122,8 +123,8 @@ private static boolean isBinary(String contentType) {
                         "application/pdf");
     }
 
-    public static DigestItem dependency(HashChecksum checksum, String key, String hash) {
-        return item("dependency", key, checksum.update(hash));
+    public static DigestItem dependency(HashChecksum checksum, String key, String hash, String info) {
+        return item("dependency", key, checksum.update(hash), info);
     }
 
     private static String normalize(Path basedirPath, Path file) {
@@ -138,11 +139,12 @@ private static Path relativize(Path basedirPath, Path file) {
         }
     }
 
-    private static DigestItem item(String type, String reference, String hash) {
+    private static DigestItem item(String type, String reference, String hash, String info) {
         final DigestItem item = new DigestItem();
         item.setType(type);
         item.setValue(reference);
         item.setHash(hash);
+        item.setInfo(info);
         return item;
     }
 
diff --git a/src/main/java/org/apache/maven/buildcache/checksum/MavenProjectInput.java b/src/main/java/org/apache/maven/buildcache/checksum/MavenProjectInput.java
index 4f812c4..f5ceeeb 100644
--- a/src/main/java/org/apache/maven/buildcache/checksum/MavenProjectInput.java
+++ b/src/main/java/org/apache/maven/buildcache/checksum/MavenProjectInput.java
@@ -31,20 +31,7 @@
 import java.nio.file.Paths;
 import java.nio.file.SimpleFileVisitor;
 import java.nio.file.attribute.BasicFileAttributes;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Properties;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.SortedSet;
-import java.util.TreeMap;
-import java.util.TreeSet;
+import java.util.*;
 import java.util.function.Predicate;
 
 import org.apache.commons.lang3.StringUtils;
@@ -209,7 +196,7 @@ public ProjectsInputInfo calculateChecksum() throws IOException {
 
         final String effectivePom = getEffectivePom(normalizedModelProvider.normalizedModel(project));
         final SortedSet<Path> inputFiles = isPom(project) ? Collections.emptySortedSet() : getInputFiles();
-        final SortedMap<String, String> dependenciesChecksum = getMutableDependencies();
+        final SortedMap<String, DependencyInfo> dependenciesChecksum = getMutableDependencies();
 
         final long t1 = System.currentTimeMillis();
 
@@ -224,7 +211,10 @@ public ProjectsInputInfo calculateChecksum() throws IOException {
                     remoteCache.findBaselineBuild(project).map(b -> b.getDto().getProjectsInputInfo());
         }
 
-        DigestItem effectivePomChecksum = DigestUtils.pom(checksum, effectivePom);
+        DigestItem effectivePomChecksum = DigestUtils.pom(
+                checksum,
+                effectivePom,
+                project.getGroupId() + ":" + project.getArtifactId() + ":" + project.getVersion());
         items.add(effectivePomChecksum);
         final boolean compareWithBaseline = config.isBaselineDiffEnabled() && baselineHolder.isPresent();
         if (compareWithBaseline) {
@@ -244,8 +234,9 @@ public ProjectsInputInfo calculateChecksum() throws IOException {
         }
 
         boolean dependenciesMatched = true;
-        for (Map.Entry<String, String> entry : dependenciesChecksum.entrySet()) {
-            DigestItem dependencyDigest = DigestUtils.dependency(checksum, entry.getKey(), entry.getValue());
+        for (Map.Entry<String, DependencyInfo> entry : dependenciesChecksum.entrySet()) {
+            DigestItem dependencyDigest =
+                    DigestUtils.dependency(checksum, entry.getKey(), entry.getValue().hash, entry.getValue().info);
             items.add(dependencyDigest);
             if (compareWithBaseline) {
                 dependenciesMatched &= checkItemMatchesBaseline(baselineHolder.get(), dependencyDigest);
@@ -262,9 +253,17 @@ public ProjectsInputInfo calculateChecksum() throws IOException {
 
         final long t2 = System.currentTimeMillis();
 
-        for (DigestItem item : projectsInputInfoType.getItems()) {
-            LOGGER.debug("Hash calculated, item: {}, hash: {}", item.getType(), item.getHash());
+        if (LOGGER.isDebugEnabled()) {
+            projectsInputInfoType.getItems().sort(INSTANCE);
+            for (DigestItem item : projectsInputInfoType.getItems()) {
+                LOGGER.debug(
+                        "Hash calculated, item type: {}, info: {}, hash: {}",
+                        item.getType(),
+                        item.getInfo(),
+                        item.getHash());
+            }
         }
+
         LOGGER.info(
                 "Project inputs calculated in {} ms. {} checksum [{}] calculated in {} ms.",
                 t1 - t0,
@@ -274,6 +273,26 @@ public ProjectsInputInfo calculateChecksum() throws IOException {
         return projectsInputInfoType;
     }
 
+    private static final DigestItemInfoComparator INSTANCE = new DigestItemInfoComparator();
+
+    private static class DigestItemInfoComparator implements Comparator<DigestItem> {
+        @Override
+        public int compare(DigestItem o1, DigestItem o2) {
+            String s1 = o1.getInfo();
+            String s2 = o2.getInfo();
+            if (s1 == null && s2 == null) {
+                return 0;
+            }
+            if (s1 == null) {
+                return -1;
+            }
+            if (s2 == null) {
+                return 1;
+            }
+            return s1.compareTo(s2);
+        }
+    }
+
     private void checkEffectivePomMatch(ProjectsInputInfo baselineBuild, DigestItem effectivePomChecksum) {
         Optional<DigestItem> pomHolder = Optional.empty();
         for (DigestItem it : baselineBuild.getItems()) {
@@ -401,7 +420,7 @@ private SortedSet<Path> getInputFiles() {
         }
 
         LOGGER.info(
-                "Found {} input files. Project dir processing: {}, plugins: {} millis",
+                "Found {} input files. Project dir processing: {} ms, plugins: {} millis",
                 sorted.size(),
                 walkKnownPathsFinished,
                 pluginsFinished);
@@ -642,8 +661,18 @@ private boolean isFilteredOutSubpath(Path path) {
         return false;
     }
 
-    private SortedMap<String, String> getMutableDependencies() throws IOException {
-        SortedMap<String, String> result = new TreeMap<>();
+    private static class DependencyInfo {
+        private final String hash;
+        private final String info;
+
+        DependencyInfo(String hash, String info) {
+            this.hash = hash;
+            this.info = info;
+        }
+    }
+
+    private SortedMap<String, DependencyInfo> getMutableDependencies() throws IOException {
+        SortedMap<String, DependencyInfo> result = new TreeMap<>();
 
         for (Dependency dependency : project.getDependencies()) {
 
@@ -675,7 +704,8 @@ private SortedMap<String, String> getMutableDependencies() throws IOException {
                 projectHash = resolved.getHash();
             }
             result.put(
-                    KeyUtils.getVersionlessArtifactKey(repoSystem.createDependencyArtifact(dependency)), projectHash);
+                    KeyUtils.getVersionlessArtifactKey(repoSystem.createDependencyArtifact(dependency)),
+                    new DependencyInfo(projectHash, dependency.toString()));
         }
         return result;
     }
diff --git a/src/main/java/org/apache/maven/buildcache/xml/DtoUtils.java b/src/main/java/org/apache/maven/buildcache/xml/DtoUtils.java
index 7f17f80..dec449b 100644
--- a/src/main/java/org/apache/maven/buildcache/xml/DtoUtils.java
+++ b/src/main/java/org/apache/maven/buildcache/xml/DtoUtils.java
@@ -74,6 +74,7 @@ public static DigestItem createdDigestedByProjectChecksum(Artifact artifact, Str
         dit.setHash(projectChecksum);
         dit.setFileChecksum(artifact.getFileHash());
         dit.setValue(getArtifactKey(artifact));
+        dit.setInfo(artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + artifact.getVersion());
         return dit;
     }
 
@@ -83,6 +84,7 @@ public static DigestItem createDigestedFile(org.apache.maven.artifact.Artifact a
         dit.setHash(fileHash);
         dit.setFileChecksum(fileHash);
         dit.setValue(getArtifactKey(artifact));
+        dit.setInfo(artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + artifact.getVersion());
         return dit;
     }
 
diff --git a/src/main/mdo/build-cache-build.mdo b/src/main/mdo/build-cache-build.mdo
index c9febc2..b4e45d1 100644
--- a/src/main/mdo/build-cache-build.mdo
+++ b/src/main/mdo/build-cache-build.mdo
@@ -379,6 +379,10 @@
           <name>eol</name>
           <type>String</type>
         </field>
+        <field xml.attribute="true">
+          <name>info</name>
+          <type>String</type>
+        </field>
       </fields>
     </class>