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

Sat, 31 Oct 2020 09:56:00 +0100

author
Mike Becker <universe@uap-core.de>
date
Sat, 31 Oct 2020 09:56:00 +0100
changeset 155
3ace475224f7
parent 150
822b7e3d064d
child 167
3f30adba1c63
permissions
-rw-r--r--

fixes issue sorter not recognizing issues as "equal" if their ETAs are both null

     1 package de.uapcore.lightpit.viewmodel.util;
     3 import de.uapcore.lightpit.entities.Issue;
     4 import de.uapcore.lightpit.entities.IssueStatusPhase;
     6 import java.util.Arrays;
     7 import java.util.Comparator;
     9 public class IssueSorter implements Comparator<Issue> {
    11     public enum Field {
    12         DONE, ETA, UPDATED
    13     }
    15     public static class Criteria {
    16         private Field field;
    17         private boolean asc;
    19         public Criteria(Field field, boolean asc) {
    20             this.field = field;
    21             this.asc = asc;
    22         }
    24         @Override
    25         public boolean equals(Object obj) {
    26             if (obj == null || !obj.getClass().equals(Criteria.class))
    27                 return false;
    28             final var other = (Criteria)obj;
    29             return other.field.equals(field) && other.asc == asc;
    30         }
    31     }
    33     private final Criteria[] criteria;
    35     public IssueSorter(Criteria ... criteria) {
    36         this.criteria = criteria;
    37     }
    39     private int compare(Issue left, Issue right, Criteria criteria) {
    40         if (left.equals(right))
    41             return 0;
    43         int result;
    44         switch (criteria.field) {
    45             case DONE:
    46                 result = Boolean.compare(
    47                         left.getStatus().getPhase().equals(IssueStatusPhase.Companion.getDone()),
    48                         right.getStatus().getPhase().equals(IssueStatusPhase.Companion.getDone()));
    49                 break;
    50             case ETA:
    51                 if (left.getEta() != null && right.getEta() != null)
    52                     result = left.getEta().compareTo(right.getEta());
    53                 else if (left.getEta() == null && right.getEta() == null)
    54                     result = 0;
    55                 else
    56                     result = left.getEta() != null ? -1 : 1;
    57                 break;
    58             case UPDATED:
    59                 result = left.getUpdated().compareTo(right.getUpdated());
    60                 break;
    61             default:
    62                 throw new UnsupportedOperationException();
    63         }
    64         return criteria.asc ? result : -result;
    65     }
    67     @Override
    68     public int compare(Issue left, Issue right) {
    69         for (var c : criteria) {
    70             int r = compare(left, right, c);
    71             if (r != 0) return r;
    72         }
    73         return 0;
    74     }
    76     @Override
    77     public boolean equals(Object o) {
    78         if (o == null || !o.getClass().equals(IssueSorter.class))
    79             return false;
    80         final var other = (IssueSorter) o;
    81         return Arrays.equals(criteria, other.criteria);
    82     }
    83 }

mercurial