package com.softwaremill.common.faces.validator;
import com.google.common.base.Strings;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.ValidatorException;
import javax.servlet.http.HttpServletRequest;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
/**
* Validator that will only perform validation if f:param performValidation is set to "true".
*
* You can pass validatorId and/or required = true
*/
@FacesValidator("onSubmitValidator")
public class OnSubmitValidator extends AbstractDelgatingValidator {
private static final String PERFORM_VALIDATION = "performValidation";
private static final String REQUIRED = "onSubmitRequired";
private static final String REQUIRED_MESSAGE = "onSubmitRequiredMessage";
private static final String TRUE = "true";
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
if (!performValidationParameterSet(context)) {
return;
}
Set<FacesMessage> messages = new HashSet<FacesMessage>();
if (TRUE.equals(component.getAttributes().get(REQUIRED))) {
// make it just required
if (valueIsEmpty(value)) {
String requiredMessage = "Value is required !";
if (component.getAttributes().get(REQUIRED_MESSAGE) != null) {
requiredMessage = component.getAttributes().get(REQUIRED_MESSAGE).toString();
}
FacesMessage message = new FacesMessage(requiredMessage);
message.setSeverity(FacesMessage.SEVERITY_ERROR);
messages.add(message);
}
}
if (component.getAttributes().get(VALIDATOR_ID) != null) {
// otherwise call the validator
try {
super.validate(context, component, value);
} catch (ValidatorException e) {
// retrieve messages
messages.addAll(e.getFacesMessages());
}
}
// if there are any messages - throw validation exception
if (!messages.isEmpty()) {
throw new ValidatorException(messages);
}
}
private boolean performValidationParameterSet(FacesContext context) {
return TRUE.equals(
((HttpServletRequest) context.getExternalContext().getRequest()).getParameter(PERFORM_VALIDATION));
}
private boolean valueIsEmpty(Object value) {
return value == null || (value instanceof String && Strings.isNullOrEmpty((String) value)) ||
(value instanceof Collection && ((Collection) value).isEmpty());
}
}