/**
 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
 */

package net.sourceforge.pmd;

import java.util.Comparator;

/**
 * Compares RuleViolations using the following criteria:
 * <ol>
 * <li>Source file name</li>
 * <li>Begin line</li>
 * <li>Description</li>
 * <li>Begin column</li>
 * <li>End line</li>
 * <li>End column</li>
 * <li>Rule name</li>
 * </ol>
 */
public final class RuleViolationComparator implements Comparator<RuleViolation> {

    public static final RuleViolationComparator INSTANCE = new RuleViolationComparator();

    private RuleViolationComparator() {
    }

    @Override
    public int compare(final RuleViolation r1, final RuleViolation r2) {
        int cmp = r1.getFilename().compareTo(r2.getFilename());
        if (cmp == 0) {
            cmp = r1.getBeginLine() - r2.getBeginLine();
            if (cmp == 0) {
                cmp = compare(r1.getDescription(), r2.getDescription());
                if (cmp == 0) {
                    cmp = r1.getBeginColumn() - r2.getBeginColumn();
                    if (cmp == 0) {
                        cmp = r1.getEndLine() - r2.getEndLine();
                        if (cmp == 0) {
                            cmp = r1.getEndColumn() - r2.getEndColumn();
                            if (cmp == 0) {
                                cmp = r1.getRule().getName().compareTo(r2.getRule().getName());
                            }
                        }
                    }
                }
            }
        }
        return cmp;
    }

    private static int compare(final String s1, final String s2) {
        // Treat null as larger
        if (s1 == null) {
            return 1;
        } else if (s2 == null) {
            return -1;
        } else {
            return s1.compareTo(s2);
        }
    }
}
