org.codehaus.mojo.javancss.NcssReportGenerator.java Source code

Java tutorial

Introduction

Here is the source code for org.codehaus.mojo.javancss.NcssReportGenerator.java

Source

package org.codehaus.mojo.javancss;

/*
 * 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.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.ResourceBundle;

import org.apache.maven.plugin.logging.Log;
import org.codehaus.doxia.sink.Sink;
import org.dom4j.Document;
import org.dom4j.Node;

/**
 * Generates the javaNcss maven report.
 *
 * @author <a href="jeanlaurentATgmail.com">Jean-Laurent de Morlhon</a>
 * @version $Id$
 */
public class NcssReportGenerator extends AbstractNcssReportGenerator {
    private String xrefLocation;

    private int lineThreshold;

    /**
     * build a new NcssReportGenerator.
     *
     * @param sink the sink which will be used for reporting.
     * @param bundle the correct RessourceBundle to be used for reporting.
     * @param log the log to output log with.
     * @param xrefLocation the location of the xref file.
     */
    public NcssReportGenerator(Sink sink, ResourceBundle bundle, Log log, String xrefLocation) {
        super(sink, bundle, log);
        this.xrefLocation = xrefLocation;
    }

    /**
     * Generates the JavaNcss reports.
     *
     * @param document the javaNcss raw report as an XML document.
     * @param lineThreshold the maximum number of lines to keep in major reports.
     */
    public void doReport(Document document, int lineThreshold) {
        this.lineThreshold = lineThreshold;
        // HEADER
        getSink().head();
        getSink().title();
        getSink().text(getString("report.javancss.title"));
        getSink().title_();
        getSink().head_();
        // BODY
        getSink().body();
        doIntro(true);
        // packages
        startSection("report.javancss.package.link", "report.javancss.package.title");
        doMainPackageAnalysis(document);
        doTotalPackageAnalysis(document);
        endSection();
        // Objects
        startSection("report.javancss.object.link", "report.javancss.object.title");
        doTopObjectNcss(document);
        doTopObjectFunctions(document);
        doObjectAverage(document);
        endSection();
        // Functions
        startSection("report.javancss.function.link", "report.javancss.function.title");
        doFunctionAnalysis(document);
        doFunctionAverage(document);
        endSection();
        // Explanation
        startSection("report.javancss.explanation.link", "report.javancss.explanation.title");
        doExplanation();
        endSection();
        getSink().body_();
        getSink().close();
    }

    private void doMainPackageAnalysis(Document document) {
        subtitleHelper(getString("report.javancss.package.text"));
        getSink().table();
        getSink().tableRow();
        // HEADER
        headerCellHelper(getString("report.javancss.header.package"));
        headerCellHelper(getString("report.javancss.header.classe"));
        headerCellHelper(getString("report.javancss.header.function"));
        headerCellHelper(getString("report.javancss.header.ncss"));
        headerCellHelper(getString("report.javancss.header.javadoc"));
        headerCellHelper(getString("report.javancss.header.javadoc_line"));
        headerCellHelper(getString("report.javancss.header.single_comment"));
        headerCellHelper(getString("report.javancss.header.multi_comment"));
        getSink().tableRow_();
        // DATA
        List list = document.selectNodes("//javancss/packages/package");
        Collections.sort(list, new NumericNodeComparator("ncss"));
        Iterator nodeIterator = list.iterator();
        while (nodeIterator.hasNext()) {
            Node node = (Node) nodeIterator.next();
            getSink().tableRow();
            tableCellHelper(node.valueOf("name"));
            tableCellHelper(node.valueOf("classes"));
            tableCellHelper(node.valueOf("functions"));
            tableCellHelper(node.valueOf("ncss"));
            tableCellHelper(node.valueOf("javadocs"));
            tableCellHelper(node.valueOf("javadoc_lines"));
            tableCellHelper(node.valueOf("single_comment_lines"));
            tableCellHelper(node.valueOf("multi_comment_lines"));
            getSink().tableRow_();
        }
        getSink().table_();
    }

    private void doTotalPackageAnalysis(Document document) {
        getSink().table();
        getSink().tableRow();
        headerCellHelper(getString("report.javancss.header.classetotal"));
        headerCellHelper(getString("report.javancss.header.functiontotal"));
        headerCellHelper(getString("report.javancss.header.ncsstotal"));
        headerCellHelper(getString("report.javancss.header.javadoc"));
        headerCellHelper(getString("report.javancss.header.javadoc_line"));
        headerCellHelper(getString("report.javancss.header.single_comment"));
        headerCellHelper(getString("report.javancss.header.multi_comment"));
        getSink().tableRow_();
        Node node = document.selectSingleNode("//javancss/packages/total");
        getSink().tableRow();
        tableCellHelper(node.valueOf("classes"));
        tableCellHelper(node.valueOf("functions"));
        tableCellHelper(node.valueOf("ncss"));
        tableCellHelper(node.valueOf("javadocs"));
        tableCellHelper(node.valueOf("javadoc_lines"));
        tableCellHelper(node.valueOf("single_comment_lines"));
        tableCellHelper(node.valueOf("multi_comment_lines"));
        getSink().tableRow_();
        getSink().table_();
    }

