/*******************************************************************************
* Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Brock Janiczak - initial API and implementation
*
*******************************************************************************/
package org.jacoco.ant;
import static java.lang.String.format;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.ResourceCollection;
import org.apache.tools.ant.types.resources.Union;
import org.apache.tools.ant.util.FileUtils;
import org.jacoco.core.tools.ExecFileLoader;
/**
* Task for merging a set of execution data files (*.exec) into a single file
*/
public class MergeTask extends Task {
private File destfile;
private final Union files = new Union();
/**
* Sets the location of the merged data store
*
* @param destfile
* Destination data store location
*/
public void setDestfile(final File destfile) {
this.destfile = destfile;
}
/**
* This task accepts any number of execution data resources.
*
* @param resources
* Execution data resources
*/
public void addConfigured(final ResourceCollection resources) {
files.add(resources);
}
@Override
public void execute() throws BuildException {
if (destfile == null) {
throw new BuildException("Destination file must be supplied",
getLocation());
}
final ExecFileLoader loader = new ExecFileLoader();
load(loader);
save(loader);
}
private void load(final ExecFileLoader loader) {
final Iterator<?> resourceIterator = files.iterator();
while (resourceIterator.hasNext()) {
final Resource resource = (Resource) resourceIterator.next();
if (resource.isDirectory()) {
continue;
}
log(format("Loading execution data file %s", resource));
InputStream resourceStream = null;
try {
resourceStream = resource.getInputStream();
loader.load(resourceStream);
} catch (final IOException e) {
throw new BuildException(format("Unable to read %s", resource),
e, getLocation());
} finally {
FileUtils.close(resourceStream);
}
}
}
private void save(final ExecFileLoader loader) {
log(format("Writing merged execution data to %s",
destfile.getAbsolutePath()));
try {
loader.save(destfile, false);
} catch (final IOException e) {
throw new BuildException(format("Unable to write merged file %s",
destfile.getAbsolutePath()), e, getLocation());
}
}
}