package com.l2fprod.anthill.model;

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

import org.apache.tools.ant.Project;
import org.apache.tools.ant.AntClassLoader;
import org.apache.tools.ant.types.Path;

/**
 * Load optional tasks from jar files.
 * <br>
 *
 * @author $Author: lavignfr $
 * @version $Revision: 1.1.1.1 $, $Date: 2000/04/10 14:15:42 $
 */
public class ExtraTask {

    public static final String MANIFEST_NAME = "META-INF/MANIFEST.MF";

    public final static String NAME = "Name: ";
    public final static String ANT_TASK = "Ant-Task: ";
    public final static String ANT_TASKNAME = "Ant-TaskName: ";

    public static void load(Project project) throws Exception {
	load(project, project.resolveFile(System.getProperty("ant.home") + "/lib/addins"));
    }

    public static void load(Project project, File directory) throws Exception {
	String[] jars = directory.list();
	for (int i = 0, c = jars.length; i < c; i++) {
	    if (jars[i].endsWith(".jar")) {
		ZipFile jar = new ZipFile(new File(directory, jars[i]));
		ZipEntry manifestEntry = jar.getEntry(MANIFEST_NAME);
		BufferedReader reader = new BufferedReader(new InputStreamReader(jar.getInputStream(manifestEntry)));

		String line = "";
		String taskClass = null;
		String taskName = null;
		boolean isTask = false;

		do {
		    if (line.startsWith(NAME)) {
			taskClass = line.substring(NAME.length());
			taskClass = taskClass.substring(0, taskClass.indexOf(".class")).replace('/', '.').replace('$', '.');
			taskName = null;
			isTask = false;
		    } else if ((taskClass != null) &&
			       line.startsWith(ANT_TASK) &&
			       line.substring(ANT_TASK.length()).equals("True")) {
			isTask = true;
		    } else if ((taskClass != null) &&
			       line.startsWith(ANT_TASKNAME)) {
			taskName = line.substring(ANT_TASKNAME.length());
		    }

		    if ((taskClass != null) && isTask && (taskName != null)) {
			AntClassLoader loader =
			    new AntClassLoader(project,
					       new Path(project, jar.getName()));
			project.addTaskDefinition(taskName, loader.findClass(taskClass));
		    }

		    line = reader.readLine();

		} while (line != null);
	    }
	}
    }

}
