MultiFormatter.java

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