/*******************************************************************************
 * Copyright (c) 2000, 2009 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
 *******************************************************************************/
package org.eclipse.ant.internal.ui.launchConfigurations;

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.tools.ant.util.FileUtils;
import org.eclipse.ant.internal.launching.AntLaunch;
import org.eclipse.ant.internal.launching.AntLaunchingUtil;
import org.eclipse.ant.internal.launching.LinkDescriptor;
import org.eclipse.ant.internal.ui.AntUtil;
import org.eclipse.ant.internal.ui.ExternalHyperlink;
import org.eclipse.core.resources.IFile;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.debug.ui.console.FileLink;
import org.eclipse.debug.ui.console.IConsole;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IRegion;
import org.eclipse.ui.console.IHyperlink;

/**
 * Manages task links per process. As messages are logged to the console from
 * build events, hyperlinks are created to link task names to the associated ant
 * buildfile. The build logger registers a task hyperlink with this manager for
 * each build event associated with a task. When the associated line is later
 * appended to the console, the corresponding text region in the console
 * document is determined (as the length of a console document can not be
 * determined beforehand), and the hyperlink is added to the document.
 * The new line is added to the console, information from that line 
 * may be stored to process future incoming tasks hyperlinks.
 */
public class TaskLinkManager {

	private static Map fFileNameToIFile = new HashMap();
	
	/**
	 * Not to be called.
	 */
	private TaskLinkManager() {
		super();
	}

	private static IHyperlink createHyperlink(LinkDescriptor linkDescriptor) {
		String fileName = linkDescriptor.getFileName();
		int lineNumber = linkDescriptor.getLineNumber();

		IHyperlink taskLink = null;
		if (lineNumber == -1) {
			// fileName will actually be the String representation of Location
			taskLink = AntUtil.getLocationLink(fileName, null);
		} else {
			IFile file = (IFile) fFileNameToIFile.get(fileName);
			if (file == null) {
				file = AntLaunchingUtil.getFileForLocation(fileName, null);
				if (file != null) {
					fFileNameToIFile.put(fileName, file);
					taskLink = new FileLink(file, null, -1, -1, lineNumber);
				} else if(fileName!=null){
					File javaIOFile = FileUtils.getFileUtils().resolveFile(null, fileName);
					if (javaIOFile.exists()) {
						taskLink = new ExternalHyperlink(javaIOFile, lineNumber);
					}
				}
			} else {
				taskLink = new FileLink(file, null, -1, -1, lineNumber);
			}
		}
		return taskLink;
	}
	
	private static boolean addLink(IConsole console, IRegion lineRegion, LinkDescriptor descriptor) {
		try {
			String text = console.getDocument().get(lineRegion.getOffset(), lineRegion.getLength());
			if (text.trim().equals(descriptor.getLine())) {
				int offset = lineRegion.getOffset() + descriptor.getOffset();
				IHyperlink link = createHyperlink(descriptor);
				if (link != null) {
					console.addLink(link, offset, descriptor.getLength());
				}
				return true;
			}
		} catch (BadLocationException e) {
		}
		return false;
	}	

	/**
	 * A new line has been added to the given console. Adds any task hyperlink
	 * associated with the line, to the console.
	 * The new line may be stored to process future incoming tasks hyperlinks.
	 * 
	 * @param console
	 * @param newLine
	 */
	public static synchronized void processNewLine(IConsole console, IRegion newLine) {
		AntLaunch launch = (AntLaunch) console.getProcess().getLaunch();
		List links = launch.getLinkDescriptors();

		if (linkBuildFileMessage(console, newLine)) {
			return;
		}

		if (links == null || links.isEmpty()) {
			return;
		}

		for (Iterator i = links.iterator(); i.hasNext();) {
			LinkDescriptor descriptor = (LinkDescriptor) i.next();
			if (addLink(console, newLine, descriptor)) {
				launch.removeLinkDescriptor(descriptor);
				return;
			}
		}
	}

	/**
	 * Disposes any information stored for the given process.
	 * 
	 * @param process
	 */
	public static void dispose(IProcess process) {
		AntLaunch launch = (AntLaunch) process.getLaunch();
		launch.clearLinkDescriptors();
	}

	private static boolean linkBuildFileMessage(IConsole console, IRegion region) {
		
		String message= ""; //$NON-NLS-1$
		int offset= region.getOffset();
		try {
			message = console.getDocument().get(offset, region.getLength());
		} catch (BadLocationException e) {
		}
		if (message.startsWith("Buildfile:")) { //$NON-NLS-1$
			String fileName = message.substring(10).trim();
			IFile file = AntUtil.getFileForLocation(fileName, null);
			if (file != null) {
				FileLink link = new FileLink(file, null,  -1, -1, -1);
				console.addLink(link, offset + 11, fileName.length());
				return true;
			}
		}
		return false;
	}
}
