View Javadoc
1   package org.apache.maven.shared.repository;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import org.apache.maven.artifact.Artifact;
23  import org.apache.maven.artifact.factory.ArtifactFactory;
24  import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
25  import org.apache.maven.artifact.repository.ArtifactRepository;
26  import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
27  import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
28  import org.apache.maven.artifact.resolver.ArtifactResolver;
29  import org.apache.maven.model.Profile;
30  import org.apache.maven.model.Repository;
31  import org.apache.maven.model.RepositoryPolicy;
32  import org.apache.maven.profiles.DefaultProfileManager;
33  import org.apache.maven.profiles.ProfileManager;
34  import org.apache.maven.project.MavenProject;
35  import org.apache.maven.project.MavenProjectBuilder;
36  import org.apache.maven.project.ProjectBuildingException;
37  import org.apache.maven.project.artifact.InvalidDependencyVersionException;
38  import org.apache.maven.shared.repository.model.DefaultRepositoryInfo;
39  import org.codehaus.plexus.PlexusTestCase;
40  
41  import java.io.File;
42  import java.io.IOException;
43  import java.net.URL;
44  import java.net.URLDecoder;
45  import java.util.Collections;
46  
47  public class DefaultRepositoryAssemblerTest
48      extends PlexusTestCase
49  {
50  
51      private MavenProjectBuilder projectBuilder;
52  
53      private ArtifactRepositoryLayout defaultLayout;
54  
55      private ArtifactRepositoryFactory repoFactory;
56  
57      private ArtifactFactory artifactFactory;
58  
59      private ArtifactRepository localRepository;
60  
61      private ArtifactResolver artifactResolver;
62  
63      private ArtifactMetadataSource metadataSource;
64  
65      private DefaultProfileManager profileManager;
66  
67      protected void setUp()
68          throws Exception
69      {
70          super.setUp();
71  
72          projectBuilder = (MavenProjectBuilder) lookup( MavenProjectBuilder.class.getName() );
73  
74          defaultLayout = (ArtifactRepositoryLayout) lookup( ArtifactRepositoryLayout.class.getName(), "default" );
75          repoFactory = (ArtifactRepositoryFactory) lookup( ArtifactRepositoryFactory.class.getName() );
76          artifactFactory = (ArtifactFactory) lookup( ArtifactFactory.class.getName() );
77          artifactResolver = (ArtifactResolver) lookup( ArtifactResolver.class.getName() );
78          metadataSource = (ArtifactMetadataSource) lookup( ArtifactMetadataSource.class.getName() );
79  
80          File localRepo = new File( getBasedir(), "target/local-repository" );
81  
82          localRepository = repoFactory.createArtifactRepository( "local", localRepo.getAbsolutePath(), defaultLayout,
83                                                                  null, null );
84  
85      }
86  
87      private MavenProject getProject( String projectResource, String parentGroupId, String parentArtifactId,
88                                       String parentVersion, boolean preCacheParent )
89          throws ProjectBuildingException, IOException, InvalidDependencyVersionException
90      {
91          ClassLoader cloader = Thread.currentThread().getContextClassLoader();
92          URL res = cloader.getResource( "projects/" + projectResource );
93  
94          File projectFile = new File( URLDecoder.decode( res.getPath(), "UTF-8" ) ).getAbsoluteFile();
95  
96          if ( preCacheParent )
97          {
98              // pre-load the parent model...this is a hack!
99              Artifact parentArtifact = artifactFactory.createParentArtifact( parentGroupId, parentArtifactId,
100                                                                             parentVersion );
101             projectBuilder.buildFromRepository( parentArtifact, Collections.EMPTY_LIST, localRepository );
102         }
103 
104         MavenProject project = projectBuilder.build( projectFile, localRepository, getProfileManager() );
105 
106         project.setDependencyArtifacts( project.createArtifacts( artifactFactory, null, null ) );
107 
108         return project;
109     }
110 
111     private ProfileManager getProfileManager()
112         throws IOException
113     {
114         if ( profileManager == null )
115         {
116             File repoDir = getTestRemoteRepositoryBasedir();
117 
118             Profile profile = new Profile();
119             Repository repo = new Repository();
120             repo.setId( "test.repo" );
121             repo.setUrl( repoDir.toURL().toExternalForm() );
122 
123             repo.setReleases( new RepositoryPolicy() );
124             repo.setSnapshots( new RepositoryPolicy() );
125 
126             profile.addRepository( repo );
127 
128             profileManager = new DefaultProfileManager( getContainer() );
129             profileManager.addProfile( profile );
130             profileManager.explicitlyActivate( "test.repo" );
131         }
132 
133         return profileManager;
134     }
135 
136     private File getTestRemoteRepositoryBasedir()
137         throws IOException
138     {
139         ClassLoader cloader = Thread.currentThread().getContextClassLoader();
140         URL res = cloader.getResource( "marker.txt" );
141 
142         File markerFile = new File( URLDecoder.decode( res.getPath(), "UTF-8" ) );
143         markerFile = markerFile.getCanonicalFile();
144 
145         File repoDir = new File( markerFile.getParentFile(), "remote-repository" );
146 
147         return repoDir;
148     }
149 
150     public void test_MASSEMBLY_210_projectParentIsIncludedInRepository()
151         throws ProjectBuildingException, RepositoryAssemblyException, IOException, InvalidDependencyVersionException
152     {
153         File repoDir = getTestRemoteRepositoryBasedir();
154 
155         ArtifactRepository localRepository = repoFactory.createArtifactRepository( "local", repoDir.getAbsoluteFile()
156                                                                                                    .toURL()
157                                                                                                    .toExternalForm(),
158                                                                                    defaultLayout, null, null );
159 
160         MavenProject project = getProject( "massembly-210-direct-parent/pom.xml", "massembly.210", "parent",
161                                            "1.0-SNAPSHOT", true );
162 
163         TestRepositoryBuilderConfigSource cs = new TestRepositoryBuilderConfigSource();
164         cs.setProject( project );
165         cs.setLocalRepository( localRepository );
166 
167         DefaultRepositoryAssembler assembler = new DefaultRepositoryAssembler( artifactFactory, artifactResolver,
168                                                                                defaultLayout, repoFactory,
169                                                                                metadataSource, projectBuilder );
170 
171         File repositoryDirectory = new File( getBasedir(), "target/test-repositories/massembly-210-direct-parent" );
172 
173         DefaultRepositoryInfo repoInfo = new DefaultRepositoryInfo();
174 
175         assembler.buildRemoteRepository( repositoryDirectory, repoInfo, cs );
176 
177         File parentFile = new File( repositoryDirectory, "massembly/210/parent/1.0-SNAPSHOT/parent-1.0-SNAPSHOT.pom" );
178 
179         assertTrue( parentFile.exists() );
180     }
181 
182     public void test_MASSEMBLY_210_projectParentIsNotInRepository()
183         throws ProjectBuildingException, RepositoryAssemblyException, IOException, InvalidDependencyVersionException
184     {
185         File repoDir = getTestRemoteRepositoryBasedir();
186 
187         ArtifactRepository localRepository = repoFactory.createArtifactRepository( "local", repoDir.getAbsoluteFile()
188                                                                                                    .toURL()
189                                                                                                    .toExternalForm(),
190                                                                                    defaultLayout, null, null );
191 
192         MavenProject project = getProject( "massembly-210-direct-parent-on-fs/project/pom.xml", null, null, null, false );
193 
194         TestRepositoryBuilderConfigSource cs = new TestRepositoryBuilderConfigSource();
195         cs.setProject( project );
196         cs.setLocalRepository( localRepository );
197 
198         DefaultRepositoryAssembler assembler = new DefaultRepositoryAssembler( artifactFactory, artifactResolver,
199                                                                                defaultLayout, repoFactory,
200                                                                                metadataSource, projectBuilder );
201 
202         File repositoryDirectory = new File( getBasedir(), "target/test-repositories/massembly-210-direct-parent-on-fs" );
203 
204         DefaultRepositoryInfo repoInfo = new DefaultRepositoryInfo();
205 
206         assembler.buildRemoteRepository( repositoryDirectory, repoInfo, cs );
207 
208         File parentFile = new File( repositoryDirectory,
209                                     "massembly/210/parent-on-fs/1.0-SNAPSHOT/parent-on-fs-1.0-SNAPSHOT.pom" );
210 
211         assertTrue( parentFile.exists() );
212     }
213 
214     public void test_MASSEMBLY_218_projectDependencyWithClassifier()
215         throws ProjectBuildingException, RepositoryAssemblyException, IOException, InvalidDependencyVersionException
216     {
217         File repoDir = getTestRemoteRepositoryBasedir();
218 
219         ArtifactRepository localRepository = repoFactory.createArtifactRepository( "local", repoDir.getAbsoluteFile()
220                                                                                                    .toURL()
221                                                                                                    .toExternalForm(),
222                                                                                    defaultLayout, null, null );
223 
224         MavenProject project = getProject( "massembly-210-direct-parent-on-fs/project/pom.xml", null, null, null, false );
225 
226         TestRepositoryBuilderConfigSource cs = new TestRepositoryBuilderConfigSource();
227         cs.setProject( project );
228         cs.setLocalRepository( localRepository );
229 
230         DefaultRepositoryAssembler assembler = new DefaultRepositoryAssembler( artifactFactory, artifactResolver,
231                                                                                defaultLayout, repoFactory,
232                                                                                metadataSource, projectBuilder );
233 
234         File repositoryDirectory = new File( getBasedir(), "target/test-repositories/massembly-210-direct-parent-on-fs" );
235 
236         DefaultRepositoryInfo repoInfo = new DefaultRepositoryInfo();
237 
238         assembler.buildRemoteRepository( repositoryDirectory, repoInfo, cs );
239 
240         File parentFile = new File( repositoryDirectory,
241                                     "massembly/210/parent-on-fs/1.0-SNAPSHOT/parent-on-fs-1.0-SNAPSHOT.pom" );
242 
243         assertTrue( parentFile.exists() );
244     }
245 }