1 package org.apache.maven.plugin.dependency;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.File;
23 import java.io.IOException;
24 import java.util.HashSet;
25 import java.util.Iterator;
26 import java.util.Set;
27
28 import org.apache.maven.artifact.Artifact;
29 import org.apache.maven.artifact.metadata.ArtifactMetadata;
30 import org.apache.maven.artifact.repository.ArtifactRepository;
31 import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
32 import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;
33 import org.apache.maven.artifact.repository.metadata.Snapshot;
34 import org.apache.maven.artifact.repository.metadata.SnapshotArtifactRepositoryMetadata;
35 import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
36 import org.apache.maven.artifact.transform.SnapshotTransformation;
37 import org.apache.maven.plugin.MojoExecutionException;
38 import org.apache.maven.plugin.dependency.utils.DependencyUtil;
39 import org.apache.maven.plugin.dependency.utils.markers.DefaultFileMarkerHandler;
40 import org.apache.maven.project.MavenProject;
41 import org.codehaus.plexus.util.StringUtils;
42
43 public class TestCopyDependenciesMojo2
44 extends AbstractDependencyMojoTestCase
45 {
46
47 CopyDependenciesMojo mojo;
48
49 protected void setUp()
50 throws Exception
51 {
52
53 super.setUp( "copy-dependencies", true );
54
55 File testPom = new File( getBasedir(), "target/test-classes/unit/copy-dependencies-test/plugin-config.xml" );
56 mojo = (CopyDependenciesMojo) lookupMojo( "copy-dependencies", testPom );
57 mojo.outputDirectory = new File( this.testDir, "outputDirectory" );
58
59
60 assertNotNull( mojo );
61 assertNotNull( mojo.getProject() );
62 MavenProject project = mojo.getProject();
63
64 Set<Artifact> artifacts = this.stubFactory.getScopedArtifacts();
65 Set<Artifact> directArtifacts = this.stubFactory.getReleaseAndSnapshotArtifacts();
66 artifacts.addAll( directArtifacts );
67
68 project.setArtifacts( artifacts );
69 project.setDependencyArtifacts( directArtifacts );
70 mojo.markersDirectory = new File( this.testDir, "markers" );
71
72 }
73
74 public void assertNoMarkerFile( Artifact artifact )
75 {
76 DefaultFileMarkerHandler handle = new DefaultFileMarkerHandler( artifact, mojo.markersDirectory );
77 try
78 {
79 assertFalse( handle.isMarkerSet() );
80 }
81 catch ( MojoExecutionException e )
82 {
83 fail( e.getLongMessage() );
84 }
85
86 }
87
88 public void testCopyDependenciesMojoIncludeCompileScope()
89 throws Exception
90 {
91 mojo.project.setArtifacts( stubFactory.getScopedArtifacts() );
92 mojo.project.setDependencyArtifacts( new HashSet<Artifact>() );
93 mojo.includeScope = "compile";
94 mojo.execute();
95 ScopeArtifactFilter saf = new ScopeArtifactFilter( mojo.includeScope );
96
97 Iterator<Artifact> iter = mojo.project.getArtifacts().iterator();
98 while ( iter.hasNext() )
99 {
100 Artifact artifact = iter.next();
101 String fileName = DependencyUtil.getFormattedFileName( artifact, false );
102 File file = new File( mojo.outputDirectory, fileName );
103
104 assertEquals( saf.include( artifact ), file.exists() );
105 }
106 }
107
108 public void testCopyDependenciesMojoIncludeTestScope()
109 throws Exception
110 {
111 mojo.project.setArtifacts( stubFactory.getScopedArtifacts() );
112 mojo.project.setDependencyArtifacts( new HashSet<Artifact>() );
113 mojo.includeScope = "test";
114
115 mojo.execute();
116 ScopeArtifactFilter saf = new ScopeArtifactFilter( mojo.includeScope );
117
118 Iterator<Artifact> iter = mojo.project.getArtifacts().iterator();
119 while ( iter.hasNext() )
120 {
121 Artifact artifact = iter.next();
122 String fileName = DependencyUtil.getFormattedFileName( artifact, false );
123 File file = new File( mojo.outputDirectory, fileName );
124
125 assertEquals( saf.include( artifact ), file.exists() );
126 }
127 }
128
129 public void testCopyDependenciesMojoIncludeRuntimeScope()
130 throws Exception
131 {
132 mojo.project.setArtifacts( stubFactory.getScopedArtifacts() );
133 mojo.project.setDependencyArtifacts( new HashSet<Artifact>() );
134 mojo.includeScope = "runtime";
135 mojo.execute();
136 ScopeArtifactFilter saf = new ScopeArtifactFilter( mojo.includeScope );
137
138 Iterator<Artifact> iter = mojo.project.getArtifacts().iterator();
139 while ( iter.hasNext() )
140 {
141 Artifact artifact = iter.next();
142 String fileName = DependencyUtil.getFormattedFileName( artifact, false );
143 File file = new File( mojo.outputDirectory, fileName );
144
145 assertEquals( saf.include( artifact ), file.exists() );
146 }
147 }
148
149 public void testCopyDependenciesMojoIncludeprovidedScope()
150 throws Exception
151 {
152 mojo.project.setArtifacts( stubFactory.getScopedArtifacts() );
153 mojo.project.setDependencyArtifacts( new HashSet<Artifact>() );
154 mojo.includeScope = "provided";
155
156 mojo.execute();
157 Iterator<Artifact> iter = mojo.project.getArtifacts().iterator();
158 while ( iter.hasNext() )
159 {
160 Artifact artifact = iter.next();
161 String fileName = DependencyUtil.getFormattedFileName( artifact, false );
162 File file = new File( mojo.outputDirectory, fileName );
163 assertEquals( Artifact.SCOPE_PROVIDED.equals( artifact.getScope() ), file.exists() );
164 }
165 }
166
167 public void testCopyDependenciesMojoIncludesystemScope()
168 throws Exception
169 {
170 mojo.project.setArtifacts( stubFactory.getScopedArtifacts() );
171 mojo.project.setDependencyArtifacts( new HashSet<Artifact>() );
172 mojo.includeScope = "system";
173
174 mojo.execute();
175
176 Iterator<Artifact> iter = mojo.project.getArtifacts().iterator();
177 while ( iter.hasNext() )
178 {
179 Artifact artifact = iter.next();
180 String fileName = DependencyUtil.getFormattedFileName( artifact, false );
181 File file = new File( mojo.outputDirectory, fileName );
182
183 assertEquals( Artifact.SCOPE_SYSTEM.equals( artifact.getScope() ), file.exists() );
184 }
185 }
186
187 public void testSubPerArtifact()
188 throws Exception
189 {
190 mojo.useSubDirectoryPerArtifact = true;
191 mojo.execute();
192
193 Iterator<Artifact> iter = mojo.project.getArtifacts().iterator();
194 while ( iter.hasNext() )
195 {
196 Artifact artifact = iter.next();
197 String fileName = DependencyUtil.getFormattedFileName( artifact, false );
198 File folder = DependencyUtil.getFormattedOutputDirectory( false, false, true, false, false, mojo.outputDirectory,
199 artifact );
200 File file = new File( folder, fileName );
201 assertTrue( file.exists() );
202 }
203 }
204
205 public void testSubPerArtifactAndType()
206 throws Exception
207 {
208 mojo.project.setArtifacts( stubFactory.getTypedArtifacts() );
209 mojo.project.setDependencyArtifacts( new HashSet<Artifact>() );
210 mojo.useSubDirectoryPerArtifact = true;
211 mojo.useSubDirectoryPerType = true;
212 mojo.execute();
213
214 Iterator<Artifact> iter = mojo.project.getArtifacts().iterator();
215 while ( iter.hasNext() )
216 {
217 Artifact artifact = iter.next();
218 String fileName = DependencyUtil.getFormattedFileName( artifact, false );
219 File folder = DependencyUtil.getFormattedOutputDirectory( false, true, true, false, false, mojo.outputDirectory,
220 artifact );
221 File file = new File( folder, fileName );
222 assertTrue( file.exists() );
223 }
224 }
225
226 public void testSubPerArtifactAndScope()
227 throws Exception
228 {
229 mojo.project.setArtifacts( stubFactory.getTypedArtifacts() );
230 mojo.project.setDependencyArtifacts( new HashSet<Artifact>() );
231 mojo.useSubDirectoryPerArtifact = true;
232 mojo.useSubDirectoryPerScope = true;
233 mojo.execute();
234
235 Iterator<Artifact> iter = mojo.project.getArtifacts().iterator();
236 while ( iter.hasNext() )
237 {
238 Artifact artifact = iter.next();
239 String fileName = DependencyUtil.getFormattedFileName( artifact, false );
240 File folder = DependencyUtil.getFormattedOutputDirectory( true, false, true, false, false, mojo.outputDirectory,
241 artifact );
242 File file = new File( folder, fileName );
243 assertTrue( file.exists() );
244 }
245 }
246
247 public void testRepositoryLayout()
248 throws Exception
249 {
250 String baseVersion = "2.0-SNAPSHOT";
251 String groupId = "testGroupId";
252 String artifactId = "expanded-snapshot";
253
254 Artifact expandedSnapshot = createExpandedVersionArtifact( baseVersion,
255 groupId,
256 artifactId,
257 "compile",
258 "jar",
259 null);
260
261 mojo.project.getArtifacts().add( expandedSnapshot );
262 mojo.project.getDependencyArtifacts().add( expandedSnapshot );
263
264 Artifact pomExpandedSnapshot = createExpandedVersionArtifact( baseVersion,
265 groupId,
266 artifactId,
267 "compile",
268 "pom",
269 null);
270 mojo.project.getArtifacts().add( pomExpandedSnapshot );
271 mojo.project.getDependencyArtifacts().add( pomExpandedSnapshot );
272
273 mojo.useRepositoryLayout = true;
274 mojo.execute();
275
276 File outputDirectory = mojo.outputDirectory;
277 ArtifactRepository targetRepository = mojo.repositoryFactory.createDeploymentArtifactRepository(
278 "local",
279 outputDirectory.toURL().toExternalForm(),
280 new DefaultRepositoryLayout(),
281 false );
282
283 Iterator<Artifact> iter = mojo.project.getArtifacts().iterator();
284 while ( iter.hasNext() )
285 {
286 Artifact artifact = iter.next();
287 assertArtifactExists( artifact, targetRepository );
288
289 if ( ! artifact.getBaseVersion().equals( artifact.getVersion() ) )
290 {
291 Artifact baseArtifact = mojo.factory.createArtifact( artifact.getGroupId(),
292 artifact.getArtifactId(),
293 artifact.getBaseVersion(),
294 artifact.getScope(),
295 artifact.getType() );
296 assertArtifactExists( baseArtifact, targetRepository );
297 }
298
299 }
300 }
301
302 private Artifact createExpandedVersionArtifact( String baseVersion,
303 String groupId,
304 String artifactId,
305 String scope,
306 String type,
307 String classifier )
308 throws IOException
309 {
310 Artifact expandedSnapshot = this.stubFactory.createArtifact( groupId, artifactId, baseVersion, scope, type, classifier );
311
312 SnapshotTransformation tr = new SnapshotTransformation();
313 Snapshot snapshot = new Snapshot();
314 snapshot.setTimestamp( tr.getDeploymentTimestamp() );
315 snapshot.setBuildNumber( 1 );
316 RepositoryMetadata metadata = new SnapshotArtifactRepositoryMetadata( expandedSnapshot, snapshot );
317 String newVersion = snapshot.getTimestamp() + "-" + snapshot.getBuildNumber();
318 expandedSnapshot.setResolvedVersion( StringUtils.replace( baseVersion, Artifact.SNAPSHOT_VERSION, newVersion ) );
319 expandedSnapshot.addMetadata( metadata );
320 return expandedSnapshot;
321 }
322
323 private void assertArtifactExists( Artifact artifact, ArtifactRepository targetRepository ) {
324 File file = new File( targetRepository.getBasedir(),
325 targetRepository.getLayout().pathOf( artifact ) );
326 assertTrue( file.exists() );
327
328 Iterator metaIter = artifact.getMetadataList().iterator();
329 while ( metaIter.hasNext() )
330 {
331 ArtifactMetadata meta = (ArtifactMetadata) metaIter.next();
332 File metaFile = new File( targetRepository.getBasedir(),
333 targetRepository.getLayout().pathOfLocalRepositoryMetadata( meta, targetRepository) );
334 assertTrue( metaFile.exists() );
335 }
336 }
337
338 public void testSubPerArtifactRemoveVersion()
339 throws Exception
340 {
341 mojo.useSubDirectoryPerArtifact = true;
342 mojo.stripVersion = true;
343 mojo.execute();
344
345 Iterator<Artifact> iter = mojo.project.getArtifacts().iterator();
346 while ( iter.hasNext() )
347 {
348 Artifact artifact = iter.next();
349 String fileName = DependencyUtil.getFormattedFileName( artifact, true );
350 File folder = DependencyUtil.getFormattedOutputDirectory( false, false, true, false, true, mojo.outputDirectory,
351 artifact );
352 File file = new File( folder, fileName );
353 assertTrue( file.exists() );
354 }
355 }
356
357 public void testSubPerArtifactAndTypeRemoveVersion()
358 throws Exception
359 {
360 mojo.project.setArtifacts( stubFactory.getTypedArtifacts() );
361 mojo.project.setDependencyArtifacts( new HashSet<Artifact>() );
362 mojo.useSubDirectoryPerArtifact = true;
363 mojo.useSubDirectoryPerType = true;
364 mojo.stripVersion = true;
365 mojo.execute();
366
367 Iterator<Artifact> iter = mojo.project.getArtifacts().iterator();
368 while ( iter.hasNext() )
369 {
370 Artifact artifact = iter.next();
371 String fileName = DependencyUtil.getFormattedFileName( artifact, true );
372 File folder = DependencyUtil.getFormattedOutputDirectory( false, true, true, false, true, mojo.outputDirectory,
373 artifact );
374 File file = new File( folder, fileName );
375 assertTrue( file.exists() );
376 }
377 }
378
379 }