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.codehaus.plexus.component.annotations.Component;
032    import org.codehaus.plexus.util.StringUtils;
033    import 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 )
041    public 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> section of the new Maven Site Plugin." )
110                        .setLocation( reporting.getLocation( "" ) ) );
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    }