/*******************************************************************************
 * Copyright (c) 2004, 2013 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
 *     Ericsson AB, Hamdan Msheik - Bug 389564
 *******************************************************************************/

package org.eclipse.ant.internal.ui.model;

import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;

import org.apache.tools.ant.AntTypeDefinition;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.ComponentHelper;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.UnknownElement;
import org.eclipse.ant.core.AntCorePlugin;
import org.eclipse.ant.core.AntCorePreferences;
import org.eclipse.ant.core.AntSecurityException;
import org.eclipse.ant.internal.core.IAntCoreConstants;
import org.eclipse.ant.internal.ui.AntUIImages;
import org.eclipse.ant.internal.ui.AntUIPlugin;
import org.eclipse.ant.internal.ui.IAntUIConstants;
import org.eclipse.ant.internal.ui.preferences.AntEditorPreferenceConstants;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.URIUtil;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.xml.sax.Attributes;

public class AntDefiningTaskNode extends AntTaskNode {
	private String fIdentifier = null;

	public AntDefiningTaskNode(Task task, Attributes attributes) {
		super(task);
		String label = attributes.getValue(IAntCoreConstants.NAME);
		if (label == null) {
			label = task.getTaskName();

			String file = attributes.getValue(IAntCoreConstants.FILE);
			if (file != null) {
				label = label + " " + file; //$NON-NLS-1$
				fIdentifier = file;
			} else {
				String resource = attributes.getValue(IAntModelConstants.ATTR_RESOURCE);
				if (resource != null) {
					label = label + " " + resource; //$NON-NLS-1$
					fIdentifier = resource;
				}
			}
		} else {
			fIdentifier = label;
		}

		setBaseLabel(label);
	}

	@Override
	protected ImageDescriptor getBaseImageDescriptor() {
		String taskName = getTask().getTaskName();
		if ("taskdef".equalsIgnoreCase(taskName) || "typedef".equalsIgnoreCase(taskName)) { //$NON-NLS-1$//$NON-NLS-2$
			return AntUIImages.getImageDescriptor(IAntUIConstants.IMG_ANT_TASKDEF);
		}
		return AntUIImages.getImageDescriptor(IAntUIConstants.IMG_ANT_MACRODEF);
	}

	/**
	 * Execute the defining task.
	 */
	@Override
	public boolean configure(boolean validateFully) {
		if (fConfigured) {
			return false;
		}
		if (shouldConfigure()) {
			try {
				ComponentHelper helper = ComponentHelper.getComponentHelper(getProjectNode().getProject());
				((AntModel) getAntModel()).removeDefinerTasks(getIdentifier(), helper.getAntTypeTable());
				Hashtable<String, AntTypeDefinition> old = new Hashtable<String, AntTypeDefinition>(helper.getAntTypeTable());
				getTask().maybeConfigure();
				getTask().execute();
				Iterator<String> newNames = helper.getAntTypeTable().keySet().iterator();
				List<String> defined = new ArrayList<String>();
				while (newNames.hasNext()) {
					String name = newNames.next();
					if (old.get(name) == null) {
						defined.add(name);
					}
				}
				((AntModel) getAntModel()).addDefinedTasks(defined, this);
				return false;
			}
			catch (BuildException be) {
				((AntModel) getAntModel()).removeDefiningTaskNodeInfo(this);
				handleBuildException(be, AntEditorPreferenceConstants.PROBLEM_CLASSPATH);
			}
			catch (LinkageError e) {
				// A classpath problem with the definer. Possible causes are having multiple
				// versions of the same JAR on the Ant runtime classpath (either explicitly or via the plugin
				// classloaders. See bug 71888
				((AntModel) getAntModel()).removeDefiningTaskNodeInfo(this);
				handleBuildException(new BuildException(AntModelMessages.AntDefiningTaskNode_0), AntEditorPreferenceConstants.PROBLEM_CLASSPATH);
			}
			catch (AntSecurityException se) {
				// either a system exit or setting of system property was attempted
				((AntModel) getAntModel()).removeDefiningTaskNodeInfo(this);
				handleBuildException(new BuildException(AntModelMessages.AntDefiningTaskNode_1), AntEditorPreferenceConstants.PROBLEM_SECURITY);
			}
		}
		return false;
	}

	public Object getRealTask() {
		Task task = getTask();
		if (task instanceof UnknownElement) {
			task.maybeConfigure();
			return ((UnknownElement) task).getRealThing();
		}
		return task;
	}

	protected String getIdentifier() {
		return fIdentifier;
	}

	/*
	 * Sets the Java class path in org.apache.tools.ant.types.Path so that the classloaders defined by these "definer" tasks will have the correct
	 * classpath.
	 */
	public static void setJavaClassPath() {

		AntCorePreferences prefs = AntCorePlugin.getPlugin().getPreferences();
		URL[] antClasspath = prefs.getURLs();

		setJavaClassPath(antClasspath);
	}

	/*
	 * Sets the Java class path in org.apache.tools.ant.types.Path so that the classloaders defined by these "definer" tasks will have the correct
	 * classpath.
	 */
	public static void setJavaClassPath(URL[] antClasspath) {

		StringBuffer buff = new StringBuffer();
		File file = null;
		for (int i = 0; i < antClasspath.length; i++) {
			try {
				try {
					URL thisURL = URIUtil.toURI(antClasspath[i]).toURL();
					file = URIUtil.toFile(FileLocator.toFileURL(thisURL).toURI());
				}
				catch (URISyntaxException e) {
					file = new File(FileLocator.toFileURL(antClasspath[i]).getPath());
					AntUIPlugin.log(e);
					e.printStackTrace();
				}
			}
			catch (IOException e) {
				continue;
			}
			buff.append(file.getAbsolutePath());
			buff.append("; "); //$NON-NLS-1$
		}

		org.apache.tools.ant.types.Path systemClasspath = new org.apache.tools.ant.types.Path(null, buff.substring(0, buff.length() - 2));
		org.apache.tools.ant.types.Path.systemClasspath = systemClasspath;
	}

	@Override
	public boolean collapseProjection() {
		IPreferenceStore store = AntUIPlugin.getDefault().getPreferenceStore();
		if (store.getBoolean(AntEditorPreferenceConstants.EDITOR_FOLDING_DEFINING)) {
			return true;
		}
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ant.internal.ui.model.AntElementNode#setLength(int)
	 */
	@Override
	public void setLength(int length) {
		super.setLength(length);
		if (shouldConfigure()) {
			getAntModel().setDefiningTaskNodeText(this);
		}
	}

	private boolean shouldConfigure() {
		IPreferenceStore store = AntUIPlugin.getDefault().getPreferenceStore();
		return store.getBoolean(AntEditorPreferenceConstants.CODEASSIST_USER_DEFINED_TASKS);
	}

	protected void setNeedsToBeConfigured(boolean configure) {
		fConfigured = !configure;
	}
}
