001package 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
022import org.apache.maven.model.Build;
023import org.apache.maven.model.Model;
024import org.apache.maven.model.Plugin;
025import org.apache.maven.model.PluginManagement;
026import org.apache.maven.model.ReportPlugin;
027import org.apache.maven.model.ReportSet;
028import org.apache.maven.model.Reporting;
029import org.apache.maven.model.building.ModelBuildingRequest;
030import org.apache.maven.model.building.ModelProblemCollector;
031import org.codehaus.plexus.component.annotations.Component;
032import org.codehaus.plexus.util.StringUtils;
033import org.codehaus.plexus.util.xml.Xpp3Dom;
034
035/**
036 * Handles conversion of the legacy reporting section into the configuration of the new Maven Site Plugin.
037 *
038 * @author Benjamin Bentmann
039 */
040@Component( role = ReportingConverter.class )
041public class DefaultReportingConverter
042    implements ReportingConverter
043{
044
045    public void convertReporting( Model model, ModelBuildingRequest request, ModelProblemCollector problems )
046    {
047        Reporting reporting = model.getReporting();
048
049        if ( reporting == null )
050        {
051            return;
052        }
053
054        Build build = model.getBuild();
055
056        if ( build == null )
057        {
058            build = new Build();
059            model.setBuild( build );
060        }
061
062        Plugin sitePlugin = findSitePlugin( build );
063
064        if ( sitePlugin == null )
065        {
066            sitePlugin = new Plugin();
067            sitePlugin.setArtifactId( "maven-site-plugin" );
068            PluginManagement pluginManagement = build.getPluginManagement();
069            if ( pluginManagement == null )
070            {
071                pluginManagement = new PluginManagement();
072                build.setPluginManagement( pluginManagement );
073            }
074            pluginManagement.addPlugin( sitePlugin );
075        }
076
077        Xpp3Dom configuration = (Xpp3Dom) sitePlugin.getConfiguration();
078
079        if ( configuration == null )
080        {
081            configuration = new Xpp3Dom( "configuration" );
082            sitePlugin.setConfiguration( configuration );
083        }
084
085        Xpp3Dom reportPlugins = configuration.getChild( "reportPlugins" );
086
087        if ( reportPlugins != null )
088        {
089            // new-style report configuration already present, assume user handled entire conversion
090            return;
091        }
092
093        if ( configuration.getChild( "outputDirectory" ) == null )
094        {
095            addDom( configuration, "outputDirectory", reporting.getOutputDirectory() );
096        }
097
098        reportPlugins = new Xpp3Dom( "reportPlugins" );
099        configuration.addChild( reportPlugins );
100
101        boolean hasMavenProjectInfoReportsPlugin = false;
102
103        /* waiting for MSITE-484 before deprecating <reporting> section
104        if ( !reporting.getPlugins().isEmpty()
105            && request.getValidationLevel() >= ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_3_1 )
106        {
107
108            problems.add( new ModelProblemCollectorRequest( Severity.WARNING, Version.V31 )
109                    .setMessage( "The <reporting> section is deprecated, please move the reports to the <configuration>"
110                                 + " section of the new Maven Site Plugin." )
111                    .setLocation( reporting.getLocation( "" ) ) );
112        }*/
113
114        for ( ReportPlugin plugin : reporting.getPlugins() )
115        {
116            Xpp3Dom reportPlugin = convert( plugin );
117            reportPlugins.addChild( reportPlugin );
118
119            if ( !reporting.isExcludeDefaults() && !hasMavenProjectInfoReportsPlugin
120                && "org.apache.maven.plugins".equals( plugin.getGroupId() )
121                && "maven-project-info-reports-plugin".equals( plugin.getArtifactId() ) )
122            {
123                hasMavenProjectInfoReportsPlugin = true;
124            }
125        }
126
127        if ( !reporting.isExcludeDefaults() && !hasMavenProjectInfoReportsPlugin )
128        {
129            Xpp3Dom dom = new Xpp3Dom( "reportPlugin" );
130
131            addDom( dom, "groupId", "org.apache.maven.plugins" );
132            addDom( dom, "artifactId", "maven-project-info-reports-plugin" );
133
134            reportPlugins.addChild( dom );
135        }
136    }
137
138    private Plugin findSitePlugin( Build build )
139    {
140        for ( Plugin plugin : build.getPlugins() )
141        {
142            if ( isSitePlugin( plugin ) )
143            {
144                return plugin;
145            }
146        }
147
148        PluginManagement pluginManagement = build.getPluginManagement();
149        if ( pluginManagement != null )
150        {
151            for ( Plugin plugin : pluginManagement.getPlugins() )
152            {
153                if ( isSitePlugin( plugin ) )
154                {
155                    return plugin;
156                }
157            }
158        }
159
160        return null;
161    }
162
163    private boolean isSitePlugin( Plugin plugin )
164    {
165        return "maven-site-plugin".equals( plugin.getArtifactId() )
166            && "org.apache.maven.plugins".equals( plugin.getGroupId() );
167    }
168
169    private Xpp3Dom convert( ReportPlugin plugin )
170    {
171        Xpp3Dom dom = new Xpp3Dom( "reportPlugin" );
172
173        addDom( dom, "groupId", plugin.getGroupId() );
174        addDom( dom, "artifactId", plugin.getArtifactId() );
175        addDom( dom, "version", plugin.getVersion() );
176
177        Xpp3Dom configuration = (Xpp3Dom) plugin.getConfiguration();
178        if ( configuration != null )
179        {
180            configuration = new Xpp3Dom( configuration );
181            dom.addChild( configuration );
182        }
183
184        if ( !plugin.getReportSets().isEmpty() )
185        {
186            Xpp3Dom reportSets = new Xpp3Dom( "reportSets" );
187            for ( ReportSet reportSet : plugin.getReportSets() )
188            {
189                Xpp3Dom rs = convert( reportSet );
190                reportSets.addChild( rs );
191            }
192            dom.addChild( reportSets );
193        }
194
195        return dom;
196    }
197
198    private Xpp3Dom convert( ReportSet reportSet )
199    {
200        Xpp3Dom dom = new Xpp3Dom( "reportSet" );
201
202        addDom( dom, "id", reportSet.getId() );
203
204        Xpp3Dom configuration = (Xpp3Dom) reportSet.getConfiguration();
205        if ( configuration != null )
206        {
207            configuration = new Xpp3Dom( configuration );
208            dom.addChild( configuration );
209        }
210
211        if ( !reportSet.getReports().isEmpty() )
212        {
213            Xpp3Dom reports = new Xpp3Dom( "reports" );
214            for ( String report : reportSet.getReports() )
215            {
216                addDom( reports, "report", report );
217            }
218            dom.addChild( reports );
219        }
220
221        return dom;
222    }
223
224    private void addDom( Xpp3Dom parent, String childName, String childValue )
225    {
226        if ( StringUtils.isNotEmpty( childValue ) )
227        {
228            parent.addChild( newDom( childName, childValue ) );
229        }
230    }
231
232    private Xpp3Dom newDom( String name, String value )
233    {
234        Xpp3Dom dom = new Xpp3Dom( name );
235        dom.setValue( value );
236        return dom;
237    }
238
239}