1 /******************************************************************************* 2 * Copyright (c) 2009, 2018 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 * Brock Janiczak - initial API and implementation 10 * 11 *******************************************************************************/ 12 package org.jacoco.ant; 13 14 import static java.lang.String.format; 15 16 import java.io.File; 17 import java.io.IOException; 18 import java.net.InetAddress; 19 20 import org.apache.tools.ant.BuildException; 21 import org.apache.tools.ant.Task; 22 import org.jacoco.core.runtime.AgentOptions; 23 import org.jacoco.core.tools.ExecDumpClient; 24 import org.jacoco.core.tools.ExecFileLoader; 25 26 /** 27 * Ant task for remotely controlling an application that is running with the 28 * tcpserver output mode 29 */ 30 public class DumpTask extends Task { 31 32 private boolean dump = true; 33 private boolean reset = false; 34 private File destfile = null; 35 private String address = AgentOptions.DEFAULT_ADDRESS; 36 private int port = AgentOptions.DEFAULT_PORT; 37 private int retryCount = 10; 38 private boolean append = true; 39 40 /** 41 * Sets the location of the execution data file to write. This parameter is 42 * required when dump is <code>true</code>. Default is 43 * <code>jacoco.exec</code> 44 * 45 * @param destfile 46 * Location to write execution data to 47 */ 48 public void setDestfile(final File destfile) { 49 this.destfile = destfile; 50 } 51 52 /** 53 * IP Address or hostname to connect to. Defaults to <code>localhost</code> 54 * 55 * @param address 56 * IP Address or hostname to connect to 57 */ 58 public void setAddress(final String address) { 59 this.address = address; 60 } 61 62 /** 63 * Port number to connect to. Default is <code>6300</code> 64 * 65 * @param port 66 * Port to connect to 67 */ 68 public void setPort(final int port) { 69 this.port = port; 70 } 71 72 /** 73 * Number of retries which the goal will attempt to establish a connection. 74 * This can be used to wait until the target JVM is successfully launched. 75 * 76 * @param retryCount 77 * number of retries 78 */ 79 public void setRetryCount(final int retryCount) { 80 this.retryCount = retryCount; 81 } 82 83 /** 84 * <code>true</code> if the destination file it to be appended to. 85 * <code>false</code> if the file is to be overwritten 86 * 87 * @param append 88 * <code>true</code> if the destination file should be appended 89 * to 90 */ 91 public void setAppend(final boolean append) { 92 this.append = append; 93 } 94 95 /** 96 * Sets whether execution data should be downloaded from the remote host. 97 * Defaults to <code>true</code> 98 * 99 * @param dump 100 * <code>true</code> to download execution data 101 */ 102 public void setDump(final boolean dump) { 103 this.dump = dump; 104 } 105 106 /** 107 * Sets whether a reset command should be sent after the execution data has 108 * been dumped. Defaults to <code>false</code> 109 * 110 * @param reset 111 * <code>true</code> to reset execution data 112 */ 113 public void setReset(final boolean reset) { 114 this.reset = reset; 115 } 116 117 @Override 118 public void execute() throws BuildException { 119 120 if (port <= 0) { 121 throw new BuildException("Invalid port value", getLocation()); 122 } 123 if (dump && destfile == null) { 124 throw new BuildException( 125 "Destination file is required when dumping execution data", 126 getLocation()); 127 } 128 129 final ExecDumpClient client = new ExecDumpClient() { 130 @Override 131 protected void onConnecting(final InetAddress address, 132 final int port) { 133 log(format("Connecting to %s:%s", address, 134 Integer.valueOf(port))); 135 } 136 137 @Override 138 protected void onConnectionFailure(final IOException exception) { 139 log(exception.getMessage()); 140 } 141 }; 142 client.setDump(dump); 143 client.setReset(reset); 144 client.setRetryCount(retryCount); 145 146 try { 147 final ExecFileLoader loader = client.dump(address, port); 148 if (dump) { 149 log(format("Dumping execution data to %s", 150 destfile.getAbsolutePath())); 151 loader.save(destfile, append); 152 } 153 } catch (final IOException e) { 154 throw new BuildException("Unable to dump coverage data", e, 155 getLocation()); 156 } 157 } 158 159 } 160