blob: 83f735399d92d3bb9cfbd328af4e3dae82d3fd6a [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.lang.ant.config.execution;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;
import java.io.File;
final class HyperlinkUtil {
@NonNls public static final String AT_ATR = "at";
private HyperlinkUtil() {
}
static final class PlaceInfo {
private final VirtualFile myFile;
private final int myLine;
private final int myColumn;
private final int myLinkStartIndex;
private final int myLinkEndIndex;
public PlaceInfo(VirtualFile file, int line, int column, int linkStartIndex, int linkEndIndex) {
myFile = file;
myLine = line;
myColumn = column;
myLinkStartIndex = linkStartIndex;
myLinkEndIndex = linkEndIndex;
}
public VirtualFile getFile() {
return myFile;
}
public int getLine() {
return myLine;
}
public int getColumn() {
return myColumn;
}
public int getLinkStartIndex() {
return myLinkStartIndex;
}
public int getLinkEndIndex() {
return myLinkEndIndex;
}
}
static PlaceInfo parseStackLine(Project project, String line) {
int atIndex = line.indexOf("\t"+ AT_ATR + " ");
if (atIndex < 0) return null;
int lparenthIndex = line.indexOf('(', atIndex);
if (lparenthIndex < 0) return null;
int lastDotIndex = line.lastIndexOf('.', lparenthIndex);
if (lastDotIndex < 0 || lastDotIndex < atIndex) return null;
String className = line.substring(atIndex + AT_ATR.length() + 1, lastDotIndex).trim();
int dollarIndex = className.indexOf('$');
if (dollarIndex >= 0){
className = className.substring(0, dollarIndex);
}
int rparenthIndex = line.indexOf(')', lparenthIndex);
if (rparenthIndex < 0) return null;
String fileAndLine = line.substring(lparenthIndex + 1, rparenthIndex).trim();
int colonIndex = fileAndLine.lastIndexOf(':');
if (colonIndex < 0) return null;
String lineString = fileAndLine.substring(colonIndex + 1);
String file = fileAndLine.substring(0, colonIndex);
int lineNumber;
try{
lineNumber = Integer.parseInt(lineString);
}
catch(NumberFormatException e){
return null;
}
return makePlaceInfo(className, file, lineNumber, project, lparenthIndex, rparenthIndex);
}
private static PlaceInfo makePlaceInfo(final String className, final String fileName, final int line, final Project project, final int lparenthIndex, final int rparenthIndex){
final PlaceInfo[] info = new PlaceInfo[1];
ApplicationManager.getApplication().runReadAction(
new Runnable(){
public void run(){
PsiClass aClass = JavaPsiFacade.getInstance(project).findClass(className, GlobalSearchScope.allScope(project));
if (aClass == null) return;
PsiFile file = aClass.getContainingFile();
String fileName1 = fileName.replace(File.separatorChar, '/');
int slashIndex = fileName1.lastIndexOf('/');
String shortFileName = slashIndex < 0 ? fileName : fileName.substring(slashIndex + 1);
final String name = file.getName();
if (name == null) return;
if (!name.equalsIgnoreCase(shortFileName)) return;
info[0] = new PlaceInfo(file.getVirtualFile(), line, 1, lparenthIndex, rparenthIndex);
}
}
);
return info[0];
}
@NonNls private static final String RUNNING_SUBSTRING = "Running ";
@NonNls private static final String TEST_SUBSTRING = "TEST ";
@NonNls private static final String FAILED_SUBSTRING = " FAILED";
@NonNls private static final String FAILED_SUBSTRING_2 = " FAILED\n";
@Nullable
static PlaceInfo parseJUnitMessage(final Project project, String message) {
int startIndex;
int endIndex;
if (message.startsWith(RUNNING_SUBSTRING)) {
startIndex = RUNNING_SUBSTRING.length();
endIndex = message.length();
} else if (message.startsWith(TEST_SUBSTRING)) {
startIndex = TEST_SUBSTRING.length();
if (message.endsWith(FAILED_SUBSTRING)) {
endIndex = message.length() - FAILED_SUBSTRING.length();
} else if (message.endsWith(FAILED_SUBSTRING_2)) {
endIndex = message.length() - FAILED_SUBSTRING_2.length();
} else {
return null;
}
} else {
return null;
}
if (endIndex < startIndex) return null;
final String possibleTestClassName = message.substring(startIndex, endIndex);
final PsiFile[] psiFile = new PsiFile[1];
final PsiManager psiManager = PsiManager.getInstance(project);
ApplicationManager.getApplication().runReadAction(new Runnable() {
public void run() {
PsiClass psiClass =
JavaPsiFacade.getInstance(psiManager.getProject()).findClass(possibleTestClassName, GlobalSearchScope.allScope(project));
if (psiClass == null) return;
PsiElement parent = psiClass.getParent();
if (parent instanceof PsiFile) {
psiFile[0] = (PsiFile)parent;
}
}
});
if (psiFile[0] == null) return null;
return new PlaceInfo(psiFile[0].getVirtualFile(), 1, 1, startIndex, endIndex - 1);
}
}