diff -r 5d4c12338fe0 -r 428dca747d6b src/main/java/de/uapcore/lightpit/viewmodel/util/IssueSorter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/de/uapcore/lightpit/viewmodel/util/IssueSorter.java Fri Oct 09 15:35:48 2020 +0200 @@ -0,0 +1,78 @@ +package de.uapcore.lightpit.viewmodel.util; + +import de.uapcore.lightpit.entities.Issue; +import de.uapcore.lightpit.entities.IssueStatus; + +import java.util.Arrays; +import java.util.Comparator; + +public class IssueSorter implements Comparator { + + public enum Field { + PHASE, ETA, UPDATED + } + + public static class Criteria { + private Field field; + private boolean asc; + + public Criteria(Field field, boolean asc) { + this.field = field; + this.asc = asc; + } + + @Override + public boolean equals(Object obj) { + if (obj == null || !obj.getClass().equals(Criteria.class)) + return false; + final var other = (Criteria)obj; + return other.field.equals(field) && other.asc == asc; + } + } + + private final Criteria[] criteria; + + public IssueSorter(Criteria ... criteria) { + this.criteria = criteria; + } + + private int compare(Issue left, Issue right, Criteria criteria) { + int result; + switch (criteria.field) { + case PHASE: + result = Boolean.compare( + left.getPhase() == IssueStatus.PHASE_DONE, + right.getPhase() == IssueStatus.PHASE_DONE); + break; + case ETA: + if (left.getEta() != null && right.getEta() != null) + result = left.getEta().compareTo(right.getEta()); + else + result = left != null ? -1 : 1; + break; + case UPDATED: + result = left.getUpdated().compareTo(right.getUpdated()); + break; + default: + throw new UnsupportedOperationException(); + } + return criteria.asc ? result : -result; + } + + @Override + public int compare(Issue left, Issue right) { + for (var c : criteria) { + int r = compare(left, right, c); + if (r != 0) return r; + } + return 0; + } + + @Override + public boolean equals(Object o) { + if (o == null || !o.getClass().equals(IssueSorter.class)) + return false; + final var other = (IssueSorter) o; + return Arrays.equals(criteria, other.criteria); + } +}