package fr.openwide.core.wicket.more.markup.html.form;
import java.util.List;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.model.IModel;
import org.apache.wicket.util.lang.Args;
import com.google.common.collect.Lists;
import fr.openwide.core.wicket.more.markup.html.form.validation.IFormModelValidator;
import fr.openwide.core.wicket.more.util.model.Detachables;
public class ModelValidatingForm<E> extends Form<E> {
private static final long serialVersionUID = 214102105248521648L;
private final List<IFormModelValidator> formModelValidators = Lists.newArrayList();
public ModelValidatingForm(String id) {
super(id);
}
public ModelValidatingForm(String id, IModel<E> model) {
super(id, model);
}
@Override
protected void onValidateModelObjects() {
super.onValidateModelObjects();
for (IFormModelValidator formModelValidator : formModelValidators) {
validateFormModelValidator(formModelValidator);
}
}
private void validateFormModelValidator(IFormModelValidator validator) {
Args.notNull(validator, "validator");
final FormComponent<?>[] dependents = validator.getDependentFormComponents();
boolean validate = true;
if (dependents != null) {
for (final FormComponent<?> dependent : dependents) {
if (!dependent.isValid() || !dependent.isVisibleInHierarchy()) {
validate = false;
break;
}
}
}
if (validate) {
validator.validate(this);
}
}
public ModelValidatingForm<E> add(IFormModelValidator firstFormModelValidator, IFormModelValidator... otherFormModelValidators) {
formModelValidators.addAll(Lists.asList(firstFormModelValidator, otherFormModelValidators));
return this;
}
@Override
protected void onDetach() {
super.onDetach();
Detachables.detach(formModelValidators);
}
}