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    }