1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/main/java/de/uapcore/lightpit/viewmodel/util/IssueSorter.java Fri Oct 09 15:35:48 2020 +0200 1.3 @@ -0,0 +1,78 @@ 1.4 +package de.uapcore.lightpit.viewmodel.util; 1.5 + 1.6 +import de.uapcore.lightpit.entities.Issue; 1.7 +import de.uapcore.lightpit.entities.IssueStatus; 1.8 + 1.9 +import java.util.Arrays; 1.10 +import java.util.Comparator; 1.11 + 1.12 +public class IssueSorter implements Comparator<Issue> { 1.13 + 1.14 + public enum Field { 1.15 + PHASE, ETA, UPDATED 1.16 + } 1.17 + 1.18 + public static class Criteria { 1.19 + private Field field; 1.20 + private boolean asc; 1.21 + 1.22 + public Criteria(Field field, boolean asc) { 1.23 + this.field = field; 1.24 + this.asc = asc; 1.25 + } 1.26 + 1.27 + @Override 1.28 + public boolean equals(Object obj) { 1.29 + if (obj == null || !obj.getClass().equals(Criteria.class)) 1.30 + return false; 1.31 + final var other = (Criteria)obj; 1.32 + return other.field.equals(field) && other.asc == asc; 1.33 + } 1.34 + } 1.35 + 1.36 + private final Criteria[] criteria; 1.37 + 1.38 + public IssueSorter(Criteria ... criteria) { 1.39 + this.criteria = criteria; 1.40 + } 1.41 + 1.42 + private int compare(Issue left, Issue right, Criteria criteria) { 1.43 + int result; 1.44 + switch (criteria.field) { 1.45 + case PHASE: 1.46 + result = Boolean.compare( 1.47 + left.getPhase() == IssueStatus.PHASE_DONE, 1.48 + right.getPhase() == IssueStatus.PHASE_DONE); 1.49 + break; 1.50 + case ETA: 1.51 + if (left.getEta() != null && right.getEta() != null) 1.52 + result = left.getEta().compareTo(right.getEta()); 1.53 + else 1.54 + result = left != null ? -1 : 1; 1.55 + break; 1.56 + case UPDATED: 1.57 + result = left.getUpdated().compareTo(right.getUpdated()); 1.58 + break; 1.59 + default: 1.60 + throw new UnsupportedOperationException(); 1.61 + } 1.62 + return criteria.asc ? result : -result; 1.63 + } 1.64 + 1.65 + @Override 1.66 + public int compare(Issue left, Issue right) { 1.67 + for (var c : criteria) { 1.68 + int r = compare(left, right, c); 1.69 + if (r != 0) return r; 1.70 + } 1.71 + return 0; 1.72 + } 1.73 + 1.74 + @Override 1.75 + public boolean equals(Object o) { 1.76 + if (o == null || !o.getClass().equals(IssueSorter.class)) 1.77 + return false; 1.78 + final var other = (IssueSorter) o; 1.79 + return Arrays.equals(criteria, other.criteria); 1.80 + } 1.81 +}