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

Thu, 22 Oct 2020 13:06:46 +0200

author
Mike Becker <universe@uap-core.de>
date
Thu, 22 Oct 2020 13:06:46 +0200
changeset 139
6abc75d213ef
parent 121
428dca747d6b
child 141
8160dfc4dbc3
permissions
-rw-r--r--

fixes issue list not using the project's node

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