001 package org.apache.maven.model.plugin;
002
003 /*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements. See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership. The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License. You may obtain a copy of the License at
011 *
012 * http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied. See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022 import org.apache.maven.model.Build;
023 import org.apache.maven.model.Model;
024 import org.apache.maven.model.Plugin;
025 import org.apache.maven.model.PluginManagement;
026 import org.apache.maven.model.ReportPlugin;
027 import org.apache.maven.model.ReportSet;
028 import org.apache.maven.model.Reporting;
029 import org.apache.maven.model.building.ModelBuildingRequest;
030 import org.apache.maven.model.building.ModelProblemCollector;
031 import org.apache.maven.model.building.ModelProblem.Severity;
032 import org.codehaus.plexus.component.annotations.Component;
033 import org.codehaus.plexus.util.StringUtils;
034 import org.codehaus.plexus.util.xml.Xpp3Dom;
035
036 /**
037 * Handles conversion of the legacy reporting section into the configuration of the new Maven Site Plugin.
038 *
039 * @author Benjamin Bentmann
040 */
041 @Component( role = ReportingConverter.class )
042 public class DefaultReportingConverter
043 implements ReportingConverter
044 {
045
046 public void convertReporting( Model model, ModelBuildingRequest request, ModelProblemCollector problems )
047 {
048 Reporting reporting = model.getReporting();
049
050 if ( reporting == null )
051 {
052 return;
053 }
054
055 Build build = model.getBuild();
056
057 if ( build == null )
058 {
059 build = new Build();
060 model.setBuild( build );
061 }
062
063 Plugin sitePlugin = findSitePlugin( build );
064
065 if ( sitePlugin == null )
066 {
067 sitePlugin = new Plugin();
068 sitePlugin.setArtifactId( "maven-site-plugin" );
069 PluginManagement pluginManagement = build.getPluginManagement();
070 if ( pluginManagement == null )
071 {
072 pluginManagement = new PluginManagement();
073 build.setPluginManagement( pluginManagement );
074 }
075 pluginManagement.addPlugin( sitePlugin );
076 }
077
078 Xpp3Dom configuration = (Xpp3Dom) sitePlugin.getConfiguration();
079
080 if ( configuration == null )
081 {
082 configuration = new Xpp3Dom( "configuration" );
083 sitePlugin.setConfiguration( configuration );
084 }
085
086 Xpp3Dom reportPlugins = configuration.getChild( "reportPlugins" );
087
088 if ( reportPlugins != null )
089 {
090 // new-style report configuration already present, assume user handled entire conversion
091 return;
092 }
093
094 if ( configuration.getChild( "outputDirectory" ) == null )
095 {
096 addDom( configuration, "outputDirectory", reporting.getOutputDirectory() );
097 }
098
099 reportPlugins = new Xpp3Dom( "reportPlugins" );
100 configuration.addChild( reportPlugins );
101
102 boolean hasMavenProjectInfoReportsPlugin = false;
103
104 if ( !reporting.getPlugins().isEmpty()
105 && request.getValidationLevel() >= ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_3_1 )
106 {
107
108 problems.add( Severity.WARNING, "The <reporting> section is deprecated"
109 + ", please move the reports to the <configuration> section of the new Maven Site Plugin.",
110 reporting.getLocation( "" ), null );
111 }
112
113 for ( ReportPlugin plugin : reporting.getPlugins() )
114 {
115 Xpp3Dom reportPlugin = convert( plugin );
116 reportPlugins.addChild( reportPlugin );
117
118 if ( !reporting.isExcludeDefaults() && !hasMavenProjectInfoReportsPlugin
119 && "org.apache.maven.plugins".equals( plugin.getGroupId() )
120 && "maven-project-info-reports-plugin".equals( plugin.getArtifactId() ) )
121 {
122 hasMavenProjectInfoReportsPlugin = true;
123 }
124 }
125
126 if ( !reporting.isExcludeDefaults() && !hasMavenProjectInfoReportsPlugin )
127 {
128 Xpp3Dom dom = new Xpp3Dom( "reportPlugin" );
129
130 addDom( dom, "groupId", "org.apache.maven.plugins" );
131 addDom( dom, "artifactId", "maven-project-info-reports-plugin" );
132
133 reportPlugins.addChild( dom );
134 }
135 }
136
137 private Plugin findSitePlugin( Build build )
138 {
139 for ( Plugin plugin : build.getPlugins() )
140 {
141 if ( isSitePlugin( plugin ) )
142 {
143 return plugin;
144 }
145 }
146
147 PluginManagement pluginManagement = build.getPluginManagement();
148 if ( pluginManagement != null )
149 {
150 for ( Plugin plugin : pluginManagement.getPlugins() )
151 {
152 if ( isSitePlugin( plugin ) )
153 {
154 return plugin;
155 }
156 }
157 }
158
159 return null;
160 }
161
162 private boolean isSitePlugin( Plugin plugin )
163 {
164 return "maven-site-plugin".equals( plugin.getArtifactId() )
165 && "org.apache.maven.plugins".equals( plugin.getGroupId() );
166 }
167
168 private Xpp3Dom convert( ReportPlugin plugin )
169 {
170 Xpp3Dom dom = new Xpp3Dom( "reportPlugin" );
171
172 addDom( dom, "groupId", plugin.getGroupId() );
173 addDom( dom, "artifactId", plugin.getArtifactId() );
174 addDom( dom, "version", plugin.getVersion() );
175
176 Xpp3Dom configuration = (Xpp3Dom) plugin.getConfiguration();
177 if ( configuration != null )
178 {
179 configuration = new Xpp3Dom( configuration );
180 dom.addChild( configuration );
181 }
182
183 if ( !plugin.getReportSets().isEmpty() )
184 {
185 Xpp3Dom reportSets = new Xpp3Dom( "reportSets" );
186 for ( ReportSet reportSet : plugin.getReportSets() )
187 {
188 Xpp3Dom rs = convert( reportSet );
189 reportSets.addChild( rs );
190 }
191 dom.addChild( reportSets );
192 }
193
194 return dom;
195 }
196
197 private Xpp3Dom convert( ReportSet reportSet )
198 {
199 Xpp3Dom dom = new Xpp3Dom( "reportSet" );
200
201 addDom( dom, "id", reportSet.getId() );
202
203 Xpp3Dom configuration = (Xpp3Dom) reportSet.getConfiguration();
204 if ( configuration != null )
205 {
206 configuration = new Xpp3Dom( configuration );
207 dom.addChild( configuration );
208 }
209
210 if ( !reportSet.getReports().isEmpty() )
211 {
212 Xpp3Dom reports = new Xpp3Dom( "reports" );
213 for ( String report : reportSet.getReports() )
214 {
215 addDom( reports, "report", report );
216 }
217 dom.addChild( reports );
218 }
219
220 return dom;
221 }
222
223 private void addDom( Xpp3Dom parent, String childName, String childValue )
224 {
225 if ( StringUtils.isNotEmpty( childValue ) )
226 {
227 parent.addChild( newDom( childName, childValue ) );
228 }
229 }
230
231 private Xpp3Dom newDom( String name, String value )
232 {
233 Xpp3Dom dom = new Xpp3Dom( name );
234 dom.setValue( value );
235 return dom;
236 }
237
238 }