1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.artifact;
20
21 import javax.inject.Inject;
22
23 import java.io.File;
24 import java.io.FileOutputStream;
25 import java.io.IOException;
26 import java.io.OutputStreamWriter;
27 import java.io.Writer;
28 import java.nio.charset.StandardCharsets;
29 import java.util.ArrayList;
30 import java.util.List;
31
32 import org.apache.maven.artifact.factory.ArtifactFactory;
33 import org.apache.maven.artifact.repository.ArtifactRepository;
34 import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
35 import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
36 import org.apache.maven.artifact.resolver.TestMavenWorkspaceReader;
37 import org.apache.maven.execution.DefaultMavenExecutionRequest;
38 import org.apache.maven.execution.DefaultMavenExecutionResult;
39 import org.apache.maven.execution.MavenSession;
40 import org.apache.maven.plugin.LegacySupport;
41 import org.apache.maven.repository.legacy.repository.ArtifactRepositoryFactory;
42 import org.eclipse.aether.DefaultRepositorySystemSession;
43 import org.eclipse.aether.RepositorySystemSession;
44 import org.eclipse.aether.collection.DependencyGraphTransformer;
45 import org.eclipse.aether.collection.DependencyManager;
46 import org.eclipse.aether.collection.DependencySelector;
47 import org.eclipse.aether.collection.DependencyTraverser;
48 import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
49 import org.eclipse.aether.repository.LocalRepository;
50 import org.eclipse.aether.util.graph.manager.ClassicDependencyManager;
51 import org.eclipse.aether.util.graph.selector.AndDependencySelector;
52 import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector;
53 import org.eclipse.aether.util.graph.selector.OptionalDependencySelector;
54 import org.eclipse.aether.util.graph.selector.ScopeDependencySelector;
55 import org.eclipse.aether.util.graph.transformer.ChainedDependencyGraphTransformer;
56 import org.eclipse.aether.util.graph.transformer.ConflictResolver;
57 import org.eclipse.aether.util.graph.transformer.JavaDependencyContextRefiner;
58 import org.eclipse.aether.util.graph.transformer.JavaScopeDeriver;
59 import org.eclipse.aether.util.graph.transformer.JavaScopeSelector;
60 import org.eclipse.aether.util.graph.transformer.NearestVersionSelector;
61 import org.eclipse.aether.util.graph.transformer.SimpleOptionalitySelector;
62 import org.eclipse.aether.util.graph.traverser.FatArtifactTraverser;
63 import org.eclipse.aether.util.repository.SimpleArtifactDescriptorPolicy;
64 import org.junit.jupiter.api.BeforeEach;
65
66 import static org.codehaus.plexus.testing.PlexusExtension.getBasedir;
67 import static org.junit.jupiter.api.Assertions.fail;
68
69
70
71
72 public abstract class AbstractArtifactComponentTest {
73
74 @Inject
75 protected ArtifactFactory artifactFactory;
76
77 @Inject
78 protected ArtifactRepositoryFactory artifactRepositoryFactory;
79
80 @Inject
81 private LegacySupport legacySupport;
82
83 @Inject
84 private ArtifactRepositoryLayout repoLayout;
85
86 @BeforeEach
87 protected void setUp() throws Exception {
88
89 RepositorySystemSession repoSession = initRepoSession();
90 MavenSession session = new MavenSession(
91 null, repoSession, new DefaultMavenExecutionRequest(), new DefaultMavenExecutionResult());
92
93 legacySupport.setSession(session);
94 }
95
96 protected abstract String component();
97
98 protected ArtifactRepository localRepository() throws Exception {
99 String path = "target/test-repositories/" + component() + "/local-repository";
100
101 File f = new File(getBasedir(), path);
102
103 return artifactRepositoryFactory.createArtifactRepository(
104 "local", "file://" + f.getPath(), repoLayout, null, null);
105 }
106
107 protected ArtifactRepository remoteRepository() throws Exception {
108 String path = "target/test-repositories/" + component() + "/remote-repository";
109
110 File f = new File(getBasedir(), path);
111
112 return artifactRepositoryFactory.createArtifactRepository(
113 "test",
114 "file://" + f.getPath(),
115 repoLayout,
116 new ArtifactRepositoryPolicy(),
117 new ArtifactRepositoryPolicy());
118 }
119
120 protected ArtifactRepository badRemoteRepository() throws Exception {
121
122 return artifactRepositoryFactory.createArtifactRepository(
123 "test", "http://foo.bar/repository", repoLayout, null, null);
124 }
125
126 protected void assertLocalArtifactPresent(Artifact artifact) throws Exception {
127 ArtifactRepository localRepo = localRepository();
128
129 String path = localRepo.pathOf(artifact);
130
131 File file = new File(localRepo.getBasedir(), path);
132
133 if (!file.exists()) {
134 fail("Local artifact " + file + " should be present.");
135 }
136 }
137
138
139
140
141
142 protected List<ArtifactRepository> remoteRepositories() throws Exception {
143 List<ArtifactRepository> remoteRepositories = new ArrayList<>();
144
145 remoteRepositories.add(remoteRepository());
146
147 return remoteRepositories;
148 }
149
150
151
152
153
154 protected Artifact createLocalArtifact(String artifactId, String version) throws Exception {
155 Artifact artifact = createArtifact(artifactId, version);
156
157 createArtifact(artifact, localRepository());
158
159 return artifact;
160 }
161
162 protected Artifact createRemoteArtifact(String artifactId, String version) throws Exception {
163 Artifact artifact = createArtifact(artifactId, version);
164
165 createArtifact(artifact, remoteRepository());
166
167 return artifact;
168 }
169
170 protected void createArtifact(Artifact artifact, ArtifactRepository repository) throws Exception {
171 String path = repository.pathOf(artifact);
172
173 File artifactFile = new File(repository.getBasedir(), path);
174
175 if (!artifactFile.getParentFile().exists()) {
176 artifactFile.getParentFile().mkdirs();
177 }
178 try (Writer writer = new OutputStreamWriter(new FileOutputStream(artifactFile), StandardCharsets.ISO_8859_1)) {
179 writer.write(artifact.getId());
180 }
181 }
182
183 protected Artifact createArtifact(String artifactId, String version) throws Exception {
184 return createArtifact(artifactId, version, "jar");
185 }
186
187 protected Artifact createArtifact(String artifactId, String version, String type) throws Exception {
188 return createArtifact("org.apache.maven", artifactId, version, type);
189 }
190
191 protected Artifact createArtifact(String groupId, String artifactId, String version, String type) throws Exception {
192 Artifact a = artifactFactory.createBuildArtifact(groupId, artifactId, version, type);
193
194 return a;
195 }
196
197 protected void deleteLocalArtifact(Artifact artifact) throws Exception {
198 deleteArtifact(artifact, localRepository());
199 }
200
201 protected void deleteArtifact(Artifact artifact, ArtifactRepository repository) throws Exception {
202 String path = repository.pathOf(artifact);
203
204 File artifactFile = new File(repository.getBasedir(), path);
205
206 if (artifactFile.exists()) {
207 if (!artifactFile.delete()) {
208 throw new IOException("Failure while attempting to delete artifact " + artifactFile);
209 }
210 }
211 }
212
213 protected RepositorySystemSession initRepoSession() throws Exception {
214 DefaultRepositorySystemSession session = new DefaultRepositorySystemSession();
215 session.setArtifactDescriptorPolicy(new SimpleArtifactDescriptorPolicy(true, true));
216 DependencyTraverser depTraverser = new FatArtifactTraverser();
217 session.setDependencyTraverser(depTraverser);
218
219 DependencyManager depManager = new ClassicDependencyManager();
220 session.setDependencyManager(depManager);
221
222 DependencySelector depFilter = new AndDependencySelector(
223 new ScopeDependencySelector("test", "provided"),
224 new OptionalDependencySelector(),
225 new ExclusionDependencySelector());
226 session.setDependencySelector(depFilter);
227
228 DependencyGraphTransformer transformer = new ConflictResolver(
229 new NearestVersionSelector(), new JavaScopeSelector(),
230 new SimpleOptionalitySelector(), new JavaScopeDeriver());
231 transformer = new ChainedDependencyGraphTransformer(transformer, new JavaDependencyContextRefiner());
232 session.setDependencyGraphTransformer(transformer);
233
234 LocalRepository localRepo = new LocalRepository(localRepository().getBasedir());
235 session.setLocalRepositoryManager(new SimpleLocalRepositoryManagerFactory().newInstance(session, localRepo));
236 session.setWorkspaceReader(new TestMavenWorkspaceReader());
237
238 return session;
239 }
240 }