001/*
002 * The contents of this file are subject to the license and copyright
003 * detailed in the LICENSE and NOTICE files at the root of the source
004 * tree.
005 */
006package org.fcrepo.http.commons.api.rdf;
007
008import java.util.Comparator;
009
010import org.apache.jena.graph.Triple;
011import org.apache.jena.shared.PrefixMapping;
012
013/**
014 * Comparator to sort a list of Quads by subject, predicate, and object
015 * to ensure a consistent order for human-readable output
016 *
017 * @author awoods
018 */
019public class TripleOrdering implements Comparator<Triple> {
020
021    private final PrefixMapping prefixMapping;
022
023    /**
024     * When sorting predicates, take into account the given PrefixMapping
025     * @param prefixMapping the prefix mapping
026     */
027    public TripleOrdering(final PrefixMapping prefixMapping) {
028        super();
029
030        this.prefixMapping = prefixMapping;
031    }
032
033    @Override
034    public int compare(final Triple left, final Triple right) {
035
036        final int s =
037                left.getSubject().toString(prefixMapping, false).compareTo(
038                        right.getSubject().toString(prefixMapping, false));
039
040        if (s != 0) {
041            return s;
042        }
043
044        final int p =
045                left.getPredicate().toString(prefixMapping, false).compareTo(
046                        right.getPredicate().toString(prefixMapping, false));
047
048        if (p != 0) {
049            return p;
050        }
051
052        return left.getObject().toString(false).compareTo(
053                right.getObject().toString(false));
054
055    }
056
057}