package tc.oc.pgm.xml;
import java.lang.reflect.InvocationTargetException;
import javax.annotation.Nullable;
import com.google.common.util.concurrent.UncheckedExecutionException;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.JDOMParseException;
import tc.oc.commons.core.util.ThrowingSupplier;
import tc.oc.pgm.module.ModuleLoadException;
public class InvalidXMLException extends ModuleLoadException {
private static final long serialVersionUID = 5732248895863659936L;
private @Nullable Node node;
private @Nullable Document document;
private @Nullable String documentPath;
private int startLine, endLine, column;
protected InvalidXMLException(String message, @Nullable Node node, @Nullable Document document,
@Nullable String documentPath, int startLine, int endLine, int column,
Throwable cause) {
super(message, cause);
this.node = node;
this.document = document != null ? document : node != null ? node.getDocument() : null;
this.documentPath = documentPath != null ? documentPath : this.document != null ? this.document.getBaseURI() : null;
this.startLine = startLine > 0 ? startLine : this.node != null ? this.node.startLine() : 0;
this.endLine = endLine > 0 ? endLine : this.node != null ? this.node.endLine() : 0;
this.column = column > 0 ? column : this.node != null ? this.node.column() : 0;
}
public InvalidXMLException(String message, @Nullable Node node, Throwable cause) {
this(message, node, null, null, 0, 0, 0, cause);
}
public InvalidXMLException(String message, @Nullable Document document, Throwable cause) {
this(message, null, document, null, 0, 0, 0, cause);
}
public InvalidXMLException(String message, @Nullable String documentPath, Throwable cause) {
this(message, null, null, documentPath, 0, 0, 0, cause);
}
public InvalidXMLException(String message, @Nullable Element element, Throwable cause) {
this(message, element == null ? null : new Node(element), cause);
}
public InvalidXMLException(String message, @Nullable Attribute attribute, Throwable cause) {
this(message, attribute == null ? null : new Node(attribute), cause);
}
public InvalidXMLException(String message, Document document) {
this(message, document, null);
}
public InvalidXMLException(String message, String documentPath) {
this(message, documentPath, null);
}
public InvalidXMLException(String message, Node node) {
this(message, node, null);
}
public InvalidXMLException(String message, Element element) {
this(message, element, null);
}
public InvalidXMLException(String message, Attribute attribute) {
this(message, attribute, null);
}
public InvalidXMLException(String message) {
this(message, (Node) null);
}
public static InvalidXMLException fromJDOM(JDOMParseException e, String documentPath) {
return new InvalidXMLException(e.getMessage(), null, e.getPartialDocument(), documentPath, e.getLineNumber(), e.getLineNumber(), e.getColumnNumber(), e);
}
public static <T> T offeringNode(@Nullable Node node, ThrowingSupplier<T, ? extends InvalidXMLException> block) throws InvalidXMLException {
try {
return block.getThrows();
} catch(InvalidXMLException e) {
e.offerNode(node);
throw e;
}
}
public @Nullable Node getNode() {
return node;
}
public void setNode(@Nullable Node node) {
this.node = node;
if(node == null) {
document = null;
documentPath = null;
startLine = endLine = column = 0;
} else {
document = node.getDocument();
documentPath = document == null ? null : document.getBaseURI();
startLine = node.startLine();
endLine = node.endLine();
column = node.column();
}
}
public void offerNode(@Nullable Node node) {
if(this.node == null) {
setNode(node);
}
}
public @Nullable Document getDocument() {
return document;
}
public @Nullable String getDocumentPath() {
return documentPath;
}
public @Nullable String getWhere() {
return Node.describeLocation(startLine, endLine, column).orElse(null);
}
public @Nullable String getWhatAndWhere() {
String what = getNode() == null ? null : getNode().describe();
String where = getWhere();
if(what != null) {
if(where != null) {
return what + " @ " + where;
} else {
return what;
}
} else {
if(where != null) {
return where;
} else {
return null;
}
}
}
public @Nullable String getFullLocation() {
String path = getDocumentPath();
String location = getWhatAndWhere();
if(path != null) {
return location == null ? path : path + " - " + location;
} else {
return location == null ? null : location;
}
}
}