src/main/java/de/uapcore/lightpit/viewmodel/util/IssueSorter.java

changeset 121
428dca747d6b
child 141
8160dfc4dbc3
--- /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<Issue> {
+
+    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);
+    }
+}

mercurial