View Javadoc
1   /*
2    * (C) Copyright 2006-2015 Nuxeo SA (http://nuxeo.com/) and contributors.
3    *
4    * All rights reserved. This program and the accompanying materials
5    * are made available under the terms of the GNU Lesser General Public License
6    * (LGPL) version 2.1 which accompanies this distribution, and is available at
7    * http://www.gnu.org/licenses/lgpl-2.1.html
8    *
9    * This library is distributed in the hope that it will be useful,
10   * but WITHOUT ANY WARRANTY; without even the implied warranty of
11   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12   * Lesser General Public License for more details.
13   *
14   * Contributors:
15   *     bstefanescu, jcarsique, slacoin
16   */
17  package org.nuxeo.build.maven.graph;
18  
19  import java.io.File;
20  import java.util.ArrayList;
21  import java.util.Collection;
22  import java.util.List;
23  import java.util.Map;
24  
25  import org.apache.maven.RepositoryUtils;
26  import org.apache.maven.artifact.Artifact;
27  import org.apache.tools.ant.Project;
28  import org.eclipse.aether.graph.DefaultDependencyNode;
29  import org.eclipse.aether.graph.Dependency;
30  import org.eclipse.aether.graph.DependencyNode;
31  import org.eclipse.aether.graph.DependencyVisitor;
32  import org.eclipse.aether.repository.RemoteRepository;
33  import org.eclipse.aether.resolution.ArtifactResolutionException;
34  import org.eclipse.aether.version.Version;
35  import org.eclipse.aether.version.VersionConstraint;
36  
37  import org.nuxeo.build.ant.AntClient;
38  
39  /**
40   * TODO NXBT-258
41   */
42  public class Node implements DependencyNode {
43  
44      protected final Graph graph;
45  
46      protected final String id;
47  
48      @Deprecated
49      private List<char[]> acceptedCategories;
50  
51      private List<DependencyNode> parents = new ArrayList<>();
52  
53      protected DependencyNode dependencyNode;
54  
55      /**
56       * @deprecated since 2.0
57       */
58      @Deprecated
59      public List<char[]> getAcceptedCategories() {
60          if (acceptedCategories == null) {
61              acceptedCategories = new ArrayList<>();
62          }
63          return acceptedCategories;
64      }
65  
66      public static String genNodeId(Artifact artifact) {
67          return genNodeId(RepositoryUtils.toDependency(artifact, null));
68      }
69  
70      public static String genNodeId(Dependency dependency) {
71          org.eclipse.aether.artifact.Artifact artifact = dependency.getArtifact();
72          String scope = dependency.getScope();
73          return genNodeId(artifact, scope);
74      }
75  
76      public static String genNodeId(org.eclipse.aether.artifact.Artifact artifact, String scope) {
77          StringBuilder sb = new StringBuilder();
78          sb.append(artifact.getGroupId());
79          sb.append(':').append(artifact.getArtifactId());
80          sb.append(':').append(artifact.getBaseVersion());
81          sb.append(':').append(artifact.getExtension());
82          sb.append(':');
83          if (artifact.getClassifier() != null) {
84              sb.append(artifact.getClassifier());
85          }
86          sb.append(':').append(scope);
87          return sb.toString();
88      }
89  
90      /**
91       * @since 2.0.4
92       */
93      public static String genNodeId(DependencyNode node) {
94          Dependency dependency = node.getDependency();
95          if (dependency != null) {
96              return genNodeId(dependency);
97          } else {
98              return genNodeId(node.getArtifact(), "");
99          }
100     }
101 
102     public Node(Node node) {
103         dependencyNode = node.dependencyNode;
104         id = node.id;
105         graph = node.graph;
106         acceptedCategories = node.acceptedCategories;
107         parents = node.parents;
108     }
109 
110     /**
111      * @since 2.0
112      */
113     public Node(Graph graph, DependencyNode dependencyNode) {
114         this.graph = graph;
115         this.dependencyNode = dependencyNode;
116         id = genNodeId(dependencyNode);
117     }
118 
119     public Artifact getMavenArtifact() {
120         return DependencyUtils.toMavenArtifact(getDependency());
121     }
122 
123     public File getFile() {
124         File file = getArtifact().getFile();
125         if (file == null) {
126             try {
127                 file = DependencyUtils.resolve(getArtifact()).getFile();
128             } catch (ArtifactResolutionException e) {
129                 AntClient.getInstance().log(e.getMessage(), e, Project.MSG_ERR);
130                 return null;
131             }
132         }
133         return file;
134     }
135 
136     public String getId() {
137         return id;
138     }
139 
140     @Override
141     public boolean equals(Object obj) {
142         if (obj == this) {
143             return true;
144         }
145         if (obj instanceof Node) {
146             return ((Node) obj).id.equals(this);
147         }
148         if (obj instanceof DependencyNode) {
149             return ((DependencyNode) obj).equals(dependencyNode);
150         }
151         return false;
152     }
153 
154     @Override
155     public int hashCode() {
156         return id.hashCode();
157     }
158 
159     @Override
160     public String toString() {
161         return dependencyNode.toString();
162         // return getArtifact().toString();
163     }
164 
165     /**
166      * @param pattern
167      * @deprecated since 2.0
168      */
169     @Deprecated
170     public void setAcceptedCategory(char[] pattern) {
171         getAcceptedCategories().add(pattern);
172     }
173 
174     /**
175      * @param patterns
176      * @return true if at least one pattern has been accepted
177      * @deprecated since 2.0
178      */
179     @Deprecated
180     public boolean isAcceptedCategory(List<char[]> patterns) {
181         for (char[] pattern : patterns) {
182             if (getAcceptedCategories().contains(pattern)) {
183                 return true;
184             }
185         }
186         return false;
187     }
188 
189     @Override
190     public List<DependencyNode> getChildren() {
191         return dependencyNode.getChildren();
192     }
193 
194     @Override
195     public Dependency getDependency() {
196         return dependencyNode.getDependency();
197     }
198 
199     @Override
200     public void setArtifact(org.eclipse.aether.artifact.Artifact artifact) {
201         dependencyNode.setArtifact(artifact);
202 
203     }
204 
205     @Override
206     public List<? extends org.eclipse.aether.artifact.Artifact> getRelocations() {
207         return dependencyNode.getRelocations();
208     }
209 
210     @Override
211     public Collection<? extends org.eclipse.aether.artifact.Artifact> getAliases() {
212         return dependencyNode.getAliases();
213     }
214 
215     @Override
216     public VersionConstraint getVersionConstraint() {
217         return dependencyNode.getVersionConstraint();
218     }
219 
220     @Override
221     public Version getVersion() {
222         return dependencyNode.getVersion();
223     }
224 
225     @Override
226     public void setScope(String scope) {
227         dependencyNode.setScope(scope);
228     }
229 
230     @Override
231     public List<RemoteRepository> getRepositories() {
232         return dependencyNode.getRepositories();
233     }
234 
235     @Override
236     public String getRequestContext() {
237         return dependencyNode.getRequestContext();
238     }
239 
240     @Override
241     public void setRequestContext(String context) {
242         dependencyNode.setRequestContext(context);
243     }
244 
245     @Override
246     public Map<?, ?> getData() {
247         return dependencyNode.getData();
248     }
249 
250     @Override
251     public void setData(Object key, Object value) {
252         dependencyNode.setData(key, value);
253     }
254 
255     @Override
256     public boolean accept(DependencyVisitor visitor) {
257         return dependencyNode.accept(visitor);
258     }
259 
260     @Deprecated
261     public List<DependencyNode> getParents() {
262         return parents;
263     }
264 
265     /**
266      * @since 2.0
267      */
268     public void addParent(Node node) {
269         parents.add(node);
270     }
271 
272     @Override
273     public void setChildren(List<DependencyNode> children) {
274         dependencyNode.setChildren(children);
275     }
276 
277     @Override
278     public void setOptional(Boolean optional) {
279         dependencyNode.setOptional(optional);
280     }
281 
282     @Override
283     public int getManagedBits() {
284         return dependencyNode.getManagedBits();
285     }
286 
287     @Override
288     public void setData(Map<Object, Object> data) {
289         dependencyNode.setData(data);
290     }
291 
292     @Override
293     public org.eclipse.aether.artifact.Artifact getArtifact() {
294         return dependencyNode.getArtifact();
295     }
296 
297     /**
298      * @since 2.0.1
299      */
300     public void setManagedBits(int managedBits) {
301         ((DefaultDependencyNode) dependencyNode).setManagedBits(managedBits);
302     }
303 }