View Javadoc

1   package org.apache.maven.plugin.dependency;
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 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          // required for mojo lookups to work
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          // mojo.silent = true;
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 }