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}