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 * $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}