Java tutorial
/* * 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. */ package com.adobe.ac.pmd.metrics.maven.generators; 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; import com.adobe.ac.pmd.metrics.maven.utils.NumericNodeComparator; /** * Generates the javaNcss maven report. * * @author <a href="jeanlaurentATgmail.com">Jean-Laurent de Morlhon</a> * @version $Id: NcssReportGenerator.java 3286 2007-02-08 20:18:51Z jeanlaurent * $ */ public class NcssReportGenerator extends NcssReportGeneratorBase { private static final String CLASSES = "classes"; private static final String FUNCTIONS = "functions"; private static final String NAME = "name"; private static final String NCSS = "ncss"; 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. */ public NcssReportGenerator(final Sink sink, final ResourceBundle bundle, final Log log) { super(sink, bundle, log); } /** * Generates the JavaNcss reports. * * @param document the javaNcss raw report as an XML document. * @param lineThresholdToBeSet the maximum number of lines to keep in major * reports. */ public void doReport(final Document document, final int lineThresholdToBeSet) { lineThreshold = lineThresholdToBeSet; // HEADER getSink().head(); getSink().title(); getSink().text(getResourceBundle().getString("report.javancss.title")); getSink().title_(); getSink().head_(); // BODY getSink().body(); doIntro(); // 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_(); } // sink helper to start a section @Override protected void startSection(final String link, final String title) { super.startSection(link, title); navigationBar(); } private void doExplanation() { explainNcss(); explainCcn(); } @SuppressWarnings("unchecked") private void doFunctionAnalysis(final Document document) { subtitleHelper(getResourceBundle().getString("report.javancss.top") + " " + lineThreshold + " " + getResourceBundle().getString("report.javancss.function.byncss")); getSink().paragraph(); getSink().table(); getSink().tableRow(); headerCellHelper(getResourceBundle().getString("report.javancss.header.function")); headerCellHelper(getResourceBundle().getString("report.javancss.header.ncss")); headerCellHelper(getResourceBundle().getString("report.javancss.header.ccn")); getSink().tableRow_(); final List<Node> list = document.selectNodes("//javancss/functions/function"); Collections.sort(list, new NumericNodeComparator(NCSS)); final Iterator<Node> nodeIterator = list.iterator(); int currentIndex = 0; while (nodeIterator.hasNext() && currentIndex++ < lineThreshold) { final Node node = nodeIterator.next(); getSink().tableRow(); // getSink().tableCell(); // getSink().tableCell_(); tableCellHelper(node.valueOf("name")); tableCellHelper(node.valueOf(NCSS)); tableCellHelper(node.valueOf("ccn")); getSink().tableRow_(); } getSink().table_(); getSink().paragraph_(); } private void doFunctionAverage(final Document document) { subtitleHelper(getResourceBundle().getString("report.javancss.averages")); getSink().paragraph(); getSink().table(); getSink().tableRow(); headerCellHelper(getResourceBundle().getString("report.javancss.header.programncss")); headerCellHelper(getResourceBundle().getString("report.javancss.header.ncssaverage")); headerCellHelper(getResourceBundle().getString("report.javancss.header.ccnaverage")); getSink().tableRow_(); final Node node = document.selectSingleNode("//javancss/functions/function_averages"); final String totalNcss = document.selectSingleNode("//javancss/functions/ncss").getText(); getSink().tableRow(); tableCellHelper(totalNcss); tableCellHelper(node.valueOf(NCSS)); tableCellHelper(node.valueOf("ccn")); getSink().tableRow_(); getSink().table_(); getSink().paragraph_(); } private void doIntro() { getSink().section1(); getSink().sectionTitle1(); getSink().text(getResourceBundle().getString("report.javancss.main.title")); getSink().sectionTitle1_(); getSink().paragraph(); navigationBar(); getSink().text(getResourceBundle().getString("report.javancss.main.text") + " "); getSink().lineBreak(); getSink().link("http://www.kclee.de/clemens/java/javancss/"); getSink().text("JavaNCSS web site."); getSink().link_(); getSink().paragraph_(); getSink().section1_(); } @SuppressWarnings("unchecked") private void doMainPackageAnalysis(final Document document) { subtitleHelper(getResourceBundle().getString("report.javancss.package.text")); getSink().table(); getSink().tableRow(); // HEADER headerCellHelper(getResourceBundle().getString("report.javancss.header.package")); headerCellHelper(getResourceBundle().getString("report.javancss.header.classe")); headerCellHelper(getResourceBundle().getString("report.javancss.header.function")); headerCellHelper(getResourceBundle().getString("report.javancss.header.ncss")); getSink().tableRow_(); // DATA final List<Node> list = document.selectNodes("//javancss/packages/package"); Collections.sort(list, new NumericNodeComparator(NCSS)); for (final Node node : list) { getSink().tableRow(); tableCellHelper(node.valueOf(NAME)); tableCellHelper(node.valueOf(CLASSES)); tableCellHelper(node.valueOf(FUNCTIONS)); tableCellHelper(node.valueOf(NCSS)); getSink().tableRow_(); } getSink().table_(); } private void doObjectAverage(final Document document) { subtitleHelper(getResourceBundle().getString("report.javancss.averages")); getSink().table(); getSink().tableRow(); headerCellHelper(getResourceBundle().getString("report.javancss.header.ncssaverage")); headerCellHelper(getResourceBundle().getString("report.javancss.header.classeaverage")); headerCellHelper(getResourceBundle().getString("report.javancss.header.functionaverage")); getSink().tableRow_(); final Node node = document.selectSingleNode("//javancss/objects/averages"); getSink().tableRow(); tableCellHelper(node.valueOf(NCSS)); tableCellHelper(node.valueOf(CLASSES)); tableCellHelper(node.valueOf(FUNCTIONS)); getSink().tableRow_(); getSink().table_(); } @SuppressWarnings("unchecked") private void doTopObjectFunctions(final Document document) { subtitleHelper(getResourceBundle().getString("report.javancss.top") + " " + lineThreshold + " " + getResourceBundle().getString("report.javancss.object.byfunction")); final List<Node> nodeList = document.selectNodes("//javancss/objects/object"); Collections.sort(nodeList, new NumericNodeComparator(FUNCTIONS)); doTopObjectGeneric(nodeList); } // generic method called by doTopObjectFunctions & doTopObjectNCss private void doTopObjectGeneric(final List<Node> nodeList) { getSink().table(); getSink().tableRow(); headerCellHelper(getResourceBundle().getString("report.javancss.header.object")); headerCellHelper(getResourceBundle().getString("report.javancss.header.ncss")); headerCellHelper(getResourceBundle().getString("report.javancss.header.function")); getSink().tableRow_(); final Iterator<Node> nodeIterator = nodeList.iterator(); int currentIndex = 0; while (nodeIterator.hasNext() && currentIndex++ < lineThreshold) { final Node node = nodeIterator.next(); getSink().tableRow(); tableCellHelper(node.valueOf(NAME)); tableCellHelper(node.valueOf(NCSS)); tableCellHelper(node.valueOf(FUNCTIONS)); getSink().tableRow_(); } getSink().table_(); } @SuppressWarnings("unchecked") private void doTopObjectNcss(final Document document) { subtitleHelper(getResourceBundle().getString("report.javancss.top") + " " + lineThreshold + " " + getResourceBundle().getString("report.javancss.object.byncss")); final List<Node> nodeList = document.selectNodes("//javancss/objects/object"); Collections.sort(nodeList, new NumericNodeComparator(NCSS)); doTopObjectGeneric(nodeList); } private void doTotalPackageAnalysis(final Document document) { getSink().table(); getSink().tableRow(); headerCellHelper(getResourceBundle().getString("report.javancss.header.classetotal")); headerCellHelper(getResourceBundle().getString("report.javancss.header.functiontotal")); headerCellHelper(getResourceBundle().getString("report.javancss.header.ncsstotal")); getSink().tableRow_(); final Node node = document.selectSingleNode("//javancss/packages/total"); getSink().tableRow(); tableCellHelper(node.valueOf(CLASSES)); tableCellHelper(node.valueOf(FUNCTIONS)); tableCellHelper(node.valueOf(NCSS)); getSink().tableRow_(); getSink().table_(); } private void explainCcn() { subtitleHelper(getResourceBundle().getString("report.javancss.explanation.ccn.title")); paragraphHelper(getResourceBundle().getString("report.javancss.explanation.ccn.paragraph1")); paragraphHelper(getResourceBundle().getString("report.javancss.explanation.ccn.paragraph2")); getSink().list(); codeItemListHelper("if"); codeItemListHelper("for"); codeItemListHelper("while"); codeItemListHelper("case"); codeItemListHelper("catch"); getSink().list_(); paragraphHelper(getResourceBundle().getString("report.javancss.explanation.ccn.paragraph3")); getSink().list(); codeItemListHelper("if"); codeItemListHelper("for"); getSink().list_(); paragraphHelper(getResourceBundle().getString("report.javancss.explanation.ccn.paragraph4")); paragraphHelper(getResourceBundle().getString("report.javancss.explanation.ccn.paragraph5")); } private void explainClasses() { getSink().tableRow(); tableCellHelper(getResourceBundle().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(getResourceBundle().getString("report.javancss.explanation.ncss.table.interface")); codeCellHelper("public interface Able {"); getSink().tableRow_(); } private void explainFunction() { getSink().tableRow(); tableCellHelper(getResourceBundle().getString("report.javancss.explanation.ncss.table.method")); getSink().tableCell(); getSink().list(); codeItemListHelper("public function cry() : void{}"); codeItemListHelper("public function gib() : DeadResult {}"); getSink().list_(); getSink().tableCell_(); getSink().tableRow_(); getSink().tableRow(); tableCellHelper(getResourceBundle().getString("report.javancss.explanation.ncss.table.constructorD")); codeCellHelper("public Foo() {"); getSink().tableRow_(); getSink().tableRow(); tableCellHelper(getResourceBundle().getString("report.javancss.explanation.ncss.table.constructorI")); getSink().tableCell(); getSink().list(); codeItemListHelper("super();"); getSink().list_(); getSink().tableCell_(); getSink().tableRow_(); } private void explainNcss() { subtitleHelper(getResourceBundle().getString("report.javancss.explanation.ncss.title")); paragraphHelper(getResourceBundle().getString("report.javancss.explanation.ncss.paragraph1")); paragraphHelper(getResourceBundle().getString("report.javancss.explanation.ncss.paragraph2")); getSink().table(); getSink().tableRow(); headerCellHelper(""); headerCellHelper(getResourceBundle().getString("report.javancss.explanation.ncss.table.examples")); getSink().tableRow_(); explainPackage(); explainClasses(); explainVariable(); explainFunction(); explainStatement(); getSink().table_(); paragraphHelper(getResourceBundle().getString("report.javancss.explanation.ncss.paragraph3")); } private void explainPackage() { getSink().tableRow(); tableCellHelper(getResourceBundle().getString("report.javancss.explanation.ncss.table.package")); codeCellHelper("package com.adobe.ac {}"); getSink().tableRow_(); getSink().tableRow(); tableCellHelper(getResourceBundle().getString("report.javancss.explanation.ncss.table.import")); codeCellHelper("import com.adobe.ac.*;"); getSink().tableRow_(); } private void explainStatement() { getSink().tableRow(); tableCellHelper(getResourceBundle().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_(); } private void explainVariable() { getSink().tableRow(); tableCellHelper(getResourceBundle().getString("report.javancss.explanation.ncss.table.field")); getSink().tableCell(); getSink().list(); codeItemListHelper("var a : Number;"); codeItemListHelper("var a : Number = 1;"); getSink().list_(); getSink().tableCell_(); getSink().tableRow_(); } // print out the navigation bar private void navigationBar() { getSink().paragraph(); getSink().text("[ "); getSink().link("#" + getResourceBundle().getString("report.javancss.package.link")); getSink().text(getResourceBundle().getString("report.javancss.package.link")); getSink().link_(); getSink().text(" ] [ "); getSink().link("#" + getResourceBundle().getString("report.javancss.object.link")); getSink().text(getResourceBundle().getString("report.javancss.object.link")); getSink().link_(); getSink().text(" ] [ "); getSink().link("#" + getResourceBundle().getString("report.javancss.function.link")); getSink().text(getResourceBundle().getString("report.javancss.function.link")); getSink().link_(); getSink().text(" ] [ "); getSink().link("#" + getResourceBundle().getString("report.javancss.explanation.link")); getSink().text(getResourceBundle().getString("report.javancss.explanation.link")); getSink().link_(); getSink().text(" ]"); getSink().paragraph_(); } }