org.codehaus.mojo.rat.RatReportMojo.java Source code

Java tutorial

Introduction

Here is the source code for org.codehaus.mojo.rat.RatReportMojo.java

Source

package org.codehaus.mojo.rat;

/*
 * 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 java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.resolver.ArtifactResolver;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.doxia.module.xhtml.decoration.render.RenderingContext;
import org.apache.maven.doxia.site.decoration.Body;
import org.apache.maven.doxia.site.decoration.DecorationModel;
import org.apache.maven.doxia.site.decoration.Skin;
import org.apache.maven.doxia.siterenderer.Renderer;
import org.apache.maven.doxia.siterenderer.RendererException;
import org.apache.maven.doxia.siterenderer.SiteRenderingContext;
import org.apache.maven.doxia.siterenderer.sink.SiteRendererSink;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.reporting.MavenReport;
import org.apache.maven.reporting.MavenReportException;
import org.codehaus.doxia.sink.Sink;

import rat.Defaults;

/**
 * Generates a report with RAT's output.
 * 
 * @goal rat
 * @requiresDependencyResolution test
 */
public class RatReportMojo extends AbstractRatMojo implements MavenReport {
    /**
     * Specifies the directory where the report will be generated
     * 
     * @parameter default-value="${project.reporting.outputDirectory}"
     * @required
     */
    private File outputDirectory;

    /**
     * @component
     */
    private Renderer siteRenderer;

    /**
     * @component
     */
    private ArtifactFactory factory;

    /**
     * @component
     */
    private ArtifactResolver resolver;

    /**
     * @parameter default-value="${localRepository}"
     * @required
     * @readonly
     */
    private ArtifactRepository localRepository;

    /**
     * Returns the skins artifact file.
     * 
     * @throws MojoFailureException
     *             An error in the plugin configuration was detected.
     * @throws MojoExecutionException
     *             An error occurred while searching for the artifact file.
     * @return Artifact file
     */
    private File getSkinArtifactFile() throws MojoFailureException, MojoExecutionException {
        Skin skin = Skin.getDefaultSkin();

        String version = skin.getVersion();
        Artifact artifact;
        try {
            if (version == null) {
                version = Artifact.RELEASE_VERSION;
            }
            VersionRange versionSpec = VersionRange.createFromVersionSpec(version);
            artifact = factory.createDependencyArtifact(skin.getGroupId(), skin.getArtifactId(), versionSpec, "jar",
                    null, null);

            resolver.resolve(artifact, getProject().getRemoteArtifactRepositories(), localRepository);
        } catch (InvalidVersionSpecificationException e) {
            throw new MojoFailureException("The skin version '" + version + "' is not valid: " + e.getMessage());
        } catch (ArtifactResolutionException e) {
            throw new MojoExecutionException("Unable to find skin", e);
        } catch (ArtifactNotFoundException e) {
            throw new MojoFailureException("The skin does not exist: " + e.getMessage());
        }

        return artifact.getFile();
    }

    /**
     * Creates the report as a string. Currently, this string will be embedded verbatimly into the report document.
     * 
     * @throws MojoFailureException
     *             An error in the plugin configuration was detected.
     * @throws MojoExecutionException
     *             An error occurred while creating the report.
     * @return Report contents
     */
    private String createReport() throws MojoExecutionException, MojoFailureException {
        StringWriter sw = new StringWriter();
        PrintWriter pw = null;
        try {
            pw = new PrintWriter(sw);
            createReport(new PrintWriter(sw), Defaults.getDefaultStyleSheet());
            final String result = sw.toString();
            pw.close();
            pw = null;
            sw.close();
            sw = null;
            return result;
        } catch (IOException e) {
            throw new MojoExecutionException(e.getMessage(), e);
        } finally {
            if (pw != null) {
                try {
                    pw.close();
                } catch (Throwable t) {
                    // Ignore me
                }
            }
            if (sw != null) {
                try {
                    sw.close();
                } catch (Throwable t) {
                    // Ignore me
                }
            }
        }
    }

