package fr.openwide.core.jpa.more.business.generic.util;
import java.io.Serializable;
import org.hibernate.Hibernate;
import com.google.common.collect.Ordering;
import fr.openwide.core.jpa.business.generic.model.GenericEntity;
import fr.openwide.core.jpa.more.business.generic.model.GenericListItem;
public class GenericListItemComparator extends Ordering<GenericListItem<?>> implements Serializable {
private static final long serialVersionUID = 2641214465049416075L;
public static final Ordering<GenericListItem<?>> INSTANCE = new GenericListItemComparator().nullsFirst();
public static final Ordering<GenericListItem<?>> get() {
return INSTANCE;
}
@Override
public int compare(GenericListItem<?> o1, GenericListItem<?> o2) {
int order = 0;
if (order == 0 && !Hibernate.getClass(o1).equals(Hibernate.getClass(o2))) {
order = GenericEntity.DEFAULT_STRING_COLLATOR.compare(Hibernate.getClass(o1).getSimpleName(),
Hibernate.getClass(o2).getSimpleName());
}
// on trie en priorité sur la position, puis sur le libellé et enfin par l'identifiant
if (order == 0 && o1.getPosition() != null && o2.getPosition() != null) {
order = o1.getPosition().compareTo(o2.getPosition());
}
if (order == 0 && o1.getPosition() != null && o2.getPosition() == null) {
order = -1;
}
if (order == 0 && o1.getPosition() == null && o2.getPosition() != null) {
order = 1;
}
if (order == 0 && o1.getLabel() != null) {
order = GenericEntity.DEFAULT_STRING_COLLATOR.compare(o1.getLabel(), o2.getLabel());
}
if (order == 0 && o1.getId() != null && o2.getId() != null) {
order = o1.getId().compareTo(o2.getId());
}
if (order == 0 && o1.getId() != null && o2.getId() == null) {
order = -1;
}
if (order == 0 && o1.getId() == null && o2.getId() != null) {
order = 1;
}
return order;
}
public Object readResolve() { // Maintains equals() consistency
return INSTANCE;
}
}