/*
* Copyright 2004 original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.extremecomponents.util;
import java.util.Comparator;
import org.apache.commons.beanutils.BeanComparator;
import org.apache.commons.beanutils.NestedNullException;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Override BeanComparator to workaround the NestedNullException thrown by
* PropertyUtils.getProperty(...) when a parent object in the hierarchy is null.
*
* @author vbala
* @version 1.0
*/
public class NullSafeBeanComparator extends BeanComparator {
private Log log = LogFactory.getLog(NullSafeBeanComparator.class);
protected boolean nullsAreHigh = true;
protected String property;
protected Comparator comparator;
public Comparator getComparator() {
return comparator;
}
public void setComparator(Comparator comparator) {
this.comparator = comparator;
}
public boolean isNullsAreHigh() {
return nullsAreHigh;
}
public void setNullsAreHigh(boolean nullsAreHigh) {
this.nullsAreHigh = nullsAreHigh;
}
public String getProperty() {
return property;
}
public void setProperty(String property) {
this.property = property;
}
/**
* Compare beans safely. Handles NestedNullException thrown by PropertyUtils
* when the parent object is null
*/
public int compare(Object o1, Object o2) {
if (property == null) {
// use the object's compare since no property is specified
return this.comparator.compare(o1, o2);
}
Object val1 = null, val2 = null;
try {
try {
val1 = PropertyUtils.getProperty(o1, property);
} catch (NestedNullException ignored) {
}
try {
val2 = PropertyUtils.getProperty(o2, property);
} catch (NestedNullException ignored) {
}
if (val1 == val2 || (val1 == null && val2 == null)) {
return -1;
}
if (val1 == null) {
return this.nullsAreHigh ? 1 : -1;
}
if (val2 == null) {
return this.nullsAreHigh ? -1 : 1;
}
return this.comparator.compare(val1, val2);
} catch (Exception e) {
e.printStackTrace();
log.warn(e);
return 0;
}
}
public NullSafeBeanComparator(String property, Comparator c) {
this.comparator = c;
this.property = property;
}
public NullSafeBeanComparator(String property, Comparator c, boolean nullAreHigh) {
this.comparator = c;
this.property = property;
this.nullsAreHigh = nullAreHigh;
}
}