public abstract class ValidateMultipleFields extends ValidatorFamily
validateValues(FacesContext, List, List)
method to perform the actual validation.
This validator must be placed inside the same UIForm
as the UIInput
components in question.
The UIInput
components must be referenced by a space separated collection of their client IDs in the
components
attribute. This validator can be placed anywhere in the form, but keep in mind that the
components will be validated in the order as they appear in the form. So if this validator is been placed before all
of the components, then it will be executed before any of the component's own validators. If this validator fails,
then the component's own validators will not be fired. If this validator is been placed after all of the components,
then it will be executed after any of the component's own validators. If any of them fails, then this validator
will not be exeucted. It is not recommended to put this validator somewhere in between the referenced components as
the resulting behaviour may be confusing. Put this validator either before or after all of the components, depending
on how you would like to prioritize the validation.
<o:validateMultipleFields id="myId" components="foo bar baz" /> <h:message for="myId" /> <h:inputText id="foo" /> <h:inputText id="bar" /> <h:inputText id="baz" />
In an invalidating case, all of the referenced components will be marked invalid and a faces message will be added
on the client ID of this validator component. The default message can be changed by the message
attribute. Any "{0}" placeholder in the message will be substituted with a comma separated string of labels of the
referenced input components.
<o:validateMultipleFields components="foo bar baz" message="{0} are wrong!" />
The faces message can also be shown for all of the referenced components using showMessageFor="@all"
.
<o:validateMultipleFields components="foo bar baz" message="This is wrong!" showMessageFor="@all" /> <h:inputText id="foo" /> <h:message for="foo" /> <h:inputText id="bar" /> <h:message for="bar" /> <h:inputText id="baz" /> <h:message for="baz" />
The showMessageFor
attribute defaults to @this
. Other values than @this
or
@all
are not allowed.
The validator can be disabled by the disabled
attribute. It accepts a request based EL expression.
<o:validateMultipleFields components="foo bar baz" disabled="#{param.validationDisabled}" />
TODO: support for immediate="true".
COMPONENT_FAMILY
BEANINFO_KEY, bindings, COMPOSITE_COMPONENT_TYPE_KEY, COMPOSITE_FACET_NAME, CURRENT_COMPONENT, CURRENT_COMPOSITE_COMPONENT, FACETS_KEY, VIEW_LOCATION_KEY
Constructor and Description |
---|
ValidateMultipleFields(String defaultMessage)
The default constructor sets the default message and sets the renderer type to
null . |
Modifier and Type | Method and Description |
---|---|
protected List<UIInput> |
collectComponents()
Collect the input components.
|
protected List<Object> |
collectValues(List<UIInput> inputs)
Collect the values of the given input components.
|
String |
getComponents()
Returns the client identifiers of components which are to be validated.
|
String |
getMessage()
Returns the validation message to be shown.
|
String |
getShowMessageFor()
Returns the client identifier to show the validation message for.
|
boolean |
isDisabled()
Returns whether the validation should be disabled or not.
|
void |
setComponents(String components)
Sets the client identifiers of components which are to be validated.
|
void |
setDisabled(boolean disabled)
Sets whether the validation should be disabled or not.
|
void |
setMessage(String message)
Sets the validation message to be shown.
|
void |
setShowMessageFor(String showMessageFor)
Sets the client identifier to show the validation message for.
|
protected void |
showMessage(FacesContext context,
List<UIInput> inputs)
Show the message at the desired place(s) depending on the value of the
showMessageFor attribute. |
protected void |
validateComponents(FacesContext context)
If the validation is not disabled, collect the components, if it is not empty, then collect their values and
delegate to
validateValues(FacesContext, List, List) . |
protected void |
validateHierarchy()
Validate our component hierarchy.
|
protected abstract boolean |
validateValues(FacesContext context,
List<UIInput> components,
List<Object> values)
Perform the validation on the collected values of the input components and returns whether the validation is
successful.
|
encodeChildren, getFamily, getRendersChildren, processDecodes, processUpdates, processValidators
addClientBehavior, addFacesListener, broadcast, clearInitialState, decode, encodeBegin, encodeEnd, findComponent, getAttributes, getChildCount, getChildren, getClientBehaviors, getClientId, getDefaultEventName, getEventNames, getFacesContext, getFacesListeners, getFacet, getFacetCount, getFacets, getFacetsAndChildren, getId, getParent, getRenderer, getRendererType, getValueBinding, invokeOnComponent, isRendered, isTransient, markInitialState, processRestoreState, processSaveState, queueEvent, removeFacesListener, restoreAttachedState, restoreState, saveAttachedState, saveState, setId, setParent, setRendered, setRendererType, setTransient, setValueBinding
encodeAll, getClientId, getCompositeComponentParent, getContainerClientId, getCurrentComponent, getCurrentCompositeComponent, getListenersForEventClass, getNamingContainer, getResourceBundleMap, getStateHelper, getStateHelper, getValueExpression, initialStateMarked, isCompositeComponent, isInView, isVisitable, popComponentFromEL, processEvent, pushComponentToEL, setInView, setValueExpression, subscribeToEvent, unsubscribeFromEvent, visitTree
public ValidateMultipleFields(String defaultMessage)
null
.protected void validateHierarchy() throws IllegalArgumentException
validateHierarchy
in class ValidatorFamily
IllegalArgumentException
- When there is no parent of type UIForm
, or when there are any children.protected void validateComponents(FacesContext context)
validateValues(FacesContext, List, List)
. If it returns false
, then mark all
inputs and the faces context invalid and finally delegate to showMessage(FacesContext, List)
to show
the message.validateComponents
in class ValidatorFamily
context
- The faces context to work with.protected List<UIInput> collectComponents()
UIInput
, are rendered, not disabled nor
readonly will be returned. If at least one of them has already been validated and is been marked invalid, then an
empty collection will be returned.IllegalArgumentException
- When the components
attribute is missing, or when it references an
non-existing component, or when it references a non-input component.protected List<Object> collectValues(List<UIInput> inputs)
inputs
- The input components to collect values from.protected abstract boolean validateValues(FacesContext context, List<UIInput> components, List<Object> values)
context
- The faces context to work with.components
- The input components whose values are to be validated.values
- The values of the input components to be validated.true
if validation is successful, otherwise false
(and thus show the message).protected void showMessage(FacesContext context, List<UIInput> inputs)
showMessageFor
attribute.
<h:message>
for this component.
components
attribute.
context
- The faces context to work with.inputs
- The validated input components.public String getComponents()
public void setComponents(String components)
components
- The client identifiers of components which are to be validated.public String getMessage()
public void setMessage(String message)
message
- The validation message to be shown.public String getShowMessageFor()
public void setShowMessageFor(String showMessageFor)
showMessageFor
- The client identifier to show the validation message for.public boolean isDisabled()
public void setDisabled(boolean disabled)
disabled
- Whether the validation should be disabled or not.