1 package org.apache.maven.shared.repository;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
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 }