/*******************************************************************************
 * 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<>(helper.getAntTypeTable());
				getTask().maybeConfigure();
				getTask().execute();
				Iterator<String> newNames = helper.getAntTypeTable().keySet().iterator();
				List<String> defined = new ArrayList<>();
				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;
	}
}
