package japicmp.model;
import com.google.common.base.Optional;
import japicmp.cmp.JarArchiveComparator;
import javassist.CtClass;
import javax.xml.bind.annotation.XmlAttribute;
public class JApiException implements JApiHasChangeStatus {
private final String name;
private final JApiChangeStatus changeStatus;
private final boolean checkedException;
public JApiException(JarArchiveComparator jarArchiveComparator, String name, Optional<CtClass> ctClassOptional, JApiChangeStatus changeStatus) {
this.name = name;
this.changeStatus = changeStatus;
this.checkedException = isCheckedException(ctClassOptional, jarArchiveComparator);
}
private boolean isCheckedException(Optional<CtClass> ctClassOptional, JarArchiveComparator jarArchiveComparator) throws OutOfMemoryError {
boolean checkedException = false;
if (ctClassOptional.isPresent()) {
boolean subClassOfException = false;
CtClass ctClass = ctClassOptional.get();
Optional<CtClass> exceptionOptional = jarArchiveComparator.loadClass(JarArchiveComparator.ArchiveType.NEW, Exception.class.getName());
if (exceptionOptional.isPresent()) {
if (ctClass.subclassOf(exceptionOptional.get())) {
subClassOfException = true;
}
}
if (subClassOfException) {
Optional<CtClass> runtimeExceptionOptional = jarArchiveComparator.loadClass(JarArchiveComparator.ArchiveType.NEW, RuntimeException.class.getName());
if (runtimeExceptionOptional.isPresent()) {
if (!ctClass.subclassOf(runtimeExceptionOptional.get())) {
checkedException = true;
}
}
}
}
return checkedException;
}
@XmlAttribute(name = "name")
public String getName() {
return name;
}
@XmlAttribute(name = "changeStatus")
public JApiChangeStatus getChangeStatus() {
return changeStatus;
}
public boolean isCheckedException() {
return checkedException;
}
}