/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ant.tests.core.testplugin;


import org.eclipse.ant.core.AntRunner;
import org.eclipse.ant.tests.core.AbstractAntTest;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;

/**
 * Responsible for running test ant build files.
 */
public class AntFileRunner {
	
	private static final String BASE_DIR_PREFIX = "-Dbasedir="; //$NON-NLS-1$

	public void run(IFile buildFile, String[] targets, String[] args, String baseDir, boolean captureOutput) throws CoreException {
	
		AntRunner runner = new AntRunner();

		String[] runnerArgs = args;

		if (baseDir.length() > 0) {
			// Ant requires the working directory to be specified
			// as one of the arguments, so it needs to be appended.
			int length = 1;
			if (args != null) {
				length = args.length + 1;
			} 
			
			runnerArgs = new String[length];
			if (args != null) {
				System.arraycopy(args, 0, runnerArgs, 0, args.length);
			}
			runnerArgs[length - 1] = BASE_DIR_PREFIX + baseDir;
		}
		runner.setArguments(runnerArgs);

		if (buildFile != null) {
			runner.setBuildFileLocation(buildFile.getLocation().toFile().toString());
		}
		if (targets != null && targets.length > 0) {
			runner.setExecutionTargets(targets);
		}
		if (captureOutput) {
			runner.addBuildLogger(AbstractAntTest.ANT_TEST_BUILD_LOGGER);
		}

		runner.run(null);
	}
	
	public void run(String[] args, String baseDir) throws Exception {
	
		AntRunner runner = new AntRunner();

		String[] runnerArgs = args;

		if (baseDir.length() > 0) {
			// Ant requires the working directory to be specified
			// as one of the arguments, so it needs to be appended.
			runnerArgs = new String[args.length + 1];
			System.arraycopy(args, 0, runnerArgs, 0, args.length);
			runnerArgs[args.length] = BASE_DIR_PREFIX + baseDir;
		}
		runner.setArguments(runnerArgs);

		runner.run(args);
	}
}
