1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  package org.apache.maven.internal.impl;
20  
21  import java.util.ArrayList;
22  import java.util.List;
23  import java.util.Objects;
24  import java.util.Optional;
25  import org.apache.maven.api.Dependency;
26  import org.apache.maven.api.Node;
27  import org.apache.maven.api.RemoteRepository;
28  import org.apache.maven.api.annotations.Nonnull;
29  import org.eclipse.aether.graph.DependencyNode;
30  import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
31  import org.eclipse.aether.util.graph.transformer.ConflictResolver;
32  
33  public class DefaultNode extends AbstractNode {
34  
35      protected final @Nonnull AbstractSession session;
36      protected final @Nonnull org.eclipse.aether.graph.DependencyNode node;
37      protected final boolean verbose;
38  
39      public DefaultNode(
40              @Nonnull AbstractSession session, @Nonnull org.eclipse.aether.graph.DependencyNode node, boolean verbose) {
41          this.session = session;
42          this.node = node;
43          this.verbose = verbose;
44      }
45  
46      @Override
47      DependencyNode getDependencyNode() {
48          return node;
49      }
50  
51      @Override
52      public Dependency getDependency() {
53          return node.getDependency() != null ? session.getDependency(node.getDependency()) : null;
54      }
55  
56      @Override
57      public List<Node> getChildren() {
58          return new MappedList<>(node.getChildren(), n -> session.getNode(n, verbose));
59      }
60  
61      @Override
62      public List<RemoteRepository> getRemoteRepositories() {
63          return new MappedList<>(node.getRepositories(), session::getRemoteRepository);
64      }
65  
66      @Override
67      public Optional<RemoteRepository> getRepository() {
68          
69          throw new UnsupportedOperationException("Not implemented yet");
70      }
71  
72      @Override
73      public String asString() {
74          String nodeString = super.asString();
75  
76          if (!verbose) {
77              return nodeString;
78          }
79  
80          org.eclipse.aether.graph.DependencyNode node = getDependencyNode();
81  
82          List<String> details = new ArrayList<>();
83  
84          org.eclipse.aether.graph.DependencyNode winner =
85                  (org.eclipse.aether.graph.DependencyNode) node.getData().get(ConflictResolver.NODE_DATA_WINNER);
86          String winnerVersion = winner != null ? winner.getArtifact().getBaseVersion() : null;
87          boolean included = (winnerVersion == null);
88  
89          String preManagedVersion = DependencyManagerUtils.getPremanagedVersion(node);
90          if (preManagedVersion != null) {
91              details.add("version managed from " + preManagedVersion);
92          }
93  
94          String preManagedScope = DependencyManagerUtils.getPremanagedScope(node);
95          if (preManagedScope != null) {
96              details.add("scope managed from " + preManagedScope);
97          }
98  
99          String originalScope = (String) node.getData().get(ConflictResolver.NODE_DATA_ORIGINAL_SCOPE);
100         if (originalScope != null && !originalScope.equals(node.getDependency().getScope())) {
101             details.add("scope updated from " + originalScope);
102         }
103 
104         if (!included) {
105             if (Objects.equals(winnerVersion, node.getArtifact().getVersion())) {
106                 details.add("omitted for duplicate");
107             } else {
108                 details.add("omitted for conflict with " + winnerVersion);
109             }
110         }
111 
112         StringBuilder buffer = new StringBuilder();
113         if (included) {
114             buffer.append(nodeString);
115             if (!details.isEmpty()) {
116                 buffer.append(" (");
117                 join(buffer, details, "; ");
118                 buffer.append(")");
119             }
120         } else {
121             buffer.append("(");
122             buffer.append(nodeString);
123             if (!details.isEmpty()) {
124                 buffer.append(" - ");
125                 join(buffer, details, "; ");
126             }
127             buffer.append(")");
128         }
129         return buffer.toString();
130     }
131 
132     private static void join(StringBuilder buffer, List<String> details, String separator) {
133         boolean first = true;
134         for (String detail : details) {
135             if (first) {
136                 first = false;
137             } else {
138                 buffer.append(separator);
139             }
140             buffer.append(detail);
141         }
142     }
143 }