package com.google.jstestdriver.idea.execution.tree;
import com.google.jstestdriver.idea.execution.tc.TC;
import com.google.jstestdriver.idea.execution.tc.TCAttribute;
import com.google.jstestdriver.idea.execution.tc.TCMessage;
import com.google.jstestdriver.idea.util.EscapeUtils;
import com.google.jstestdriver.idea.util.JsErrorMessage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.Arrays;
import java.util.List;
/**
* @author Sergey Simonchik
*/
public class BrowserErrorNode extends AbstractNodeWithParent<BrowserErrorNode> {
private final JsErrorMessage myErrorMessage;
private BrowserErrorNode(@NotNull BrowserNode parent, @Nullable JsErrorMessage errorMessage) {
super(errorMessage != null ? errorMessage.getErrorName() : "Error", parent);
myErrorMessage = errorMessage;
}
@NotNull
@Override
public BrowserNode getParent() {
return (BrowserNode) super.getParent();
}
@Override
public String getProtocolId() {
return "browserError";
}
@Override
public String getLocationPath() {
if (myErrorMessage == null) {
return null;
}
Integer columnNumber = myErrorMessage.getColumnNumber();
List<String> components = Arrays.asList(
myErrorMessage.getFileWithError().getAbsolutePath(),
String.valueOf(myErrorMessage.getLineNumber()),
columnNumber != null ? columnNumber.toString() : ""
);
return EscapeUtils.join(components, ':');
}
@NotNull
@Override
public TCMessage createStartedMessage() {
TCMessage message = TC.newBrowserErrorStartedMessage(this);
ConfigNode configNode = getParent().getParent();
String basePath = configNode.getAbsoluteBasePath();
if (basePath != null) {
message.addAttribute(TCAttribute.NODE_TYPE, "browserError");
message.addAttribute(TCAttribute.NODE_ARGS, basePath);
}
return message;
}
@NotNull
public static BrowserErrorNode newBrowserErrorNode(@NotNull BrowserNode parent,
@Nullable String pathToJsFileWithError,
@Nullable String errorMessage) {
ConfigNode configNode = parent.getParent();
String basePath = configNode.getAbsoluteBasePath();
final JsErrorMessage parsedErrorMessage;
if (basePath != null && errorMessage != null) {
parsedErrorMessage = JsErrorMessage.parseFromText(errorMessage, new File(basePath));
} else {
parsedErrorMessage = null;
}
JsErrorMessage result = null;
if (pathToJsFileWithError == null) {
result = parsedErrorMessage;
} else {
File file = new File(pathToJsFileWithError);
if (file.isAbsolute() && file.isFile()) {
if (parsedErrorMessage != null && parsedErrorMessage.getFileWithError().equals(file)) {
result = parsedErrorMessage;
} else {
result = new JsErrorMessage(file, 1, null, false, null, -1, -1);
}
}
}
return new BrowserErrorNode(parent, result);
}
}