PackagePage.java

    1/*******************************************************************************
    2 * Copyright (c) 2009, 2010 Mountainminds GmbH & Co. KG and Contributors
    3 * All rights reserved. This program and the accompanying materials
    4 * are made available under the terms of the Eclipse Public License v1.0
    5 * which accompanies this distribution, and is available at
    6 * http://www.eclipse.org/legal/epl-v10.html
    7 *
    8 * Contributors:
    9 *    Marc R. Hoffmann - initial API and implementation
   10 *    
   11 * $Id: $
   12 *******************************************************************************/
   13package org.jacoco.report.html;
   14
   15import java.io.IOException;
   16import java.util.ArrayList;
   17import java.util.HashMap;
   18import java.util.List;
   19import java.util.Map;
   20
   21import org.jacoco.core.analysis.ClassCoverage;
   22import org.jacoco.core.analysis.ICoverageNode;
   23import org.jacoco.core.analysis.SourceFileCoverage;
   24import org.jacoco.core.analysis.ICoverageNode.ElementType;
   25import org.jacoco.report.IReportVisitor;
   26import org.jacoco.report.ISourceFileLocator;
   27import org.jacoco.report.ReportOutputFolder;
   28
   29/**
   30 * Page showing coverage information for a Java package. The page contains a
   31 * table with all classes of the package.
   32 * 
   33 * @author Marc R. Hoffmann
   34 * @version $Revision: $
   35 */
   36public class PackagePage extends ReportPage {
   37
   38    private final List<ClassPage> classes = new ArrayList<ClassPage>();
   39
   40    private final Map<String, SourceFilePage> sourceFiles = new HashMap<String, SourceFilePage>();
   41
   42    /**
   43     * Creates a new visitor in the given context.
   44     * 
   45     * @param node
   46     * @param parent
   47     * @param outputFolder
   48     * @param context
   49     */
   50    public PackagePage(final ICoverageNode node, final ReportPage parent,
   51            final ReportOutputFolder outputFolder,
   52            final IHTMLReportContext context) {
   53        super(node, parent, outputFolder, context);
   54    }
   55
   56    public IReportVisitor visitChild(final ICoverageNode node) {
   57        final ElementType type = node.getElementType();
   58        switch (type) {
   59        case SOURCEFILE:
   60            final SourceFilePage sourcePage = new SourceFilePage(
   61                    (SourceFileCoverage) node, this, outputFolder, context);
   62            sourceFiles.put(node.getName(), sourcePage);
   63            return sourcePage;
   64        case CLASS:
   65            final ClassPage classPage = new ClassPage((ClassCoverage) node,
   66                    this, sourceFiles, outputFolder, context);
   67            classes.add(classPage);
   68            return classPage;
   69        }
   70        throw new IllegalStateException("Unexpected element type " + type);
   71    }
   72
   73    @Override
   74    public void visitEnd(final ISourceFileLocator sourceFileLocator)
   75            throws IOException {
   76        super.visitEnd(sourceFileLocator);
   77        // free memory, otherwise we will keep the complete tree:
   78        classes.clear();
   79        sourceFiles.clear();
   80    }
   81
   82    @Override
   83    protected void content(final HTMLElement body,
   84            final ISourceFileLocator sourceFileLocator) throws IOException {
   85        context.getTable(getNode().getElementType()).render(body, classes,
   86                getNode(), context.getResources(), outputFolder);
   87    }
   88
   89    @Override
   90    protected String getFileName() {
   91        return "index.html";
   92    }
   93
   94    @Override
   95    public String getLabel() {
   96        return context.getLanguageNames().getPackageName(getNode().getName());
   97    }
   98
   99    @Override
  100    protected ReportOutputFolder getFolder(final ReportOutputFolder base) {
  101        return base.subFolder(getLabel());
  102    }
  103
  104}