1d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann/*******************************************************************************
2d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
3d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * All rights reserved. This program and the accompanying materials
4d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * are made available under the terms of the Eclipse Public License v1.0
5d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * which accompanies this distribution, and is available at
6d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * http://www.eclipse.org/legal/epl-v10.html
7d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann *
8d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * Contributors:
9d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann *    Marc R. Hoffmann - initial API and implementation
10d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann *
11d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann *******************************************************************************/
12d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannpackage org.jacoco.cli.internal.commands;
13d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
14d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport java.io.File;
15d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport java.io.FileInputStream;
16d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport java.io.IOException;
17d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport java.io.PrintWriter;
18d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport java.util.ArrayList;
19d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport java.util.Date;
20d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport java.util.List;
21d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
22d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.jacoco.cli.internal.Command;
23d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.jacoco.core.data.ExecutionData;
24d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.jacoco.core.data.ExecutionDataReader;
25d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.jacoco.core.data.IExecutionDataVisitor;
26d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.jacoco.core.data.ISessionInfoVisitor;
27d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.jacoco.core.data.SessionInfo;
28d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.kohsuke.args4j.Argument;
29d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
30d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann/**
31d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * The <code>execinfo</code> command.
32d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann */
33d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannpublic class ExecInfo extends Command {
34d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
35d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	@Argument(usage = "list of JaCoCo *.exec files to read", metaVar = "<execfiles>")
36d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	List<File> execfiles = new ArrayList<File>();
37d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
38d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	@Override
39d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	public String description() {
40d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		return "Print exec file content in human readable format.";
41d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	}
42d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
43d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	@Override
44d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	public int execute(final PrintWriter out, final PrintWriter err)
45d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann			throws IOException {
46d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		for (final File file : execfiles) {
47d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann			dump(file, out);
48d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		}
49d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		return 0;
50d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	}
51d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
52d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	private void dump(final File file, final PrintWriter out)
53d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann			throws IOException {
54d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		out.printf("[INFO] Loading exec file %s.%n", file);
55d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		out.println("CLASS ID         HITS/PROBES   CLASS NAME");
56d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
57d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		final FileInputStream in = new FileInputStream(file);
58d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		final ExecutionDataReader reader = new ExecutionDataReader(in);
59d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		reader.setSessionInfoVisitor(new ISessionInfoVisitor() {
60d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann			public void visitSessionInfo(final SessionInfo info) {
61d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann				out.printf("Session \"%s\": %s - %s%n", info.getId(),
62d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann						new Date(info.getStartTimeStamp()),
63d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann						new Date(info.getDumpTimeStamp()));
64d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann			}
65d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		});
66d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		reader.setExecutionDataVisitor(new IExecutionDataVisitor() {
67d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann			public void visitClassExecution(final ExecutionData data) {
68d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann				out.printf("%016x  %3d of %3d   %s%n",
69d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann						Long.valueOf(data.getId()),
70d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann						Integer.valueOf(getHitCount(data.getProbes())),
71d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann						Integer.valueOf(data.getProbes().length),
72d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann						data.getName());
73d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann			}
74d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		});
75d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		reader.read();
76d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		in.close();
77d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		out.println();
78d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	}
79d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
80d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	private int getHitCount(final boolean[] data) {
81d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		int count = 0;
82d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		for (final boolean hit : data) {
83d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann			if (hit) {
84d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann				count++;
85d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann			}
86d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		}
87d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		return count;
88d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	}
89d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
90d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann}
91