/* * Copyright (c) 2009 Mysema Ltd. * All rights reserved. * */ package com.mysema.rdfbean.sesame; import java.io.Serializable; import java.util.Comparator; import org.openrdf.model.BNode; import org.openrdf.model.Literal; import org.openrdf.model.Statement; import org.openrdf.model.Value; /** * StatementComparator is a Comparator implementation for OpenRDF statements * * @author tiwe * @version $Id$ */ public class StatementComparator implements Comparator<Statement>, Serializable { private static final long serialVersionUID = 3827347034847500270L; @Override public int compare(Statement o1, Statement o2) { if (!o1.getSubject().equals(o2.getSubject())) { return compare(o1.getSubject(), o2.getSubject()); } else if (!o1.getPredicate().equals(o2.getPredicate())) { return compare(o1.getPredicate(), o2.getPredicate()); } else { return compare(o1.getObject(), o2.getObject()); } } private int compare(Value object, Value object2) { int pos1 = getPosition(object); int pos2 = getPosition(object2); if (pos1 != pos2) { return pos1 - pos2; } else { return object.toString().compareTo(object2.toString()); } } private int getPosition(Value object) { if (object instanceof Literal) { return 3; } else if (object instanceof BNode) { return 2; } else { return 1; } } }