    private void doTopObjectNcss(Document document) {
        subtitleHelper(getString("report.javancss.top") + " " + lineThreshold + " "
                + getString("report.javancss.object.byncss"));
        List nodeList = document.selectNodes("//javancss/objects/object");
        Collections.sort(nodeList, new NumericNodeComparator("ncss"));
        doTopObjectGeneric(nodeList);
    }

    private void doTopObjectFunctions(Document document) {
        subtitleHelper(getString("report.javancss.top") + " " + lineThreshold + " "
                + getString("report.javancss.object.byfunction"));
        List nodeList = document.selectNodes("//javancss/objects/object");
        Collections.sort(nodeList, new NumericNodeComparator("functions"));
        doTopObjectGeneric(nodeList);
    }

    // generic method called by doTopObjectFunctions & doTopObjectNCss
    private void doTopObjectGeneric(List nodeList) {
        getSink().table();
        getSink().tableRow();
        headerCellHelper(getString("report.javancss.header.object"));
        headerCellHelper(getString("report.javancss.header.ncss"));
        headerCellHelper(getString("report.javancss.header.function"));
        headerCellHelper(getString("report.javancss.header.classe"));
        headerCellHelper(getString("report.javancss.header.javadoc"));
        getSink().tableRow_();
        Iterator nodeIterator = nodeList.iterator();
        int i = 0;
        while (nodeIterator.hasNext() && (i++ < lineThreshold)) {
            Node node = (Node) nodeIterator.next();
            getSink().tableRow();
            getSink().tableCell();
            jxrLink(node.valueOf("name"));
            getSink().tableCell_();
            tableCellHelper(node.valueOf("ncss"));
            tableCellHelper(node.valueOf("functions"));
            tableCellHelper(node.valueOf("classes"));
            tableCellHelper(node.valueOf("javadocs"));
            getSink().tableRow_();
        }
        getSink().table_();
    }

    private void doObjectAverage(Document document) {
        subtitleHelper(getString("report.javancss.averages"));
        getSink().table();
        getSink().tableRow();
        headerCellHelper(getString("report.javancss.header.ncssaverage"));
        headerCellHelper(getString("report.javancss.header.programncss"));
        headerCellHelper(getString("report.javancss.header.classeaverage"));
        headerCellHelper(getString("report.javancss.header.functionaverage"));
        headerCellHelper(getString("report.javancss.header.javadocaverage"));
        getSink().tableRow_();
        Node node = document.selectSingleNode("//javancss/objects/averages");
        String totalNcss = document.selectSingleNode("//javancss/objects/ncss").getText();
        getSink().tableRow();
        tableCellHelper(node.valueOf("ncss"));
        tableCellHelper(totalNcss);
        tableCellHelper(node.valueOf("classes"));
        tableCellHelper(node.valueOf("functions"));
        tableCellHelper(node.valueOf("javadocs"));
        getSink().tableRow_();
        getSink().table_();
    }

    private void doFunctionAnalysis(Document document) {
        subtitleHelper(getString("report.javancss.top") + " " + lineThreshold + " "
                + getString("report.javancss.function.byncss"));
        getSink().table();
        getSink().tableRow();
        headerCellHelper(getString("report.javancss.header.function"));
        headerCellHelper(getString("report.javancss.header.ncss"));
        headerCellHelper(getString("report.javancss.header.ccn"));
        headerCellHelper(getString("report.javancss.header.javadoc"));
        getSink().tableRow_();
        List list = document.selectNodes("//javancss/functions/function");
        Collections.sort(list, new NumericNodeComparator("ncss"));
        Iterator nodeIterator = list.iterator();
        int i = 0;
        while (nodeIterator.hasNext() && (i++ < lineThreshold)) {
            Node node = (Node) nodeIterator.next();
            getSink().tableRow();
            getSink().tableCell();
            jxrFunctionLink(node.valueOf("name"));
            getSink().tableCell_();
            tableCellHelper(node.valueOf("ncss"));
            tableCellHelper(node.valueOf("ccn"));
            tableCellHelper(node.valueOf("javadocs"));
            getSink().tableRow_();
        }
        getSink().table_();
    }

    private void doFunctionAverage(Document document) {
        subtitleHelper(getString("report.javancss.averages"));
        getSink().table();
        getSink().tableRow();
        headerCellHelper(getString("report.javancss.header.programncss"));
        headerCellHelper(getString("report.javancss.header.ncssaverage"));
        headerCellHelper(getString("report.javancss.header.ccnaverage"));
        headerCellHelper(getString("report.javancss.header.javadocaverage"));
        getSink().tableRow_();
        Node node = document.selectSingleNode("//javancss/functions/function_averages");
        String totalNcss = document.selectSingleNode("//javancss/functions/ncss").getText();
        getSink().tableRow();
        tableCellHelper(totalNcss);
        tableCellHelper(node.valueOf("ncss"));
        tableCellHelper(node.valueOf("ccn"));
        tableCellHelper(node.valueOf("javadocs"));
        getSink().tableRow_();
        getSink().table_();
    }

