package de.flower.common.ui.model;
import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Collection;
/**
* Model for labels that returns a fallback model when default model returns empty or blank object.
*
* @author flowerrrr
*/
public class FallbackModel<T> extends AbstractReadOnlyModel<T> {
private final static Logger log = LoggerFactory.getLogger(FallbackModel.class);
private IModel<T> fallbackModel;
private IModel<T> targetModel;
public FallbackModel(IModel<T> fallbackModel, IModel<T> targetModel) {
this.fallbackModel = fallbackModel;
this.targetModel = targetModel;
}
@Override
public T getObject() {
T object = targetModel.getObject();
if (isEmptyOrBlank(object)) {
return fallbackModel.getObject();
} else {
return object;
}
}
private boolean isEmptyOrBlank(T object) {
if (object == null) {
return true;
}
if (object instanceof String) {
return StringUtils.isBlank((CharSequence) object);
} else if (object instanceof Collection) {
return ((Collection) object).isEmpty();
} else {
log.warn("Unknown type [" + object.getClass() + "]. cannot check for empty or blank");
return false;
}
}
@Override
public void detach() {
fallbackModel.detach();
targetModel.detach();
super.detach();
}
}