package japicmp.model;
import com.google.common.base.Optional;
import javassist.CtClass;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlTransient;
import java.util.ArrayList;
import java.util.List;
public class JApiImplementedInterface implements JApiHasChangeStatus, JApiCompatibility {
private final CtClass ctClass;
private final String fullyQualifiedName;
private final JApiChangeStatus changeStatus;
private final List<JApiCompatibilityChange> compatibilityChanges = new ArrayList<>();
private Optional<JApiClass> correspondingJApiClass = Optional.absent();
public JApiImplementedInterface(CtClass ctClass, String fullyQualifiedName, JApiChangeStatus changeStatus) {
this.ctClass = ctClass;
this.fullyQualifiedName = fullyQualifiedName;
this.changeStatus = changeStatus;
}
@XmlAttribute
public String getFullyQualifiedName() {
return fullyQualifiedName;
}
@XmlAttribute
public JApiChangeStatus getChangeStatus() {
return changeStatus;
}
@Override
@XmlAttribute
public boolean isBinaryCompatible() {
boolean binaryCompatible = true;
for (JApiCompatibilityChange compatibilityChange : compatibilityChanges) {
if (!compatibilityChange.isBinaryCompatible()) {
binaryCompatible = false;
}
}
if (binaryCompatible && correspondingJApiClass.isPresent()) {
if (!correspondingJApiClass.get().isBinaryCompatible()) {
binaryCompatible = false;
}
}
return binaryCompatible;
}
@Override
@XmlAttribute
public boolean isSourceCompatible() {
boolean sourceCompatible = true;
for (JApiCompatibilityChange compatibilityChange : compatibilityChanges) {
if (!compatibilityChange.isSourceCompatible()) {
sourceCompatible = false;
}
}
if (sourceCompatible && correspondingJApiClass.isPresent()) {
if (!correspondingJApiClass.get().isSourceCompatible()) {
sourceCompatible = false;
}
}
return sourceCompatible;
}
@XmlElementWrapper(name = "compatibilityChanges")
@XmlElement(name = "compatibilityChange")
public List<JApiCompatibilityChange> getCompatibilityChanges() {
return compatibilityChanges;
}
public void setJApiClass(JApiClass jApiClass) {
this.correspondingJApiClass = Optional.of(jApiClass);
}
@XmlTransient
public CtClass getCtClass() {
return ctClass;
}
}