使用eclipse的人都知道,在console中打印的异常stack信息可以连接到源文件,最近做的工具中需要相同的功能,于是调研了一下,原理很简单,看下面代码:
MessageConsole console = new MessageConsole("My Console", null);
IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager();
IConsole[] existing = manager.getConsoles();
boolean exists = false;
for (int i = 0; i < existing.length; i++) {
if (console == existing[i])
exists = true;
}
if (!exists) {
manager.addConsoles(new IConsole[] { console });
}
manager.showConsoleView(console);
MessageConsoleStream stream = console.newMessageStream();
System.setOut(new PrintStream(stream));
//下面的代码只是说明如何向console中加入连接,没有实际意义
IDocument document = console.getDocument();
document.set("Test file link");
IProject p = ResourcesPlugin.getWorkspace().getRoot().getProject("t");
IFile file = p.getFile("test.js");
FileLink fl = new FileLink(file, "kaitone.wisp.kul.editor.kulJs", -1, -1, 5);
try {
console.addHyperlink(fl, 0, 4);
} catch (BadLocationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
上面代码所作的就是添加一个自己的console,将console的内容设置成“Test file link”,并且对"test"增加文件连接,连接到project t下面的test.js的第5行。最关键的就创建一个FileLink对象,并且通过console.addHyperlink(...)方法注册这个文件连接。这只是个静态的演示,其实实际情况要复杂的多,大多都是根据上下文情况动态的生成文件连接信息输出到console,就像java 打印到console的exception stack一样。还没有具体看jdt是怎么实现的,继续调研......
之前写过一篇文章大概讲了向console中加入文件链接的原理,后台调研了一下jdt的实现,发现,通过eclipse提供的扩展点可以很方便的实现。主要实现的扩展点有:
1. org.eclipse.ui.console.consolePatternMatchListeners
该扩展点需要实现org.eclipse.ui.console.IPatternMatchListenerDelegate接口,主要功能是通过正则表达式匹配console中的每一行,对匹配的行作出操作(比如增加文件链接)
2. org.eclipse.core.variables.dynamicVariables
这个扩展点需要实现org.eclipse.core.variables.IDynamicVariableResolver接口,作用就是定义一个dynamic variable,这里定义一个正则表达式,匹配console中的内容。
具体实现可参考org.eclipse.jdt.debug.ui插件中关于java console tracker的定义,以及JavaConsoleTracker和JavaLikeExtensionsResolver两个类的源码。