    private void doExplanation() {
        subtitleHelper(getString("report.javancss.explanation.ncss.title"));
        paragraphHelper(getString("report.javancss.explanation.ncss.paragraph1"));
        paragraphHelper(getString("report.javancss.explanation.ncss.paragraph2"));
        getSink().table();

        getSink().tableRow();
        headerCellHelper("");
        headerCellHelper(getString("report.javancss.explanation.ncss.table.examples"));
        getSink().tableRow_();

        getSink().tableRow();
        tableCellHelper(getString("report.javancss.explanation.ncss.table.package"));
        codeCellHelper("package java.lang;");
        getSink().tableRow_();

        getSink().tableRow();
        tableCellHelper(getString("report.javancss.explanation.ncss.table.import"));
        codeCellHelper("import java.awt.*;");
        getSink().tableRow_();

        getSink().tableRow();
        tableCellHelper(getString("report.javancss.explanation.ncss.table.class"));
        getSink().tableCell();
        getSink().list();
        codeItemListHelper("public class Foo {");
        codeItemListHelper("public class Foo extends Bla {");
        getSink().list_();
        getSink().tableCell_();
        getSink().tableRow_();

        getSink().tableRow();
        tableCellHelper(getString("report.javancss.explanation.ncss.table.interface"));
        codeCellHelper("public interface Able ; {");
        getSink().tableRow_();

        getSink().tableRow();
        tableCellHelper(getString("report.javancss.explanation.ncss.table.field"));
        getSink().tableCell();
        getSink().list();
        codeItemListHelper("int a; ");
        codeItemListHelper("int a, b, c = 5, d = 6;");
        getSink().list_();
        getSink().tableCell_();
        getSink().tableRow_();

        getSink().tableRow();
        tableCellHelper(getString("report.javancss.explanation.ncss.table.method"));
        getSink().tableCell();
        getSink().list();
        codeItemListHelper("public void cry();");
        codeItemListHelper("public void gib() throws DeadException {");
        getSink().list_();
        getSink().tableCell_();
        getSink().tableRow_();

        getSink().tableRow();
        tableCellHelper(getString("report.javancss.explanation.ncss.table.constructorD"));
        codeCellHelper("public Foo() {");
        getSink().tableRow_();

        getSink().tableRow();
        tableCellHelper(getString("report.javancss.explanation.ncss.table.constructorI"));
        getSink().tableCell();
        getSink().list();
        codeItemListHelper("this();");
        codeItemListHelper("super();");
        getSink().list_();
        getSink().tableCell_();
        getSink().tableRow_();

        getSink().tableRow();
        tableCellHelper(getString("report.javancss.explanation.ncss.table.statement"));
        getSink().tableCell();
        getSink().list();
        codeItemListHelper("i = 0;");
        codeItemListHelper("if (ok)");
        codeItemListHelper("if (exit) {");
        codeItemListHelper("if (3 == 4);");
        codeItemListHelper("if (4 == 4) { ;");
        codeItemListHelper("} else {");
        getSink().list_();
        getSink().tableCell_();
        getSink().tableRow_();

        getSink().tableRow();
        tableCellHelper(getString("report.javancss.explanation.ncss.table.label"));
        codeCellHelper("fine :");
        getSink().tableRow_();

        getSink().table_();
        paragraphHelper(getString("report.javancss.explanation.ncss.paragraph3"));

        // CCN Explanation
        subtitleHelper(getString("report.javancss.explanation.ccn.title"));
        paragraphHelper(getString("report.javancss.explanation.ccn.paragraph1"));
        paragraphHelper(getString("report.javancss.explanation.ccn.paragraph2"));
        getSink().list();
        codeItemListHelper("if");
        codeItemListHelper("for");
        codeItemListHelper("while");
        codeItemListHelper("case");
        codeItemListHelper("catch");
        getSink().list_();
        paragraphHelper(getString("report.javancss.explanation.ccn.paragraph3"));
        getSink().list();
        codeItemListHelper("if");
        codeItemListHelper("for");
        getSink().list_();
        paragraphHelper(getString("report.javancss.explanation.ccn.paragraph4"));
        paragraphHelper(getString("report.javancss.explanation.ccn.paragraph5"));
    }

    // sink helper to start a section
    protected void startSection(String link, String title) {
        super.startSection(link, title);
        navigationBar();
    }

    protected void jxrLink(String clazz) {
        if (xrefLocation != null) {
            getSink().link(xrefLocation + "/" + clazz.replace('.', '/') + ".html");
        }
        getSink().text(clazz);
        if (xrefLocation != null) {
            getSink().link_();
        }
    }

    protected void jxrFunctionLink(String clazz) {
        int indexDot = -1;
        if (xrefLocation != null) {
            indexDot = clazz.lastIndexOf('.');
            if (indexDot != -1) {
                getSink().link(xrefLocation + "/" + clazz.substring(0, indexDot).replace('.', '/') + ".html");
            }
        }
        getSink().text(clazz);
        if (xrefLocation != null && indexDot != -1) {
            getSink().link_();
        }
    }

}