| package org.apache.maven.model.plugin; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| import javax.inject.Named; |
| import javax.inject.Singleton; |
| |
| import org.apache.maven.model.Build; |
| import org.apache.maven.model.InputLocation; |
| import org.apache.maven.model.InputSource; |
| import org.apache.maven.model.Model; |
| import org.apache.maven.model.Plugin; |
| import org.apache.maven.model.PluginManagement; |
| import org.apache.maven.model.ReportPlugin; |
| import org.apache.maven.model.ReportSet; |
| import org.apache.maven.model.Reporting; |
| import org.apache.maven.model.building.ModelBuildingRequest; |
| import org.apache.maven.model.building.ModelProblemCollector; |
| import org.apache.maven.model.building.ModelProblemCollectorRequest; |
| import org.apache.maven.model.building.ModelProblem.Severity; |
| import org.apache.maven.model.building.ModelProblem.Version; |
| import org.codehaus.plexus.util.StringUtils; |
| import org.codehaus.plexus.util.xml.Xpp3Dom; |
| |
| /** |
| * Handles conversion of the <code><reporting></code> section into the configuration of Maven Site Plugin 3.x, |
| * i.e. <code>reportPlugins</code> and <code>outputDirectory</code> parameters. |
| * |
| * @author Benjamin Bentmann |
| */ |
| @Named |
| @Singleton |
| public class DefaultReportingConverter |
| implements ReportingConverter |
| { |
| private final InputLocation location; |
| { |
| String modelId = "org.apache.maven:maven-model-builder:" |
| + this.getClass().getPackage().getImplementationVersion() + ":reporting-converter"; |
| InputSource inputSource = new InputSource(); |
| inputSource.setModelId( modelId ); |
| location = new InputLocation( -1, -1, inputSource ); |
| location.setLocation( 0, location ); |
| } |
| |
| @Override |
| public void convertReporting( Model model, ModelBuildingRequest request, ModelProblemCollector problems ) |
| { |
| Reporting reporting = model.getReporting(); |
| |
| if ( reporting == null ) |
| { |
| return; |
| } |
| |
| Build build = model.getBuild(); |
| |
| if ( build == null ) |
| { |
| build = new Build(); |
| model.setBuild( build ); |
| model.setLocation( "build", location ); |
| } |
| |
| Plugin sitePlugin = findSitePlugin( build ); |
| |
| if ( sitePlugin == null ) |
| { |
| sitePlugin = new Plugin(); |
| sitePlugin.setArtifactId( "maven-site-plugin" ); |
| sitePlugin.setLocation( "artifactId", location ); |
| PluginManagement pluginManagement = build.getPluginManagement(); |
| if ( pluginManagement == null ) |
| { |
| pluginManagement = new PluginManagement(); |
| build.setPluginManagement( pluginManagement ); |
| } |
| pluginManagement.addPlugin( sitePlugin ); |
| } |
| |
| Xpp3Dom configuration = (Xpp3Dom) sitePlugin.getConfiguration(); |
| |
| if ( configuration == null ) |
| { |
| configuration = new Xpp3Dom( "configuration", location ); |
| sitePlugin.setConfiguration( configuration ); |
| } |
| |
| Xpp3Dom reportPlugins = configuration.getChild( "reportPlugins" ); |
| |
| if ( reportPlugins != null ) |
| { |
| // new-style report configuration already present: warn since this new style has been deprecated |
| // in favor of classical reporting section MSITE-647 / MSITE-684 |
| problems.add( new ModelProblemCollectorRequest( Severity.WARNING, Version.BASE ) |
| .setMessage( "Reporting configuration should be done in <reporting> section, " |
| + "not in maven-site-plugin <configuration> as reportPlugins parameter." ) |
| .setLocation( sitePlugin.getLocation( "configuration" ) ) ); |
| return; |
| } |
| |
| if ( configuration.getChild( "outputDirectory" ) == null ) |
| { |
| addDom( configuration, "outputDirectory", reporting.getOutputDirectory(), |
| reporting.getLocation( "outputDirectory" ) ); |
| } |
| |
| reportPlugins = new Xpp3Dom( "reportPlugins", location ); |
| configuration.addChild( reportPlugins ); |
| |
| boolean hasMavenProjectInfoReportsPlugin = false; |
| |
| /* waiting for MSITE-484 before deprecating <reporting> section |
| if ( !reporting.getPlugins().isEmpty() |
| && request.getValidationLevel() >= ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_3_1 ) |
| { |
| |
| problems.add( new ModelProblemCollectorRequest( Severity.WARNING, Version.V31 ) |
| .setMessage( "The <reporting> section is deprecated, please move the reports to the <configuration>" |
| + " section of the new Maven Site Plugin." ) |
| .setLocation( reporting.getLocation( "" ) ) ); |
| }*/ |
| |
| for ( ReportPlugin plugin : reporting.getPlugins() ) |
| { |
| Xpp3Dom reportPlugin = convert( plugin ); |
| reportPlugins.addChild( reportPlugin ); |
| |
| if ( !reporting.isExcludeDefaults() && !hasMavenProjectInfoReportsPlugin |
| && "org.apache.maven.plugins".equals( plugin.getGroupId() ) |
| && "maven-project-info-reports-plugin".equals( plugin.getArtifactId() ) ) |
| { |
| hasMavenProjectInfoReportsPlugin = true; |
| } |
| } |
| |
| if ( !reporting.isExcludeDefaults() && !hasMavenProjectInfoReportsPlugin ) |
| { |
| Xpp3Dom dom = new Xpp3Dom( "reportPlugin", location ); |
| |
| addDom( dom, "groupId", "org.apache.maven.plugins" ); |
| addDom( dom, "artifactId", "maven-project-info-reports-plugin" ); |
| |
| reportPlugins.addChild( dom ); |
| } |
| } |
| |
| private Plugin findSitePlugin( Build build ) |
| { |
| for ( Plugin plugin : build.getPlugins() ) |
| { |
| if ( isSitePlugin( plugin ) ) |
| { |
| return plugin; |
| } |
| } |
| |
| PluginManagement pluginManagement = build.getPluginManagement(); |
| if ( pluginManagement != null ) |
| { |
| for ( Plugin plugin : pluginManagement.getPlugins() ) |
| { |
| if ( isSitePlugin( plugin ) ) |
| { |
| return plugin; |
| } |
| } |
| } |
| |
| return null; |
| } |
| |
| private boolean isSitePlugin( Plugin plugin ) |
| { |
| return "maven-site-plugin".equals( plugin.getArtifactId() ) |
| && "org.apache.maven.plugins".equals( plugin.getGroupId() ); |
| } |
| |
| private Xpp3Dom convert( ReportPlugin plugin ) |
| { |
| Xpp3Dom dom = new Xpp3Dom( "reportPlugin", plugin.getLocation( "" ) ); |
| |
| addDom( dom, "groupId", plugin.getGroupId(), plugin.getLocation( "groupId" ) ); |
| addDom( dom, "artifactId", plugin.getArtifactId(), plugin.getLocation( "artifactId" ) ); |
| addDom( dom, "version", plugin.getVersion(), plugin.getLocation( "version" ) ); |
| |
| Xpp3Dom configuration = (Xpp3Dom) plugin.getConfiguration(); |
| if ( configuration != null ) |
| { |
| configuration = new Xpp3Dom( configuration ); |
| dom.addChild( configuration ); |
| } |
| |
| if ( !plugin.getReportSets().isEmpty() ) |
| { |
| Xpp3Dom reportSets = new Xpp3Dom( "reportSets", plugin.getLocation( "reportSets" ) ); |
| for ( ReportSet reportSet : plugin.getReportSets() ) |
| { |
| Xpp3Dom rs = convert( reportSet ); |
| reportSets.addChild( rs ); |
| } |
| dom.addChild( reportSets ); |
| } |
| |
| return dom; |
| } |
| |
| private Xpp3Dom convert( ReportSet reportSet ) |
| { |
| Xpp3Dom dom = new Xpp3Dom( "reportSet", reportSet.getLocation( "" ) ); |
| |
| InputLocation idLocation = reportSet.getLocation( "id" ); |
| addDom( dom, "id", reportSet.getId(), idLocation == null ? location : idLocation ); |
| |
| Xpp3Dom configuration = (Xpp3Dom) reportSet.getConfiguration(); |
| if ( configuration != null ) |
| { |
| configuration = new Xpp3Dom( configuration ); |
| dom.addChild( configuration ); |
| } |
| |
| if ( !reportSet.getReports().isEmpty() ) |
| { |
| InputLocation location = reportSet.getLocation( "reports" ); |
| Xpp3Dom reports = new Xpp3Dom( "reports", location ); |
| int n = 0; |
| for ( String report : reportSet.getReports() ) |
| { |
| addDom( reports, "report", report, ( location == null ) ? null : location.getLocation( n++ ) ); |
| } |
| dom.addChild( reports ); |
| } |
| |
| return dom; |
| } |
| |
| private void addDom( Xpp3Dom parent, String childName, String childValue ) |
| { |
| addDom( parent, childName, childValue, location ); |
| } |
| |
| private void addDom( Xpp3Dom parent, String childName, String childValue, InputLocation location ) |
| { |
| if ( StringUtils.isNotEmpty( childValue ) ) |
| { |
| parent.addChild( newDom( childName, childValue, location ) ); |
| } |
| } |
| |
| private Xpp3Dom newDom( String name, String value, InputLocation location ) |
| { |
| Xpp3Dom dom = new Xpp3Dom( name, location ); |
| dom.setValue( value ); |
| return dom; |
| } |
| |
| } |