MultiFormatter.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 *******************************************************************************/
   12package org.jacoco.report;
   13
   14import java.io.IOException;
   15import java.util.ArrayList;
   16import java.util.Collection;
   17import java.util.List;
   18
   19import org.jacoco.core.analysis.ICoverageNode;
   20import org.jacoco.core.data.ExecutionData;
   21import org.jacoco.core.data.SessionInfo;
   22
   23/**
   24 * A formatter that is composed from multiple other formatters. This can be used
   25 * to create more than one report format in one run.
   26 * 
   27 * @author Marc R. Hoffmann
   28 * @version 0.4.1.20101007204400
   29 */
   30
   31public class MultiFormatter implements IReportFormatter {
   32
   33    private final List<IReportFormatter> formatters = new ArrayList<IReportFormatter>();
   34
   35    /**
   36     * Adds the given formatter to the processing chain.
   37     * 
   38     * @param formatter
   39     *            formatter to add
   40     */
   41    public void add(final IReportFormatter formatter) {
   42        formatters.add(formatter);
   43    }
   44
   45    public IReportVisitor createReportVisitor(final ICoverageNode root,
   46            final List<SessionInfo> sessionInfos,
   47            final Collection<ExecutionData> executionData) throws IOException {
   48        final List<IReportVisitor> visitors = new ArrayList<IReportVisitor>();
   49        for (final IReportFormatter f : formatters) {
   50            visitors.add(f.createReportVisitor(root, sessionInfos,
   51                    executionData));
   52        }
   53        return new MultiVisitor(visitors);
   54    }
   55
   56    private static class MultiVisitor implements IReportVisitor {
   57
   58        private final List<IReportVisitor> visitors;
   59
   60        MultiVisitor(final List<IReportVisitor> visitors) {
   61            this.visitors = visitors;
   62        }
   63
   64        public IReportVisitor visitChild(final ICoverageNode node)
   65                throws IOException {
   66            final List<IReportVisitor> children = new ArrayList<IReportVisitor>();
   67            for (final IReportVisitor v : visitors) {
   68                children.add(v.visitChild(node));
   69            }
   70            return new MultiVisitor(children);
   71        }
   72
   73        public void visitEnd(final ISourceFileLocator sourceFileLocator)
   74                throws IOException {
   75            for (final IReportVisitor v : visitors) {
   76                v.visitEnd(sourceFileLocator);
   77            }
   78        }
   79    }
   80
   81}