View Javadoc

1   package org.apache.maven.report.projectinfo;
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.util.ArrayList;
23  import java.util.Collections;
24  import java.util.Comparator;
25  import java.util.Iterator;
26  import java.util.List;
27  import java.util.Locale;
28  
29  import org.apache.maven.artifact.Artifact;
30  import org.apache.maven.artifact.factory.ArtifactFactory;
31  import org.apache.maven.artifact.repository.ArtifactRepository;
32  import org.apache.maven.artifact.versioning.VersionRange;
33  import org.apache.maven.doxia.sink.Sink;
34  import org.apache.maven.model.Plugin;
35  import org.apache.maven.plugin.logging.Log;
36  import org.apache.maven.project.MavenProject;
37  import org.apache.maven.project.MavenProjectBuilder;
38  import org.apache.maven.project.ProjectBuildingException;
39  import org.codehaus.plexus.i18n.I18N;
40  import org.codehaus.plexus.util.StringUtils;
41  
42  /**
43   * Generates the Project Plugin Management report.
44   *
45   * @author Nick Stolwijk
46   * @version $Id: PluginManagementReport.java 940663 2010-05-03 22:58:15Z hboutemy $
47   * @since 2.1
48   * @goal plugin-management
49   * @requiresDependencyResolution test
50   */
51  public class PluginManagementReport
52      extends AbstractProjectInfoReport
53  {
54      // ----------------------------------------------------------------------
55      // Mojo components
56      // ----------------------------------------------------------------------
57  
58      /**
59       * Maven Project Builder component.
60       *
61       * @component
62       */
63      private MavenProjectBuilder mavenProjectBuilder;
64  
65      /**
66       * Maven Artifact Factory component.
67       *
68       * @component
69       */
70      private ArtifactFactory artifactFactory;
71  
72      // ----------------------------------------------------------------------
73      // Public methods
74      // ----------------------------------------------------------------------
75  
76      /** {@inheritDoc} */
77      public void executeReport( Locale locale )
78      {
79          PluginManagementRenderer r = new PluginManagementRenderer( getLog(), getSink(), locale, i18n, project
80              .getPluginManagement().getPlugins(), project, mavenProjectBuilder, artifactFactory, localRepository );
81          r.render();
82      }
83  
84      /** {@inheritDoc} */
85      public String getOutputName()
86      {
87          return "plugin-management";
88      }
89  
90      protected String getI18Nsection()
91      {
92          return "pluginManagement";
93      }
94  
95      /** {@inheritDoc} */
96      public boolean canGenerateReport()
97      {
98          return project.getPluginManagement() != null && project.getPluginManagement().getPlugins() != null
99              && !project.getPluginManagement().getPlugins().isEmpty();
100     }
101 
102     // ----------------------------------------------------------------------
103     // Private
104     // ----------------------------------------------------------------------
105 
106     /**
107      * Internal renderer class
108      *
109      * @author Nick Stolwijk
110      */
111     protected static class PluginManagementRenderer
112         extends AbstractProjectInfoRenderer
113     {
114         private final Log log;
115 
116         private final List pluginManagement;
117 
118         private final MavenProject project;
119 
120         private final MavenProjectBuilder mavenProjectBuilder;
121 
122         private final ArtifactFactory artifactFactory;
123 
124         private final ArtifactRepository localRepository;
125 
126         /**
127          * @param log
128          * @param sink
129          * @param locale
130          * @param i18n
131          * @param plugins
132          * @param project
133          * @param mavenProjectBuilder
134          * @param artifactFactory
135          * @param localRepository
136          */
137         public PluginManagementRenderer( Log log, Sink sink, Locale locale, I18N i18n, List plugins,
138                                          MavenProject project, MavenProjectBuilder mavenProjectBuilder,
139                                          ArtifactFactory artifactFactory, ArtifactRepository localRepository )
140         {
141             super( sink, i18n, locale );
142 
143             this.log = log;
144 
145             this.pluginManagement = plugins;
146 
147             this.project = project;
148 
149             this.mavenProjectBuilder = mavenProjectBuilder;
150 
151             this.artifactFactory = artifactFactory;
152 
153             this.localRepository = localRepository;
154         }
155 
156         protected String getI18Nsection()
157         {
158             return "pluginManagement";
159         }
160 
161         /** {@inheritDoc} */
162         public void renderBody()
163         {
164             // === Section: Project PluginManagement.
165             renderSectionPluginManagement();
166         }
167 
168         private void renderSectionPluginManagement()
169         {
170             String[] tableHeader = getPluginTableHeader();
171 
172             startSection( getTitle() );
173 
174             // can't use straight artifact comparison because we want optional last
175             Collections.sort( pluginManagement, getPluginComparator() );
176 
177             startTable();
178             tableHeader( tableHeader );
179 
180             for ( Iterator iterator = pluginManagement.iterator(); iterator.hasNext(); )
181             {
182                 Plugin plugin = (Plugin) iterator.next();
183                 VersionRange versionRange;
184                 if ( StringUtils.isEmpty( plugin.getVersion() ) )
185                 {
186                     versionRange = VersionRange.createFromVersion( Artifact.RELEASE_VERSION );
187                 }
188                 else
189                 {
190                     versionRange = VersionRange.createFromVersion( plugin.getVersion() );
191                 }
192 
193                 Artifact pluginArtifact = artifactFactory.createParentArtifact( plugin.getGroupId(), plugin
194                     .getArtifactId(), versionRange.toString() );
195                 List artifactRepositories = project.getPluginArtifactRepositories();
196                 if ( artifactRepositories == null )
197                 {
198                     artifactRepositories = new ArrayList();
199                 }
200                 try
201                 {
202                     MavenProject pluginProject = mavenProjectBuilder.buildFromRepository( pluginArtifact,
203                                                                                           artifactRepositories,
204                                                                                           localRepository );
205                     tableRow( getPluginRow( pluginProject.getGroupId(), pluginProject.getArtifactId(), pluginProject
206                         .getVersion(), pluginProject.getUrl() ) );
207                 }
208                 catch ( ProjectBuildingException e )
209                 {
210                     log.info( "Could not build project for: " + plugin.getArtifactId() + ":" + e.getMessage(), e );
211                     tableRow( getPluginRow( plugin.getGroupId(), plugin.getArtifactId(), plugin.getVersion(), null ) );
212                 }
213 
214             }
215             endTable();
216 
217             endSection();
218         }
219 
220         // ----------------------------------------------------------------------
221         // Private methods
222         // ----------------------------------------------------------------------
223 
224         private String[] getPluginTableHeader()
225         {
226             // reused key...
227             String groupId = getI18nString( "dependencyManagement", "column.groupId" );
228             String artifactId = getI18nString( "dependencyManagement", "column.artifactId" );
229             String version = getI18nString( "dependencyManagement", "column.version" );
230             return new String[] { groupId, artifactId, version };
231         }
232 
233         private String[] getPluginRow( String groupId, String artifactId, String version, String link )
234         {
235             artifactId = ProjectInfoReportUtils.getArtifactIdCell( artifactId, link );
236             return new String[] { groupId, artifactId, version };
237         }
238 
239         private Comparator getPluginComparator()
240         {
241             return new Comparator()
242             {
243                 /** {@inheritDoc} */
244                 public int compare( Object o1, Object o2 )
245                 {
246                     Plugin a1 = (Plugin) o1;
247                     Plugin a2 = (Plugin) o2;
248 
249                     int result = a1.getGroupId().compareTo( a2.getGroupId() );
250                     if ( result == 0 )
251                     {
252                         result = a1.getArtifactId().compareTo( a2.getArtifactId() );
253                     }
254                     return result;
255                 }
256             };
257         }
258     }
259 }