package aQute.bnd.ant;

import java.io.*;
import java.util.*;

import org.apache.tools.ant.*;

import aQute.bnd.osgi.eclipse.*;

public class EclipseTask extends BaseTask {
	private String		prefix		= "project.";
	private List<File>	prebuild	= new ArrayList<File>();
	private File		workspaceLocation;
	private String		separator	= ",";
	private File		projectLocation;

	@Override
	public void execute() throws BuildException {
		try {
			if (projectLocation == null)
				projectLocation = getProject().getBaseDir();

			if (workspaceLocation == null)
				workspaceLocation = projectLocation.getParentFile();

			EclipseClasspath eclipse = new EclipseClasspath(this, workspaceLocation, projectLocation);

			if (report())
				throw new BuildException("Errors during Eclipse Path inspection");

			addProperty(prefix + "classpath", join(eclipse.getClasspath(), separator));

			addProperty(prefix + "bootclasspath", join(eclipse.getBootclasspath(), separator));

			if (!eclipse.getSourcepath().isEmpty())
				addProperty(prefix + "sourcepath", join(eclipse.getSourcepath(), separator));

			addProperty(prefix + "output", eclipse.getOutput().getAbsolutePath());

			/**
			 * The prebuild is an attribute that is prepended to the dependency
			 * path derived from the Eclipse project
			 */

			List<File> dependents = new ArrayList<File>();
			addCareful(dependents, prebuild);
			addCareful(dependents, eclipse.getDependents());
			if (dependents.size() > 0) {
				addProperty(prefix + "buildpath", join(dependents, separator));
			}
		}
		catch (Exception e) {
			throw new BuildException("Error during parsing Eclipse .classpath files", e);
		}
	}

	private void addCareful(List<File> result, Collection<File> projects) {
		for (Iterator<File> i = projects.iterator(); i.hasNext();) {
			File d = i.next();
			if (!result.contains(d))
				result.add(d);
		}
	}

	protected void addProperty(String n, String v) {
		if (v != null)
			getProject().setProperty(n, v);
	}

	public void setPrefix(String prefix) {
		this.prefix = prefix;
	}

	public void setPrebuild(String prebuild) {
		StringTokenizer st = new StringTokenizer(prebuild, " ,");
		while (st.hasMoreTokens()) {
			this.prebuild.add(getFile(getProject().getBaseDir().getParentFile(), st.nextToken()));
		}
	}

	public void setSeparator(String separator) {
		this.separator = separator;
	}

	public void setProjectLocation(File projectLocation) {
		this.projectLocation = projectLocation;
	}

	public void setWorkspaceLocation(File workspaceLocation) {
		this.workspaceLocation = workspaceLocation;
	}
}
