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.repository;
20  
21  import javax.inject.Inject;
22  
23  import java.io.File;
24  import java.util.Arrays;
25  import java.util.List;
26  
27  import org.apache.maven.SimpleLookup;
28  import org.apache.maven.artifact.Artifact;
29  import org.apache.maven.artifact.metadata.SwitchableMetadataSource;
30  import org.apache.maven.artifact.repository.ArtifactRepository;
31  import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
32  import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
33  import org.apache.maven.artifact.resolver.ResolutionErrorHandler;
34  import org.apache.maven.execution.DefaultMavenExecutionRequest;
35  import org.apache.maven.execution.DefaultMavenExecutionResult;
36  import org.apache.maven.execution.MavenSession;
37  import org.apache.maven.internal.impl.DefaultRepositoryFactory;
38  import org.apache.maven.internal.impl.DefaultSession;
39  import org.apache.maven.internal.impl.InternalSession;
40  import org.apache.maven.model.Dependency;
41  import org.apache.maven.model.Repository;
42  import org.apache.maven.model.RepositoryPolicy;
43  import org.apache.maven.plugin.LegacySupport;
44  import org.apache.maven.project.artifact.DefaultMetadataSource;
45  import org.apache.maven.repository.legacy.LegacyRepositorySystem;
46  import org.codehaus.plexus.PlexusContainer;
47  import org.codehaus.plexus.component.composition.CycleDetectedInComponentGraphException;
48  import org.codehaus.plexus.testing.PlexusTest;
49  import org.eclipse.aether.DefaultRepositorySystemSession;
50  import org.eclipse.aether.internal.impl.DefaultChecksumPolicyProvider;
51  import org.eclipse.aether.internal.impl.DefaultRemoteRepositoryManager;
52  import org.eclipse.aether.internal.impl.DefaultUpdatePolicyAnalyzer;
53  import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
54  import org.eclipse.aether.repository.LocalRepository;
55  import org.junit.jupiter.api.BeforeEach;
56  import org.junit.jupiter.api.Test;
57  
58  import static org.codehaus.plexus.testing.PlexusExtension.getBasedir;
59  import static org.junit.jupiter.api.Assertions.assertEquals;
60  import static org.junit.jupiter.api.Assertions.assertFalse;
61  import static org.junit.jupiter.api.Assertions.assertTrue;
62  
63  /**
64   * Tests {@link LegacyRepositorySystem}.
65   *
66   */
67  @PlexusTest
68  @Deprecated
69  class LegacyRepositorySystemTest {
70      @Inject
71      private LegacyRepositorySystem repositorySystem;
72  
73      @Inject
74      private ResolutionErrorHandler resolutionErrorHandler;
75  
76      @Inject
77      private PlexusContainer container;
78  
79      protected List<ArtifactRepository> getRemoteRepositories() throws Exception {
80          File repoDir = new File(getBasedir(), "src/test/remote-repo").getAbsoluteFile();
81  
82          RepositoryPolicy policy = new RepositoryPolicy();
83          policy.setEnabled(true);
84          policy.setChecksumPolicy("ignore");
85          policy.setUpdatePolicy("always");
86  
87          Repository repository = new Repository();
88          repository.setId(RepositorySystem.DEFAULT_REMOTE_REPO_ID);
89          repository.setUrl("file://" + repoDir.toURI().getPath());
90          repository.setReleases(policy);
91          repository.setSnapshots(policy);
92  
93          return Arrays.asList(repositorySystem.buildArtifactRepository(repository));
94      }
95  
96      protected ArtifactRepository getLocalRepository() throws Exception {
97          File repoDir = new File(getBasedir(), "target/local-repo").getAbsoluteFile();
98  
99          return repositorySystem.createLocalRepository(repoDir);
100     }
101 
102     @Test
103     void testThatASystemScopedDependencyIsNotResolvedFromRepositories() throws Exception {
104         //
105         // We should get a whole slew of dependencies resolving this artifact transitively
106         //
107         Dependency d = new Dependency();
108         d.setGroupId("org.apache.maven.its");
109         d.setArtifactId("b");
110         d.setVersion("0.1");
111         d.setScope(Artifact.SCOPE_COMPILE);
112         Artifact artifact = repositorySystem.createDependencyArtifact(d);
113 
114         ArtifactResolutionRequest request = new ArtifactResolutionRequest()
115                 .setArtifact(artifact)
116                 .setResolveRoot(true)
117                 .setResolveTransitively(true)
118                 .setRemoteRepositories(getRemoteRepositories())
119                 .setLocalRepository(getLocalRepository());
120 
121         DefaultRepositorySystemSession session = new DefaultRepositorySystemSession();
122         LocalRepository localRepo =
123                 new LocalRepository(request.getLocalRepository().getBasedir());
124         session.setLocalRepositoryManager(new SimpleLocalRepositoryManagerFactory().newInstance(session, localRepo));
125         LegacySupport legacySupport = container.lookup(LegacySupport.class);
126         DefaultMavenExecutionRequest mavenExecutionRequest = new DefaultMavenExecutionRequest();
127         MavenSession mavenSession =
128                 new MavenSession(container, session, mavenExecutionRequest, new DefaultMavenExecutionResult());
129         legacySupport.setSession(mavenSession);
130         InternalSession iSession = new DefaultSession(
131                 mavenSession,
132                 null,
133                 null,
134                 null,
135                 new SimpleLookup(List.of(new DefaultRepositoryFactory(new DefaultRemoteRepositoryManager(
136                         new DefaultUpdatePolicyAnalyzer(), new DefaultChecksumPolicyProvider())))),
137                 null);
138         InternalSession.associate(session, iSession);
139 
140         ArtifactResolutionResult result = repositorySystem.resolve(request);
141         resolutionErrorHandler.throwErrors(request, result);
142         assertEquals(2, result.getArtifacts().size());
143 
144         //
145         // System scoped version which should
146         //
147         d.setScope(Artifact.SCOPE_SYSTEM);
148         File file = new File(getBasedir(), "src/test/repository-system/maven-core-2.1.0.jar");
149         assertTrue(file.exists());
150         d.setSystemPath(file.getCanonicalPath());
151 
152         artifact = repositorySystem.createDependencyArtifact(d);
153 
154         //
155         // The request has not set any local or remote repositories as the system scoped dependency being resolved
156         // should only
157         // give us the dependency off the disk and nothing more.
158         //
159         request = new ArtifactResolutionRequest()
160                 .setArtifact(artifact)
161                 .setResolveRoot(true)
162                 .setResolveTransitively(true);
163 
164         result = repositorySystem.resolve(request);
165         resolutionErrorHandler.throwErrors(request, result);
166         assertEquals(1, result.getArtifacts().size());
167 
168         //
169         // Put in a bogus file to make sure missing files cause the resolution to fail.
170         //
171         file = new File(getBasedir(), "src/test/repository-system/maven-monkey-2.1.0.jar");
172         assertFalse(file.exists());
173         d.setSystemPath(file.getCanonicalPath());
174         artifact = repositorySystem.createDependencyArtifact(d);
175 
176         //
177         // The request has not set any local or remote repositories as the system scoped dependency being resolved
178         // should only
179         // give us the dependency off the disk and nothing more.
180         //
181         request = new ArtifactResolutionRequest()
182                 .setArtifact(artifact)
183                 .setResolveRoot(true)
184                 .setResolveTransitively(true);
185 
186         try {
187             result = repositorySystem.resolve(request);
188             resolutionErrorHandler.throwErrors(request, result);
189         } catch (Exception e) {
190             assertTrue(result.hasMissingArtifacts());
191         }
192     }
193 
194     @Test
195     void testLocalRepositoryBasedir() throws Exception {
196         File localRepoDir = new File("").getAbsoluteFile();
197 
198         ArtifactRepository localRepo = repositorySystem.createLocalRepository(localRepoDir);
199 
200         String basedir = localRepo.getBasedir();
201 
202         assertFalse(basedir.endsWith("/"));
203         assertFalse(basedir.endsWith("\\"));
204 
205         assertEquals(localRepoDir, new File(basedir));
206 
207         assertEquals(localRepoDir.getPath(), basedir);
208     }
209 
210     @Inject
211     DefaultMetadataSource defaultMetadataSource;
212 
213     @Inject
214     SwitchableMetadataSource switchableMetadataSource;
215 
216     @BeforeEach
217     void setup() throws CycleDetectedInComponentGraphException {
218         switchableMetadataSource.setDelegate(defaultMetadataSource);
219     }
220 }