View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.internal.impl;
20  
21  import java.util.Objects;
22  
23  import org.apache.maven.api.DependencyScope;
24  import org.apache.maven.api.Type;
25  import org.apache.maven.api.annotations.Nonnull;
26  import org.eclipse.aether.artifact.ArtifactProperties;
27  import org.eclipse.aether.graph.Dependency;
28  
29  /**
30   * Base class of {@code Dependency} or {@code DependencyCoordinates} implementations as a wrapper around
31   * an Eclipse Aether object. This class implements the methods that are common to {@code Dependency} and
32   * {@code DependencyCoordinates}, even if this class does not implement directly any of those interfaces.
33   * Having matching method signatures is sufficient, even if there is no {@code @Override} annotations.
34   *
35   * <p>The fact that this class is wrapping an Eclipse Aether object is an implementation details that may
36   * change in any future Maven version. For now, one purpose of this class is to have a single type to check
37   * for unwrapping the Eclipse Aether object.</p>
38   */
39  abstract class AetherDependencyWrapper {
40      /**
41       * The session to install / deploy / resolve artifacts and dependencies.
42       */
43      final InternalSession session;
44  
45      /**
46       * The wrapped Eclipse Aether dependency.
47       */
48      final Dependency dependency;
49  
50      /**
51       * Creates a new wrapper for the given dependency.
52       *
53       * @param dependency the Eclipse Aether dependency to wrap
54       */
55      AetherDependencyWrapper(@Nonnull InternalSession session, @Nonnull Dependency dependency) {
56          this.session = Objects.requireNonNull(session, "session");
57          this.dependency = Objects.requireNonNull(dependency, "dependency");
58      }
59  
60      /**
61       * {@return the group identifier of the wrapped dependency}
62       * The default implementation delegates to the Eclipse Aether artifact.
63       */
64      public String getGroupId() {
65          return dependency.getArtifact().getGroupId();
66      }
67  
68      /**
69       * {@return the artifact identifier of the wrapped dependency}
70       * The default implementation delegates to the Eclipse Aether artifact.
71       */
72      public String getArtifactId() {
73          return dependency.getArtifact().getArtifactId();
74      }
75  
76      /**
77       * {@return the file extension of the wrapped dependency}
78       * The default implementation delegates to the Eclipse Aether artifact.
79       */
80      public String getExtension() {
81          return dependency.getArtifact().getExtension();
82      }
83  
84      /**
85       * {@return the type of the wrapped dependency}
86       * The default implementation infers the type from the properties associated to the Eclipse Aether artifact.
87       */
88      public Type getType() {
89          String type = dependency.getArtifact().getProperty(ArtifactProperties.TYPE, getExtension());
90          return session.requireType(type);
91      }
92  
93      /**
94       * {@return the classifier ("jar", "test-jar", …) of the wrapped dependency}
95       * The default implementation first delegates to the Eclipse Aether artifact.
96       * If the latter does not provide a non-empty classifier,
97       * then the default value is determined by {@linkplain #getType() type}.
98       */
99      @Nonnull
100     public String getClassifier() {
101         String classifier = dependency.getArtifact().getClassifier();
102         if (classifier.isEmpty()) {
103             classifier = getType().getClassifier();
104             if (classifier == null) {
105                 classifier = "";
106             }
107         }
108         return classifier;
109     }
110 
111     /**
112      * {@return the scope (compile, test, …) of this dependency}
113      */
114     @Nonnull
115     public DependencyScope getScope() {
116         return session.requireDependencyScope(dependency.getScope());
117     }
118 
119     /**
120      * {@return a string representation of this dependency}
121      * This is for debugging purposes only and may change in any future version.
122      */
123     @Override
124     public String toString() {
125         return dependency.toString();
126     }
127 }