View Javadoc
1   package org.apache.maven.shared.release.phase;
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 javax.inject.Inject;
23  import javax.inject.Named;
24  import javax.inject.Singleton;
25  
26  import java.io.File;
27  import java.io.IOException;
28  import java.util.List;
29  
30  import org.apache.maven.project.MavenProject;
31  import org.apache.maven.scm.ScmException;
32  import org.apache.maven.scm.ScmFileSet;
33  import org.apache.maven.scm.command.edit.EditScmResult;
34  import org.apache.maven.scm.manager.NoSuchScmProviderException;
35  import org.apache.maven.scm.provider.ScmProvider;
36  import org.apache.maven.scm.repository.ScmRepository;
37  import org.apache.maven.scm.repository.ScmRepositoryException;
38  import org.apache.maven.shared.release.ReleaseExecutionException;
39  import org.apache.maven.shared.release.ReleaseFailureException;
40  import org.apache.maven.shared.release.ReleaseResult;
41  import org.apache.maven.shared.release.config.ReleaseDescriptor;
42  import org.apache.maven.shared.release.env.ReleaseEnvironment;
43  import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
44  import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
45  import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
46  import org.apache.maven.shared.release.util.ReleaseUtil;
47  import org.codehaus.plexus.util.FileUtils;
48  
49  import static java.util.Objects.requireNonNull;
50  
51  /**
52   * @author Edwin Punzalan
53   */
54  @Singleton
55  @Named( "restore-backup-poms" )
56  public class RestoreBackupPomsPhase
57          extends AbstractBackupPomsPhase
58  {
59      /**
60       * Tool that gets a configured SCM repository from release configuration.
61       */
62      private final ScmRepositoryConfigurator scmRepositoryConfigurator;
63  
64      @Inject
65      public RestoreBackupPomsPhase( ScmRepositoryConfigurator scmRepositoryConfigurator )
66      {
67          this.scmRepositoryConfigurator = requireNonNull( scmRepositoryConfigurator );
68      }
69  
70      @Override
71      public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
72                                    List<MavenProject> reactorProjects )
73              throws ReleaseExecutionException, ReleaseFailureException
74      {
75          ReleaseResult result = new ReleaseResult();
76  
77          for ( MavenProject project : reactorProjects )
78          {
79              restorePomBackup( releaseDescriptor, releaseEnvironment, project );
80          }
81  
82          result.setResultCode( ReleaseResult.SUCCESS );
83  
84          return result;
85      }
86  
87      @Override
88      public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
89                                     List<MavenProject> reactorProjects )
90              throws ReleaseExecutionException, ReleaseFailureException
91      {
92          return execute( releaseDescriptor, releaseEnvironment, reactorProjects );
93      }
94  
95      protected void restorePomBackup( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
96                                       MavenProject project )
97              throws ReleaseExecutionException, ReleaseFailureException
98      {
99          File pomBackup = getPomBackup( project );
100 
101         if ( !pomBackup.exists() )
102         {
103             throw new ReleaseExecutionException(
104                     "Cannot restore from a missing backup POM: " + pomBackup.getAbsolutePath() );
105         }
106 
107         try
108         {
109             ScmRepository scmRepository;
110             ScmProvider provider;
111             try
112             {
113                 scmRepository =
114                         scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor,
115                                 releaseEnvironment.getSettings() );
116 
117                 provider = scmRepositoryConfigurator.getRepositoryProvider( scmRepository );
118             }
119             catch ( ScmRepositoryException e )
120             {
121                 throw new ReleaseScmRepositoryException( e.getMessage(), e.getValidationMessages() );
122             }
123             catch ( NoSuchScmProviderException e )
124             {
125                 throw new ReleaseExecutionException( "Unable to configure SCM repository: " + e.getMessage(), e );
126             }
127 
128             if ( releaseDescriptor.isScmUseEditMode() || provider.requiresEditMode() )
129             {
130                 EditScmResult result = provider.edit( scmRepository, new ScmFileSet(
131                         new File( releaseDescriptor.getWorkingDirectory() ), project.getFile() ) );
132 
133                 if ( !result.isSuccess() )
134                 {
135                     throw new ReleaseScmCommandException( "Unable to enable editing on the POM", result );
136                 }
137             }
138         }
139         catch ( ScmException e )
140         {
141             throw new ReleaseExecutionException( "An error occurred enabling edit mode: " + e.getMessage(), e );
142         }
143 
144         try
145         {
146             FileUtils.copyFile( getPomBackup( project ), ReleaseUtil.getStandardPom( project ) );
147         }
148         catch ( IOException e )
149         {
150             throw new ReleaseExecutionException( "Error restoring from backup POM: " + e.getMessage(), e );
151         }
152     }
153 }