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 artifacts = this.stubFactory.getScopedArtifacts();
65          Set 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() );
93          mojo.includeScope = "compile";
94          mojo.execute();
95          ScopeArtifactFilter saf = new ScopeArtifactFilter( mojo.includeScope );
96  
97          Iterator iter = mojo.project.getArtifacts().iterator();
98          while ( iter.hasNext() )
99          {
100             Artifact 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() );
113         mojo.includeScope = "test";
114 
115         mojo.execute();
116         ScopeArtifactFilter saf = new ScopeArtifactFilter( mojo.includeScope );
117 
118         Iterator iter = mojo.project.getArtifacts().iterator();
119         while ( iter.hasNext() )
120         {
121             Artifact 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() );
134         mojo.includeScope = "runtime";
135         mojo.execute();
136         ScopeArtifactFilter saf = new ScopeArtifactFilter( mojo.includeScope );
137 
138         Iterator iter = mojo.project.getArtifacts().iterator();
139         while ( iter.hasNext() )
140         {
141             Artifact 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() );
154         mojo.includeScope = "provided";
155 
156         mojo.execute();
157         Iterator iter = mojo.project.getArtifacts().iterator();
158         while ( iter.hasNext() )
159         {
160             Artifact 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() );
172         mojo.includeScope = "system";
173 
174         mojo.execute();
175 
176         Iterator iter = mojo.project.getArtifacts().iterator();
177         while ( iter.hasNext() )
178         {
179             Artifact 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 iter = mojo.project.getArtifacts().iterator();
194         while ( iter.hasNext() )
195         {
196             Artifact artifact = (Artifact) iter.next();
197             String fileName = DependencyUtil.getFormattedFileName( artifact, false );
198             File folder = DependencyUtil.getFormattedOutputDirectory( 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() );
210         mojo.useSubDirectoryPerArtifact = true;
211         mojo.useSubDirectoryPerType = true;
212         mojo.execute();
213 
214         Iterator iter = mojo.project.getArtifacts().iterator();
215         while ( iter.hasNext() )
216         {
217             Artifact artifact = (Artifact) iter.next();
218             String fileName = DependencyUtil.getFormattedFileName( artifact, false );
219             File folder = DependencyUtil.getFormattedOutputDirectory( 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 testRepositoryLayout()
227         throws Exception
228     {
229     	String baseVersion = "2.0-SNAPSHOT";
230 		String groupId = "testGroupId";
231 		String artifactId = "expanded-snapshot";
232 
233 		Artifact expandedSnapshot = createExpandedVersionArtifact( baseVersion,
234 				                                                   groupId, 
235 				                                                   artifactId,
236 				                                                   "compile",
237 				                                                   "jar",
238 				                                                   null);
239 
240     	mojo.project.getArtifacts().add(expandedSnapshot);
241     	mojo.project.getDependencyArtifacts().add(expandedSnapshot);
242 
243 		Artifact pomExpandedSnapshot = createExpandedVersionArtifact( baseVersion,
244 													                  groupId, 
245 													                  artifactId,
246 													                  "compile",
247 													                  "pom",
248 													                  null);
249     	mojo.project.getArtifacts().add(pomExpandedSnapshot);
250     	mojo.project.getDependencyArtifacts().add(pomExpandedSnapshot);
251 
252         mojo.useRepositoryLayout = true;
253         mojo.execute();
254         
255         File outputDirectory = mojo.outputDirectory;
256 		ArtifactRepository targetRepository = mojo.repositoryFactory.createDeploymentArtifactRepository( 
257         		"local", 
258         		outputDirectory.toURL().toExternalForm(), 
259                 new DefaultRepositoryLayout(),
260                 false );
261 
262         Iterator iter = mojo.project.getArtifacts().iterator();
263         while ( iter.hasNext() )
264         {
265             Artifact artifact = (Artifact) iter.next();
266 			assertArtifactExists( artifact, targetRepository );
267             
268             if ( ! artifact.getBaseVersion().equals( artifact.getVersion() ) )
269             {
270             	Artifact baseArtifact = mojo.factory.createArtifact( artifact.getGroupId(), 
271 						            			                     artifact.getArtifactId(),
272 						            			                     artifact.getBaseVersion(),
273 						            			                     artifact.getScope(),
274 						            			                     artifact.getType() );
275     			assertArtifactExists( baseArtifact, targetRepository );
276             }
277 
278         }
279     }
280 
281 	private Artifact createExpandedVersionArtifact( String baseVersion,
282 			                                        String groupId, 
283 			                                        String artifactId,
284 			                                        String scope,
285 			                                        String type, 
286 			                                        String classifier ) 
287 			throws IOException 
288 	{
289 		Artifact expandedSnapshot = this.stubFactory.createArtifact( groupId, artifactId, baseVersion, scope, type, classifier );
290 
291     	SnapshotTransformation tr = new SnapshotTransformation();
292         Snapshot snapshot = new Snapshot();
293         snapshot.setTimestamp( tr.getDeploymentTimestamp() );
294         snapshot.setBuildNumber( 1 );
295         RepositoryMetadata metadata = new SnapshotArtifactRepositoryMetadata( expandedSnapshot, snapshot );
296         String newVersion = snapshot.getTimestamp() + "-" + snapshot.getBuildNumber();
297         expandedSnapshot.setResolvedVersion( StringUtils.replace( baseVersion, Artifact.SNAPSHOT_VERSION, newVersion ) );
298         expandedSnapshot.addMetadata( metadata );
299 		return expandedSnapshot;
300 	}
301 
302 	private void assertArtifactExists( Artifact artifact, ArtifactRepository targetRepository ) {
303 		File file = new File( targetRepository.getBasedir(), 
304 							  targetRepository.getLayout().pathOf( artifact ) );
305 		assertTrue( file.exists() );
306 
307 		Iterator metaIter = artifact.getMetadataList().iterator();
308         while ( metaIter.hasNext() )
309         {
310         	ArtifactMetadata meta = (ArtifactMetadata) metaIter.next();
311 			File metaFile = new File( targetRepository.getBasedir(), 
312 									  targetRepository.getLayout().pathOfLocalRepositoryMetadata( meta, targetRepository) );
313 			assertTrue( metaFile.exists() );
314         }
315 	}
316 
317     public void testSubPerArtifactRemoveVersion()
318         throws Exception
319     {
320         mojo.useSubDirectoryPerArtifact = true;
321         mojo.stripVersion = true;
322         mojo.execute();
323 
324         Iterator iter = mojo.project.getArtifacts().iterator();
325         while ( iter.hasNext() )
326         {
327             Artifact artifact = (Artifact) iter.next();
328             String fileName = DependencyUtil.getFormattedFileName( artifact, true );
329             File folder = DependencyUtil.getFormattedOutputDirectory( false, true, false, true, mojo.outputDirectory,
330                                                                       artifact );
331             File file = new File( folder, fileName );
332             assertTrue( file.exists() );
333         }
334     }
335 
336     public void testSubPerArtifactAndTypeRemoveVersion()
337         throws Exception
338     {
339         mojo.project.setArtifacts( stubFactory.getTypedArtifacts() );
340         mojo.project.setDependencyArtifacts( new HashSet() );
341         mojo.useSubDirectoryPerArtifact = true;
342         mojo.useSubDirectoryPerType = true;
343         mojo.stripVersion = true;
344         mojo.execute();
345 
346         Iterator iter = mojo.project.getArtifacts().iterator();
347         while ( iter.hasNext() )
348         {
349             Artifact artifact = (Artifact) iter.next();
350             String fileName = DependencyUtil.getFormattedFileName( artifact, true );
351             File folder = DependencyUtil.getFormattedOutputDirectory( true, true, false, true, mojo.outputDirectory,
352                                                                       artifact );
353             File file = new File( folder, fileName );
354             assertTrue( file.exists() );
355         }
356     }
357 
358 }