1e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov/*******************************************************************************
2b9d1b54e300318b470d9fedccc69d75187016444Evgeny Mandrikov * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors
3e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * All rights reserved. This program and the accompanying materials
4e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * are made available under the terms of the Eclipse Public License v1.0
5e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * which accompanies this distribution, and is available at
6e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * http://www.eclipse.org/legal/epl-v10.html
7e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *
8e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Contributors:
9e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *    Brock Janiczak - initial API and implementation
10e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *
11e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *******************************************************************************/
12e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovpackage org.jacoco.ant;
13e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
14e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport java.io.File;
15e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport java.io.IOException;
16e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
17e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport org.apache.tools.ant.BuildException;
18e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport org.apache.tools.ant.Task;
19e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport org.jacoco.agent.AgentJar;
20e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport org.jacoco.core.runtime.AgentOptions;
21d5946166388e92f67220bbece1f104e21ab7b0cbMarc R. Hoffmannimport org.jacoco.core.runtime.AgentOptions.OutputMode;
22e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
23e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov/**
24e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Base class for all coverage tasks that require agent options
25e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */
26e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovpublic class AbstractCoverageTask extends Task {
27e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
28e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	private final AgentOptions agentOptions;
29e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
30d5946166388e92f67220bbece1f104e21ab7b0cbMarc R. Hoffmann	private File destfile;
31d5946166388e92f67220bbece1f104e21ab7b0cbMarc R. Hoffmann
32e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	private boolean enabled;
33e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
34e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	/**
35e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * Create default agent options
36e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 */
37e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	protected AbstractCoverageTask() {
38e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		super();
39e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		agentOptions = new AgentOptions();
40d5946166388e92f67220bbece1f104e21ab7b0cbMarc R. Hoffmann		destfile = new File(AgentOptions.DEFAULT_DESTFILE);
41e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		enabled = true;
42e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
43e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
44e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	/**
45e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @return Whether or not the current task is enabled
46e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 */
47e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public boolean isEnabled() {
48e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		return enabled;
49e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
50e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
51e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	/**
52e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * Sets whether or not the current task is enabled
53e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *
54e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @param enabled
55e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *            Enablement state of the task
56e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 */
57e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void setEnabled(final boolean enabled) {
58e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		this.enabled = enabled;
59e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
60e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
61e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	/**
62d5946166388e92f67220bbece1f104e21ab7b0cbMarc R. Hoffmann	 * Sets the location to write coverage execution data to. Default is
63d5946166388e92f67220bbece1f104e21ab7b0cbMarc R. Hoffmann	 * <code>jacoco.exec</code>.
64e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *
65e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @param file
66d5946166388e92f67220bbece1f104e21ab7b0cbMarc R. Hoffmann	 *            Location to write coverage execution data to
67e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 */
68e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void setDestfile(final File file) {
69d5946166388e92f67220bbece1f104e21ab7b0cbMarc R. Hoffmann		destfile = file;
70e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
71e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
72e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	/**
73e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * Append execution coverage data if a coverage file is already present.
74e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * Default is <code>true</code>
75e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *
76e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @param append
77e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *            <code>true</code> to append execution data to an existing file
78e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 */
79e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void setAppend(final boolean append) {
80e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		agentOptions.setAppend(append);
81e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
82e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
83e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	/**
84e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * List of wildcard patterns classes to include for instrumentation. Default
85e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * is <code>*</code>
86e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *
87e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @param includes
88e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *            Wildcard pattern of included classes
89e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 */
90e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void setIncludes(final String includes) {
91e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		agentOptions.setIncludes(includes);
92e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
93e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
94e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	/**
95e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * List of wildcard patterns classes to exclude from instrumentation.
96e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * Default is the empty string, no classes excluded
97e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *
98e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @param excludes
99e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *            Wildcard pattern of excluded classes
100e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 */
101e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void setExcludes(final String excludes) {
102e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		agentOptions.setExcludes(excludes);
103e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
104e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
105e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	/**
106e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * List of wildcard patterns for classloaders that JaCoCo will not
107e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * instrument classes from. Default is
108e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * <code>sun.reflect.DelegatingClassLoader</code>
109e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *
110e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @param exclClassLoader
111e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *            Wildcard pattern of class loaders to exclude
112e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 */
113e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void setExclClassLoader(final String exclClassLoader) {
114e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		agentOptions.setExclClassloader(exclClassLoader);
115e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
116e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
117e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	/**
118310b7d14546c8f5e49f5e99475fb6001331ac4caMarc R. Hoffmann	 * Sets whether classes from the bootstrap classloader should be
119310b7d14546c8f5e49f5e99475fb6001331ac4caMarc R. Hoffmann	 * instrumented.
120310b7d14546c8f5e49f5e99475fb6001331ac4caMarc R. Hoffmann	 *
1211d8389bf86f8a49d31bb5182b3ec1592e2f7289aMarc R. Hoffmann	 * @param include
122310b7d14546c8f5e49f5e99475fb6001331ac4caMarc R. Hoffmann	 *            <code>true</code> if bootstrap classes should be instrumented
123310b7d14546c8f5e49f5e99475fb6001331ac4caMarc R. Hoffmann	 */
1241d8389bf86f8a49d31bb5182b3ec1592e2f7289aMarc R. Hoffmann	public void setInclBootstrapClasses(final boolean include) {
1251d8389bf86f8a49d31bb5182b3ec1592e2f7289aMarc R. Hoffmann		agentOptions.setInclBootstrapClasses(include);
126310b7d14546c8f5e49f5e99475fb6001331ac4caMarc R. Hoffmann	}
127310b7d14546c8f5e49f5e99475fb6001331ac4caMarc R. Hoffmann
128310b7d14546c8f5e49f5e99475fb6001331ac4caMarc R. Hoffmann	/**
12926daee44414eeecb0a7a63d7f6784fcf4cfe32faMarc R. Hoffmann	 * Sets whether classes without source location should be instrumented.
13026daee44414eeecb0a7a63d7f6784fcf4cfe32faMarc R. Hoffmann	 *
13126daee44414eeecb0a7a63d7f6784fcf4cfe32faMarc R. Hoffmann	 * @param include
13226daee44414eeecb0a7a63d7f6784fcf4cfe32faMarc R. Hoffmann	 *            <code>true</code> if classes without source location should be
13326daee44414eeecb0a7a63d7f6784fcf4cfe32faMarc R. Hoffmann	 *            instrumented
13426daee44414eeecb0a7a63d7f6784fcf4cfe32faMarc R. Hoffmann	 */
13526daee44414eeecb0a7a63d7f6784fcf4cfe32faMarc R. Hoffmann	public void setInclNoLocationClasses(final boolean include) {
13626daee44414eeecb0a7a63d7f6784fcf4cfe32faMarc R. Hoffmann		agentOptions.setInclNoLocationClasses(include);
13726daee44414eeecb0a7a63d7f6784fcf4cfe32faMarc R. Hoffmann	}
13826daee44414eeecb0a7a63d7f6784fcf4cfe32faMarc R. Hoffmann
13926daee44414eeecb0a7a63d7f6784fcf4cfe32faMarc R. Hoffmann	/**
140e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * Sets the session identifier. Default is a auto-generated id
141e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *
142e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @param id
143e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *            session identifier
144e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 */
145e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void setSessionId(final String id) {
146e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		agentOptions.setSessionId(id);
147e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
148e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
149e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	/**
150e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * Dump coverage data on VM termination. Default is <code>true</code>
151e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *
152e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @param dumpOnExit
153e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *            <code>true</code> to write coverage data on VM termination
154e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 */
155e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void setDumpOnExit(final boolean dumpOnExit) {
156e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		agentOptions.setDumpOnExit(dumpOnExit);
157e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
158e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
159e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	/**
160e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * Sets the output method. Default is <code>file</code>
161e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *
162e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @param output
163e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *            Output method
164e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 */
165e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void setOutput(final String output) {
166e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		agentOptions.setOutput(output);
167e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
168e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
169e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	/**
170e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * Sets the IP address or hostname to bind to when output method is tcp
171e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * server or connect to when the output method is tcp client. Default is
172e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * <code>localhost</code>
173e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *
174e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @param address
175e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *            Address to bind or connect to
176e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 */
177e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void setAddress(final String address) {
178e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		agentOptions.setAddress(address);
179e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
180e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
181e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	/**
182e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * Sets the Port to bind to when the output method is tcp server or connect
183e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * to when the output method is tcp client. Default is <code>6300</code>
184e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *
185e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @param port
18657f7cf06888f1e34f9ab2e3129c3d433826ecbe1Marc R. Hoffmann	 *            port to bind to or connect to
187e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 */
188e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void setPort(final int port) {
189e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		agentOptions.setPort(port);
190e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
191e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
192e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	/**
193e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * Sets the directory where all class files seen by the agent should be
194e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * dumped to.
195e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *
196e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @param dir
197e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *            dump output location
198e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 */
199e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void setClassdumpdir(final File dir) {
200e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		agentOptions.setClassDumpDir(dir.getAbsolutePath());
201e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
202e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
203e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	/**
204f2450ec546d7fd07bf75047f7a4181f9ccc5a585Marc R. Hoffmann	 * Sets whether the agent should expose functionality via JMX.
205e2930e70cc2d5409732639f0bda3af36b27e6db4Marc R. Hoffmann	 *
206e2930e70cc2d5409732639f0bda3af36b27e6db4Marc R. Hoffmann	 * @param jmx
207e2930e70cc2d5409732639f0bda3af36b27e6db4Marc R. Hoffmann	 *            <code>true</code> if JMX should be enabled
208e2930e70cc2d5409732639f0bda3af36b27e6db4Marc R. Hoffmann	 */
209e2930e70cc2d5409732639f0bda3af36b27e6db4Marc R. Hoffmann	public void setJmx(final boolean jmx) {
210e2930e70cc2d5409732639f0bda3af36b27e6db4Marc R. Hoffmann		agentOptions.setJmx(jmx);
211e2930e70cc2d5409732639f0bda3af36b27e6db4Marc R. Hoffmann	}
212e2930e70cc2d5409732639f0bda3af36b27e6db4Marc R. Hoffmann
213e2930e70cc2d5409732639f0bda3af36b27e6db4Marc R. Hoffmann	/**
214e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * Creates JVM argument to launch with the specified JaCoCo agent jar and
215e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * the current options
216e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *
217e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @return JVM Argument to pass to new VM
218e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 */
219e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	protected String getLaunchingArgument() {
220d5946166388e92f67220bbece1f104e21ab7b0cbMarc R. Hoffmann		return prepareAgentOptions().getVMArgument(getAgentFile());
221d5946166388e92f67220bbece1f104e21ab7b0cbMarc R. Hoffmann	}
222d5946166388e92f67220bbece1f104e21ab7b0cbMarc R. Hoffmann
223d5946166388e92f67220bbece1f104e21ab7b0cbMarc R. Hoffmann	private AgentOptions prepareAgentOptions() {
224d5946166388e92f67220bbece1f104e21ab7b0cbMarc R. Hoffmann		if (OutputMode.file.equals(agentOptions.getOutput())) {
225d5946166388e92f67220bbece1f104e21ab7b0cbMarc R. Hoffmann			agentOptions.setDestfile(destfile.getAbsolutePath());
226d5946166388e92f67220bbece1f104e21ab7b0cbMarc R. Hoffmann		}
227d5946166388e92f67220bbece1f104e21ab7b0cbMarc R. Hoffmann		return agentOptions;
228e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
229e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
230e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	private File getAgentFile() {
231e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		try {
232e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			File agentFile = null;
233e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			final String agentFileLocation = getProject().getProperty(
234e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov					"_jacoco.agentFile");
235e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			if (agentFileLocation != null) {
236e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov				agentFile = new File(agentFileLocation);
237e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			} else {
238e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov				agentFile = AgentJar.extractToTempLocation();
239e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov				getProject().setProperty("_jacoco.agentFile",
240e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov						agentFile.toString());
241e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			}
242e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
243e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			return agentFile;
244e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		} catch (final IOException e) {
245e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			throw new BuildException("Unable to extract agent jar", e,
246e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov					getLocation());
247e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		}
248e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
249e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
250e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov}
251