package fr.openwide.core.jpa.more.business.generic.util;
import java.util.Comparator;
import com.google.common.collect.Ordering;
import fr.openwide.core.jpa.business.generic.model.GenericEntity;
import fr.openwide.core.jpa.business.generic.util.AbstractGenericEntityComparator;
import fr.openwide.core.jpa.more.business.generic.model.GenericListItem;
public abstract class AbstractGenericListItemComparator<E extends GenericListItem<?>> extends AbstractGenericEntityComparator<Long, E>{
private static final long serialVersionUID = -6024767658595096844L;
private static final Ordering<Integer> DEFAULT_POSITION_COMPARATOR = Ordering.natural().nullsLast();
private static final Ordering<String> DEFAULT_LABEL_COMPARATOR = GenericEntity.DEFAULT_STRING_COLLATOR;
private final Comparator<? super Integer> positionComparator;
private final Comparator<? super String> labelComparator;
public AbstractGenericListItemComparator() {
super();
this.positionComparator = DEFAULT_POSITION_COMPARATOR;
this.labelComparator = DEFAULT_LABEL_COMPARATOR;
}
/**
* @param labelComparator The {@link GenericListItem#getLabel() label} comparator.
* Must be null-safe in order for this comparator to be null-safe.
* Must be serializable in order for this comparator to be serializable.
*/
public AbstractGenericListItemComparator(Comparator<? super String> labelComparator) {
super();
this.positionComparator = DEFAULT_POSITION_COMPARATOR;
this.labelComparator = labelComparator;
}
/**
* @param nullIsLow see {@link AbstractGenericEntityComparator#AbstractGenericEntityComparator(boolean, Comparator)}
* @param keyComparator see {@link AbstractGenericEntityComparator#AbstractGenericEntityComparator(boolean, Comparator)}
* @param positionComparator The {@link GenericListItem#getPosition() position} comparator.
* Must be null-safe in order for this comparator to be null-safe.
* Must be serializable in order for this comparator to be serializable.
* @param labelComparator The {@link GenericListItem#getLabel() label} comparator.
* Must be null-safe in order for this comparator to be null-safe.
* Must be serializable in order for this comparator to be serializable.
*/
public AbstractGenericListItemComparator(boolean nullIsLow, Comparator<? super Long> keyComparator,
Comparator<? super Integer> positionComparator, Comparator<? super String> labelComparator) {
super(nullIsLow, keyComparator);
this.positionComparator = positionComparator;
this.labelComparator = labelComparator;
}
@Override
protected int compareNotNullObjects(E left, E right) {
// on trie en priorité sur la position, puis sur le libellé et enfin par l'identifiant
int order = positionComparator.compare(left.getPosition(), right.getPosition());
if (order == 0) {
order = labelComparator.compare(left.getLabel(), right.getLabel());
}
if (order == 0) {
order = super.compareNotNullObjects(left, right);
}
return order;
}
}