package org.netbeans.gradle.project.java.test;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.SwingUtilities;
import org.jtrim.cancel.Cancellation;
import org.jtrim.cancel.CancellationToken;
import org.jtrim.concurrent.CancelableTask;
import org.jtrim.utils.ExceptionHelper;
import org.netbeans.api.project.Project;
import org.netbeans.gradle.project.NbStrings;
import org.netbeans.gradle.project.java.JavaExtension;
import org.netbeans.gradle.project.output.StackTraceConsumer;
import org.netbeans.gradle.project.util.NbTaskExecutors;
import org.netbeans.modules.gsf.testrunner.ui.api.CallstackFrameNode;
public final class JavaCallstackFrameNode extends CallstackFrameNode {
private final JavaExtension javaExt;
public JavaCallstackFrameNode(String frameInfo, String displayName, JavaExtension javaExt) {
super(frameInfo, displayName);
ExceptionHelper.checkNotNullArgument(javaExt, "javaExt");
this.javaExt = javaExt;
}
@Override
public Action getPreferredAction() {
return getJumpToSourceAction();
}
private Action getJumpToSourceAction() {
return new JumpToSourceAction();
}
public static ActionListener tryGetOpenLocationAction(Project project, String location) {
String stackTraceLine = getConsumableStackTrace(location);
StackTraceConsumer stackTraceConsumer = new StackTraceConsumer(project);
return stackTraceConsumer.tryGetOpenEditorAction(stackTraceLine);
}
private static String getConsumableStackTrace(String line) {
if (line.contains(" at ")) {
return line;
}
if (line.startsWith("at ")) {
return " " + line;
}
return " at " + line;
}
@SuppressWarnings("serial")
private class JumpToSourceAction extends AbstractAction {
public JumpToSourceAction() {
super(NbStrings.getJumpToSource());
}
private void doActionNow(final ActionEvent e) {
if (frameInfo == null) {
return;
}
final ActionListener action = tryGetOpenLocationAction(javaExt.getProject(), frameInfo);
if (action != null) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
action.actionPerformed(e);
}
});
}
}
@Override
public void actionPerformed(final ActionEvent e) {
NbTaskExecutors.DEFAULT_EXECUTOR.execute(Cancellation.UNCANCELABLE_TOKEN, new CancelableTask() {
@Override
public void execute(CancellationToken cancelToken) {
doActionNow(e);
}
}, null);
}
}
}