1   package org.apache.maven.shared.transfer.project.deploy.internal;
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.ArrayList;
25  import java.util.Collection;
26  import java.util.List;
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.project.ProjectBuildingRequest;
32  import org.apache.maven.project.artifact.ProjectArtifactMetadata;
33  import org.apache.maven.shared.transfer.artifact.deploy.ArtifactDeployer;
34  import org.apache.maven.shared.transfer.artifact.deploy.ArtifactDeployerException;
35  import org.apache.maven.shared.transfer.project.MavenAetherUtils;
36  import org.apache.maven.shared.transfer.project.NoFileAssignedException;
37  import org.apache.maven.shared.transfer.project.deploy.ProjectDeployer;
38  import org.apache.maven.shared.transfer.project.deploy.ProjectDeployerRequest;
39  import org.apache.maven.shared.transfer.repository.RepositoryManager;
40  import org.codehaus.plexus.component.annotations.Component;
41  import org.codehaus.plexus.component.annotations.Requirement;
42  import org.codehaus.plexus.util.FileUtils;
43  import org.slf4j.Logger;
44  import org.slf4j.LoggerFactory;
45  
46  
47  
48  
49  
50  
51  
52  @Component( role = ProjectDeployer.class )
53  class DefaultProjectDeployer
54      implements ProjectDeployer
55  {
56      private static final Logger LOGGER = LoggerFactory.getLogger( DefaultProjectDeployer.class );
57  
58      @Requirement
59      private ArtifactDeployer deployer;
60  
61      @Requirement
62      private RepositoryManager repositoryManager;
63  
64      private final DualDigester digester = new DualDigester();
65  
66      
67  
68  
69      public void deploy( ProjectBuildingRequest buildingRequest, ProjectDeployerRequest projectDeployerRequest,
70                          ArtifactRepository artifactRepository )
71          throws NoFileAssignedException, IllegalArgumentException, ArtifactDeployerException
72      {
73          validateParameters( buildingRequest, projectDeployerRequest, artifactRepository );
74  
75          MavenAetherUtils.importAetherLibrary();
76  
77          Artifact artifact = projectDeployerRequest.getProject().getArtifact();
78          String packaging = projectDeployerRequest.getProject().getPackaging();
79          File pomFile = projectDeployerRequest.getProject().getFile();
80  
81          List<Artifact> attachedArtifacts = projectDeployerRequest.getProject().getAttachedArtifacts();
82  
83          
84          boolean isPomArtifact = "pom".equals( packaging );
85          if ( isPomArtifact )
86          {
87              artifact.setFile( pomFile );
88          }
89          else
90          {
91              ProjectArtifactMetadata metadata = new ProjectArtifactMetadata( artifact, pomFile );
92              artifact.addMetadata( metadata );
93          }
94  
95          
96          
97  
98          artifact.setRepository( artifactRepository );
99  
100         int retryFailedDeploymentCount = projectDeployerRequest.getRetryFailedDeploymentCount();
101 
102         List<Artifact> deployableArtifacts = new ArrayList<Artifact>();
103         if ( isPomArtifact )
104         {
105             deployableArtifacts.add( artifact );
106         }
107         else
108         {
109             File file = artifact.getFile();
110 
111             if ( file != null && file.isFile() )
112             {
113                 deployableArtifacts.add( artifact );
114             }
115             else if ( !attachedArtifacts.isEmpty() )
116             {
117                 
118                 throw new NoFileAssignedException( "The packaging plugin for this project did not assign "
119                     + "a main file to the project but it has attachments. Change packaging to 'pom'." );
120             }
121             else
122             {
123                 
124                 throw new NoFileAssignedException( "The packaging for this project did not assign "
125                     + "a file to the build artifact" );
126             }
127         }
128 
129         for ( Artifact attached : attachedArtifacts )
130         {
131             deployableArtifacts.add( attached );
132         }
133 
134         installChecksumsForAllArtifacts( buildingRequest, deployableArtifacts );
135         deploy( buildingRequest, deployableArtifacts, artifactRepository, retryFailedDeploymentCount );
136     }
137 
138     private void validateParameters( ProjectBuildingRequest buildingRequest,
139                                      ProjectDeployerRequest projectDeployerRequest,
140                                      ArtifactRepository artifactRepository )
141     {
142         if ( buildingRequest == null )
143         {
144             throw new IllegalArgumentException( "The parameter buildingRequest is not allowed to be null." );
145         }
146         if ( projectDeployerRequest == null )
147         {
148             throw new IllegalArgumentException( "The parameter projectDeployerRequest is not allowed to be null." );
149         }
150         if ( artifactRepository == null )
151         {
152             throw new IllegalArgumentException( "The parameter artifactRepository is not allowed to be null." );
153         }
154     }
155 
156     private void installChecksumsForAllArtifacts( ProjectBuildingRequest request, Collection<Artifact> artifacts )
157     {
158         for ( Artifact item : artifacts )
159         {
160             try
161             {
162                 LOGGER.debug( "Installing checksum for " + item.getId() );
163                 installChecksums( request, item );
164             }
165             catch ( IOException e )
166             {
167                 
168                 LOGGER.error( "Failure during checksum generation for " + item.getId() );
169             }
170         }
171     }
172 
173     private void deploy( ProjectBuildingRequest request, Collection<Artifact> artifacts,
174                          ArtifactRepository deploymentRepository, int retryFailedDeploymentCount )
175         throws ArtifactDeployerException
176     {
177 
178         
179         int retryFailedDeploymentCounter = Math.max( 1, Math.min( 10, retryFailedDeploymentCount ) );
180         ArtifactDeployerException exception = null;
181         for ( int count = 0; count < retryFailedDeploymentCounter; count++ )
182         {
183             try
184             {
185                 if ( count > 0 )
186                 {
187                     LOGGER.info( "Retrying deployment attempt " + ( count + 1 ) + " of "
188                         + retryFailedDeploymentCounter );
189                 }
190 
191                 deployer.deploy( request, deploymentRepository, artifacts );
192                 exception = null;
193                 break;
194             }
195             catch ( ArtifactDeployerException e )
196             {
197                 if ( count + 1 < retryFailedDeploymentCounter )
198                 {
199                     LOGGER.warn( "Encountered issue during deployment: " + e.getLocalizedMessage() );
200                     LOGGER.debug( e.getMessage() );
201                 }
202                 if ( exception == null )
203                 {
204                     exception = e;
205                 }
206             }
207         }
208         if ( exception != null )
209         {
210             throw exception;
211         }
212     }
213 
214     
215 
216 
217 
218 
219     private void installChecksums( ProjectBuildingRequest buildingRequest, Artifact artifact )
220         throws IOException
221     {
222         File artifactFile = getLocalRepoFile( buildingRequest, artifact );
223         installChecksums( artifactFile );
224     }
225 
226     
227 
228 
229 
230 
231 
232     private void installChecksums( Collection<File> metadataFiles )
233         throws IOException
234     {
235         for ( File metadataFile : metadataFiles )
236         {
237             installChecksums( metadataFile );
238         }
239     }
240 
241     
242 
243 
244 
245 
246 
247 
248     private void installChecksums( File installedFile )
249         throws IOException
250     {
251         boolean signatureFile = installedFile.getName().endsWith( ".asc" );
252         if ( installedFile.isFile() && !signatureFile )
253         {
254             LOGGER.debug( "Calculating checksums for " + installedFile );
255             digester.calculate( installedFile );
256             installChecksum( installedFile, ".md5", digester.getMd5() );
257             installChecksum( installedFile, ".sha1", digester.getSha1() );
258         }
259     }
260 
261     
262 
263 
264 
265 
266 
267 
268 
269 
270 
271     private void installChecksum( File installedFile, String ext, String checksum )
272         throws IOException
273     {
274         File checksumFile = new File( installedFile.getAbsolutePath() + ext );
275         LOGGER.debug( "Installing checksum to " + checksumFile );
276         try
277         {
278             
279             checksumFile.getParentFile().mkdirs();
280             FileUtils.fileWrite( checksumFile.getAbsolutePath(), "UTF-8", checksum );
281         }
282         catch ( IOException e )
283         {
284             throw new IOException( "Failed to install checksum to " + checksumFile, e );
285         }
286     }
287 
288     
289 
290 
291 
292 
293 
294 
295 
296     private File getLocalRepoFile( ProjectBuildingRequest buildingRequest, Artifact artifact )
297     {
298         String path = repositoryManager.getPathForLocalArtifact( buildingRequest, artifact );
299         return new File( repositoryManager.getLocalRepositoryBasedir( buildingRequest ), path );
300     }
301 
302     
303 
304 
305 
306 
307 
308 
309 
310     private File getLocalRepoFile( ProjectBuildingRequest buildingRequest, ArtifactMetadata metadata )
311     {
312         String path = repositoryManager.getPathForLocalMetadata( buildingRequest, metadata );
313         return new File( repositoryManager.getLocalRepositoryBasedir( buildingRequest ), path );
314     }
315 
316 }