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

package de.uapcore.lightpit.viewmodel.util;

import de.uapcore.lightpit.entities.Issue;
import de.uapcore.lightpit.entities.IssueStatusPhase;

import java.util.Arrays;
import java.util.Comparator;

public class IssueSorter implements Comparator<Issue> {

    public enum Field {
        DONE, 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) {
        if (left.equals(right))
            return 0;

        int result;
        switch (criteria.field) {
            case DONE:
                result = Boolean.compare(
                        left.getStatus().getPhase().equals(IssueStatusPhase.Companion.getDone()),
                        right.getStatus().getPhase().equals(IssueStatusPhase.Companion.getDone()));
                break;
            case ETA:
                if (left.getEta() != null && right.getEta() != null)
                    result = left.getEta().compareTo(right.getEta());
                else if (left.getEta() == null && right.getEta() == null)
                    result = 0;
                else
                    result = left.getEta() != 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