package org.nextprot.api.core.utils.annot.comp; import org.nextprot.api.commons.constants.AnnotationCategory; import org.nextprot.api.commons.exception.NextProtException; import org.nextprot.api.core.domain.annotation.Annotation; import org.nextprot.api.core.utils.annot.AnnotationUtils; import java.util.Comparator; import java.util.List; import java.util.Map; class ByAnnotationSubjectComparator extends HashableAnnotationComparator { ByAnnotationSubjectComparator(final Map<String, Annotation> annotationByHash) { this(annotationByHash, new SubjectComparator()); } ByAnnotationSubjectComparator(final Map<String, Annotation> annotationByHash, final Comparator<Annotation> subjectAnnotationComparator) { super(annotationByHash, subjectAnnotationComparator); } @Override protected Object getReferencedAnnotationContainer(Annotation annotation) { return annotation.getSubjectComponents(); } @Override protected String getAnnotationHash(final Annotation annotation) { List<String> subjectAnnotationHashList = annotation.getSubjectComponents(); if (subjectAnnotationHashList.isEmpty()) throw new NextProtException("cannot find subject for annotation "+ AnnotationUtils.toString(annotation)); return subjectAnnotationHashList.get(0); } private static class SubjectComparator implements Comparator<Annotation> { @Override public int compare(final Annotation sa1, final Annotation sa2) { if (sa1.getAPICategory() == null) throw new NextProtException("undefined AnnotationCategory for subject annotation:\n" + AnnotationUtils.toString(sa1)); if (sa2.getAPICategory() == null) throw new NextProtException("undefined AnnotationCategory for subject annotation:\n" + AnnotationUtils.toString(sa2)); if (sa1.getAPICategory() == sa2.getAPICategory()) { return AnnotationComparators.newComparator(sa1.getAPICategory()) .compare(sa1, sa2); } else if (sa1.getAPICategory().getParent() == AnnotationCategory.POSITIONAL_ANNOTATION && sa2.getAPICategory().getParent() == AnnotationCategory.POSITIONAL_ANNOTATION) { return new ByFeaturePositionComparator() .compare(sa1, sa2); } return sa1.getAPICategory().compareTo(sa2.getAPICategory()); } } }