blob: c6d8515fdc8f0a28228b2575c830665608479fc8 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}