    /**
     * Called from Maven to invoke the plugin.
     * 
     * @throws MojoFailureException
     *             An error in the plugin configuration was detected.
     * @throws MojoExecutionException
     *             An error occurred while creating the report.
     */
    public void execute() throws MojoExecutionException, MojoFailureException {
        DecorationModel model = new DecorationModel();
        model.setBody(new Body());
        Map attributes = new HashMap();
        attributes.put("outputEncoding", "UTF-8");
        Locale locale = Locale.getDefault();
        try {
            SiteRenderingContext siteContext = siteRenderer.createContextForSkin(getSkinArtifactFile(), attributes,
                    model, getName(locale), locale);
            RenderingContext context = new RenderingContext(outputDirectory, getOutputName() + ".html");

            SiteRendererSink sink = new SiteRendererSink(context);
            generate(sink, locale);

            outputDirectory.mkdirs();

            Writer writer = new FileWriter(new File(outputDirectory, getOutputName() + ".html"));

            siteRenderer.generateDocument(writer, sink, siteContext);

            siteRenderer.copyResources(siteContext, new File(getProject().getBasedir(), "src/site/resources"),
                    outputDirectory);
        } catch (IOException e) {
            throw new MojoExecutionException(e.getMessage(), e);
        } catch (MavenReportException e) {
            throw new MojoExecutionException(e.getMessage(), e);
        } catch (RendererException e) {
            throw new MojoExecutionException(e.getMessage(), e);
        }
    }

    /**
     * Returns, whether the report may be generated.
     * 
     * @return Always true.
     */
    public boolean canGenerateReport() {
        return true;
    }

    /**
     * Searches for a RAT artifact in the dependency list and returns its version.
     * 
     * @return Version number, if found, or null.
     */
    private String getRatVersion() {
        for (Iterator iter = getProject().getDependencyArtifacts().iterator(); iter.hasNext();) {
            Artifact a = (Artifact) iter.next();
            if ("rat-lib".equals(a.getArtifactId())) {
                return a.getVersion();
            }
        }
        return null;
    }

    /**
     * Writes the report to the Doxia sink.
     * 
     * @param sink
     *            The doxia sink, kind of a SAX handler.
     * @param locale
     *            The locale to use for writing the report.
     * @throws MavenReportException
     *             Writing the report failed.
     */
    public void generate(Sink sink, Locale locale) throws MavenReportException {
        ResourceBundle bundle = getBundle(locale);
        final String title = bundle.getString("report.rat.title");
        sink.head();
        sink.title();
        sink.text(title);
        sink.title_();
        sink.head_();

        sink.body();

        sink.section1();
        sink.sectionTitle1();
        sink.text(title);
        sink.sectionTitle1_();

        sink.paragraph();
        sink.text(bundle.getString("report.rat.link") + " ");
        sink.link(bundle.getString("report.rat.url"));
        sink.text(bundle.getString("report.rat.fullName"));
        sink.link_();
        final String ratVersion = getRatVersion();
        if (ratVersion != null) {
            sink.text(" " + ratVersion);
        }
        sink.text(".");
        sink.paragraph_();

        sink.paragraph();
        sink.verbatim(true);
        try {
            sink.text(createReport());
        } catch (MojoExecutionException e) {
            throw new MavenReportException(e.getMessage(), e);
        } catch (MojoFailureException e) {
            throw new MavenReportException(e.getMessage(), e);
        }
        sink.verbatim_();
        sink.paragraph_();
        sink.body_();
    }

    /**
     * Returns the reports category name.
     * 
     * @return {@link MavenReport#CATEGORY_PROJECT_REPORTS}
     */
    public String getCategoryName() {
        return MavenReport.CATEGORY_PROJECT_REPORTS;
    }

    /**
     * Returns the reports bundle
     * 
     * @param locale
     *            Requested locale of the bundle
     * @return The bundle, which is used to read localized strings.
     */
    private ResourceBundle getBundle(Locale locale) {
        return ResourceBundle.getBundle("org/codehaus/mojo/rat/rat-report", locale, getClass().getClassLoader());
    }

    /**
     * Returns the reports description.
     * 
     * @param locale
     *            Requested locale of the bundle
     * @return Report description, as given by the key "report.rat.description" in the bundle.
     */
    public String getDescription(Locale locale) {
        return getBundle(locale).getString("report.rat.description");
    }

    /**
     * Returns the reports name.
     * 
     * @param locale
     *            Requested locale of the bundle
     * @return Report name, as given by the key "report.rat.name" in the bundle.
     */
    public String getName(Locale locale) {
        return getBundle(locale).getString("report.rat.name");
    }

    /**
     * Returns the reports file name.
     * 
     * @return "rat-report"
     */
    public String getOutputName() {
        return "rat-report";
    }

    /**
     * Returns the reports output directory.
     * 
     * @return Value of the "outputDirectory" parameter.
     */
    public File getReportOutputDirectory() {
        return outputDirectory;
    }

    /**
     * Returns, whether this is an external report.
     * 
     * @return Always false.
     */
    public boolean isExternalReport() {
        return false;
    }

    /**
     * Sets the reports output directory.
     * 
     * @param pOutputDirectory
     *            Reports target directory.
     */
    public void setReportOutputDirectory(File pOutputDirectory) {
        outputDirectory = pOutputDirectory;
    }
}