1 package org.apache.maven.shared.repository;
2
3 import org.apache.maven.artifact.Artifact;
4 import org.apache.maven.artifact.factory.ArtifactFactory;
5 import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
6 import org.apache.maven.artifact.repository.ArtifactRepository;
7 import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
8 import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
9 import org.apache.maven.artifact.resolver.ArtifactResolver;
10 import org.apache.maven.model.Profile;
11 import org.apache.maven.model.Repository;
12 import org.apache.maven.model.RepositoryPolicy;
13 import org.apache.maven.profiles.DefaultProfileManager;
14 import org.apache.maven.profiles.ProfileManager;
15 import org.apache.maven.project.MavenProject;
16 import org.apache.maven.project.MavenProjectBuilder;
17 import org.apache.maven.project.ProjectBuildingException;
18 import org.apache.maven.project.artifact.InvalidDependencyVersionException;
19 import org.apache.maven.shared.repository.model.DefaultRepositoryInfo;
20 import org.codehaus.plexus.PlexusTestCase;
21
22 import java.io.File;
23 import java.io.IOException;
24 import java.net.URL;
25 import java.net.URLDecoder;
26 import java.util.Collections;
27
28 public class DefaultRepositoryAssemblerTest
29 extends PlexusTestCase
30 {
31
32 private MavenProjectBuilder projectBuilder;
33
34 private ArtifactRepositoryLayout defaultLayout;
35
36 private ArtifactRepositoryFactory repoFactory;
37
38 private ArtifactFactory artifactFactory;
39
40 private ArtifactRepository localRepository;
41
42 private ArtifactResolver artifactResolver;
43
44 private ArtifactMetadataSource metadataSource;
45
46 private DefaultProfileManager profileManager;
47
48 protected void setUp()
49 throws Exception
50 {
51 super.setUp();
52
53 projectBuilder = (MavenProjectBuilder) lookup( MavenProjectBuilder.class.getName() );
54
55 defaultLayout = (ArtifactRepositoryLayout) lookup( ArtifactRepositoryLayout.class.getName(), "default" );
56 repoFactory = (ArtifactRepositoryFactory) lookup( ArtifactRepositoryFactory.class.getName() );
57 artifactFactory = (ArtifactFactory) lookup( ArtifactFactory.class.getName() );
58 artifactResolver = (ArtifactResolver) lookup( ArtifactResolver.class.getName() );
59 metadataSource = (ArtifactMetadataSource) lookup( ArtifactMetadataSource.class.getName() );
60
61 File localRepo = new File( getBasedir(), "target/local-repository" );
62
63 localRepository = repoFactory.createArtifactRepository( "local", localRepo.getAbsolutePath(), defaultLayout,
64 null, null );
65
66 }
67
68 private MavenProject getProject( String projectResource, String parentGroupId, String parentArtifactId,
69 String parentVersion, boolean preCacheParent )
70 throws ProjectBuildingException, IOException, InvalidDependencyVersionException
71 {
72 ClassLoader cloader = Thread.currentThread().getContextClassLoader();
73 URL res = cloader.getResource( "projects/" + projectResource );
74
75 File projectFile = new File( URLDecoder.decode( res.getPath(), "UTF-8" ) ).getAbsoluteFile();
76
77 if ( preCacheParent )
78 {
79
80 Artifact parentArtifact = artifactFactory.createParentArtifact( parentGroupId, parentArtifactId,
81 parentVersion );
82 projectBuilder.buildFromRepository( parentArtifact, Collections.EMPTY_LIST, localRepository );
83 }
84
85 MavenProject project = projectBuilder.build( projectFile, localRepository, getProfileManager() );
86
87 project.setDependencyArtifacts( project.createArtifacts( artifactFactory, null, null ) );
88
89 return project;
90 }
91
92 private ProfileManager getProfileManager()
93 throws IOException
94 {
95 if ( profileManager == null )
96 {
97 File repoDir = getTestRemoteRepositoryBasedir();
98
99 Profile profile = new Profile();
100 Repository repo = new Repository();
101 repo.setId( "test.repo" );
102 repo.setUrl( repoDir.toURL().toExternalForm() );
103
104 repo.setReleases( new RepositoryPolicy() );
105 repo.setSnapshots( new RepositoryPolicy() );
106
107 profile.addRepository( repo );
108
109 profileManager = new DefaultProfileManager( getContainer() );
110 profileManager.addProfile( profile );
111 profileManager.explicitlyActivate( "test.repo" );
112 }
113
114 return profileManager;
115 }
116
117 private File getTestRemoteRepositoryBasedir()
118 throws IOException
119 {
120 ClassLoader cloader = Thread.currentThread().getContextClassLoader();
121 URL res = cloader.getResource( "marker.txt" );
122
123 File markerFile = new File( URLDecoder.decode( res.getPath(), "UTF-8" ) );
124 markerFile = markerFile.getCanonicalFile();
125
126 File repoDir = new File( markerFile.getParentFile(), "remote-repository" );
127
128 return repoDir;
129 }
130
131 public void test_MASSEMBLY_210_projectParentIsIncludedInRepository()
132 throws ProjectBuildingException, RepositoryAssemblyException, IOException, InvalidDependencyVersionException
133 {
134 File repoDir = getTestRemoteRepositoryBasedir();
135
136 ArtifactRepository localRepository = repoFactory.createArtifactRepository( "local", repoDir.getAbsoluteFile()
137 .toURL()
138 .toExternalForm(),
139 defaultLayout, null, null );
140
141 MavenProject project = getProject( "massembly-210-direct-parent/pom.xml", "massembly.210", "parent",
142 "1.0-SNAPSHOT", true );
143
144 TestRepositoryBuilderConfigSource cs = new TestRepositoryBuilderConfigSource();
145 cs.setProject( project );
146 cs.setLocalRepository( localRepository );
147
148 DefaultRepositoryAssembler assembler = new DefaultRepositoryAssembler( artifactFactory, artifactResolver,
149 defaultLayout, repoFactory,
150 metadataSource, projectBuilder );
151
152 File repositoryDirectory = new File( getBasedir(), "target/test-repositories/massembly-210-direct-parent" );
153
154 DefaultRepositoryInfo repoInfo = new DefaultRepositoryInfo();
155
156 assembler.buildRemoteRepository( repositoryDirectory, repoInfo, cs );
157
158 File parentFile = new File( repositoryDirectory, "massembly/210/parent/1.0-SNAPSHOT/parent-1.0-SNAPSHOT.pom" );
159
160 assertTrue( parentFile.exists() );
161 }
162
163 public void test_MASSEMBLY_210_projectParentIsNotInRepository()
164 throws ProjectBuildingException, RepositoryAssemblyException, IOException, InvalidDependencyVersionException
165 {
166 File repoDir = getTestRemoteRepositoryBasedir();
167
168 ArtifactRepository localRepository = repoFactory.createArtifactRepository( "local", repoDir.getAbsoluteFile()
169 .toURL()
170 .toExternalForm(),
171 defaultLayout, null, null );
172
173 MavenProject project = getProject( "massembly-210-direct-parent-on-fs/project/pom.xml", null, null, null, false );
174
175 TestRepositoryBuilderConfigSource cs = new TestRepositoryBuilderConfigSource();
176 cs.setProject( project );
177 cs.setLocalRepository( localRepository );
178
179 DefaultRepositoryAssembler assembler = new DefaultRepositoryAssembler( artifactFactory, artifactResolver,
180 defaultLayout, repoFactory,
181 metadataSource, projectBuilder );
182
183 File repositoryDirectory = new File( getBasedir(), "target/test-repositories/massembly-210-direct-parent-on-fs" );
184
185 DefaultRepositoryInfo repoInfo = new DefaultRepositoryInfo();
186
187 assembler.buildRemoteRepository( repositoryDirectory, repoInfo, cs );
188
189 File parentFile = new File( repositoryDirectory,
190 "massembly/210/parent-on-fs/1.0-SNAPSHOT/parent-on-fs-1.0-SNAPSHOT.pom" );
191
192 assertTrue( parentFile.exists() );
193 }
194
195 public void test_MASSEMBLY_218_projectDependencyWithClassifier()
196 throws ProjectBuildingException, RepositoryAssemblyException, IOException, InvalidDependencyVersionException
197 {
198 File repoDir = getTestRemoteRepositoryBasedir();
199
200 ArtifactRepository localRepository = repoFactory.createArtifactRepository( "local", repoDir.getAbsoluteFile()
201 .toURL()
202 .toExternalForm(),
203 defaultLayout, null, null );
204
205 MavenProject project = getProject( "massembly-210-direct-parent-on-fs/project/pom.xml", null, null, null, false );
206
207 TestRepositoryBuilderConfigSource cs = new TestRepositoryBuilderConfigSource();
208 cs.setProject( project );
209 cs.setLocalRepository( localRepository );
210
211 DefaultRepositoryAssembler assembler = new DefaultRepositoryAssembler( artifactFactory, artifactResolver,
212 defaultLayout, repoFactory,
213 metadataSource, projectBuilder );
214
215 File repositoryDirectory = new File( getBasedir(), "target/test-repositories/massembly-210-direct-parent-on-fs" );
216
217 DefaultRepositoryInfo repoInfo = new DefaultRepositoryInfo();
218
219 assembler.buildRemoteRepository( repositoryDirectory, repoInfo, cs );
220
221 File parentFile = new File( repositoryDirectory,
222 "massembly/210/parent-on-fs/1.0-SNAPSHOT/parent-on-fs-1.0-SNAPSHOT.pom" );
223
224 assertTrue( parentFile.exists() );
225 }
226 }