universe@121: package de.uapcore.lightpit.viewmodel.util; universe@121: universe@121: import de.uapcore.lightpit.entities.Issue; universe@150: import de.uapcore.lightpit.entities.IssueStatusPhase; universe@121: universe@121: import java.util.Arrays; universe@121: import java.util.Comparator; universe@121: universe@121: public class IssueSorter implements Comparator { universe@121: universe@121: public enum Field { universe@141: DONE, ETA, UPDATED universe@121: } universe@121: universe@121: public static class Criteria { universe@121: private Field field; universe@121: private boolean asc; universe@121: universe@121: public Criteria(Field field, boolean asc) { universe@121: this.field = field; universe@121: this.asc = asc; universe@121: } universe@121: universe@121: @Override universe@121: public boolean equals(Object obj) { universe@121: if (obj == null || !obj.getClass().equals(Criteria.class)) universe@121: return false; universe@121: final var other = (Criteria)obj; universe@121: return other.field.equals(field) && other.asc == asc; universe@121: } universe@121: } universe@121: universe@121: private final Criteria[] criteria; universe@121: universe@121: public IssueSorter(Criteria ... criteria) { universe@121: this.criteria = criteria; universe@121: } universe@121: universe@121: private int compare(Issue left, Issue right, Criteria criteria) { universe@155: if (left.equals(right)) universe@155: return 0; universe@155: universe@121: int result; universe@121: switch (criteria.field) { universe@141: case DONE: universe@121: result = Boolean.compare( universe@150: left.getStatus().getPhase().equals(IssueStatusPhase.Companion.getDone()), universe@150: right.getStatus().getPhase().equals(IssueStatusPhase.Companion.getDone())); universe@121: break; universe@121: case ETA: universe@121: if (left.getEta() != null && right.getEta() != null) universe@121: result = left.getEta().compareTo(right.getEta()); universe@155: else if (left.getEta() == null && right.getEta() == null) universe@155: result = 0; universe@121: else universe@143: result = left.getEta() != null ? -1 : 1; universe@121: break; universe@121: case UPDATED: universe@121: result = left.getUpdated().compareTo(right.getUpdated()); universe@121: break; universe@121: default: universe@121: throw new UnsupportedOperationException(); universe@121: } universe@121: return criteria.asc ? result : -result; universe@121: } universe@121: universe@121: @Override universe@121: public int compare(Issue left, Issue right) { universe@121: for (var c : criteria) { universe@121: int r = compare(left, right, c); universe@121: if (r != 0) return r; universe@121: } universe@121: return 0; universe@121: } universe@121: universe@121: @Override universe@121: public boolean equals(Object o) { universe@121: if (o == null || !o.getClass().equals(IssueSorter.class)) universe@121: return false; universe@121: final var other = (IssueSorter) o; universe@121: return Arrays.equals(criteria, other.criteria); universe@121: } universe@121: }