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