package org.drugis.common.validation;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.util.HashSet;
import java.util.Set;
import org.drugis.common.beans.ContentAwareListModel;
import org.drugis.common.event.IndifferentListDataListener;
import com.jgoodies.binding.beans.BeanUtils;
import com.jgoodies.binding.beans.Observable;
import com.jgoodies.binding.list.ObservableList;
import com.jgoodies.binding.value.AbstractValueModel;
public class ListItemsUniqueModel<E extends Observable> extends AbstractValueModel {
private static final long serialVersionUID = -5584835642904300645L;
private ObservableList<E> d_list;
private PropertyDescriptor d_propertyDescriptor;
private boolean d_value = true;
public ListItemsUniqueModel(ObservableList<E> list, Class<E> beanClass, String propertyName) {
d_list = new ContentAwareListModel<E>(list, new String[] {propertyName});
try {
d_propertyDescriptor = new PropertyDescriptor(propertyName, beanClass);
} catch (IntrospectionException e) {
throw new IllegalArgumentException(e);
}
d_list.addListDataListener(new IndifferentListDataListener() {
protected void update() {
boolean oldVal = d_value;
d_value = calculate();
fireValueChange(oldVal, d_value);
}
});
}
public Object getValue() {
return d_value;
}
public boolean calculate() {
Set<Object> objects = new HashSet<Object>();
for(E item : d_list) {
Object value = BeanUtils.getValue(item, d_propertyDescriptor);
if (objects.contains(value)) {
return false;
}
objects.add(value);
}
return true;
}
public void setValue(Object newValue) {
throw new UnsupportedOperationException("ListItemsUniqueModel is read-only");
}
}