/*******************************************************************************
 * Copyright (c) 2004, 2013 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * 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;
	}
}
