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 faces message can also be shown for specific components referenced by a space separated collection of their
client IDs in showMessageFor
attribute.
<o:validateMultipleFields components="foo bar baz" message="This is wrong!" showMessageFor="foo baz" /> <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
.
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}" />
There is a read-only validationFailed
attribute which can be used to determine if the validation by
this component has failed.
<o:validateMultipleFields id="myId" binding="#{myId}" components="foo bar baz" /> <h:panelGroup rendered="#{myId.validationFailed}"> Validation has failed! <h:message for="myId" /> </h:panelGroup>
TODO: support for immediate="true".
COMPONENT_FAMILY
Constructor and Description |
---|
ValidateMultipleFields(java.lang.String defaultMessage)
The default constructor sets the default message and sets the renderer type to
null . |
Modifier and Type | Method and Description |
---|---|
protected java.util.List<javax.faces.component.UIInput> |
collectComponents()
Collect the input components.
|
protected java.util.List<java.lang.Object> |
collectValues(java.util.List<javax.faces.component.UIInput> inputs)
Collect the values of the given input components.
|
java.lang.String |
getComponents()
Returns the client identifiers of components which are to be validated.
|
java.lang.String |
getMessage()
Returns the validation message to be shown.
|
java.lang.String |
getShowMessageFor()
Returns the client identifiers to show the validation message for.
|
java.lang.Boolean |
isDisabled()
Returns whether the validation should be disabled or not.
|
boolean |
isValidationFailed()
Returns whether the validation has failed or not.
|
void |
setComponents(java.lang.String components)
Sets the client identifiers of components which are to be validated.
|
void |
setDisabled(java.lang.Boolean disabled)
Sets whether the validation should be disabled or not.
|
void |
setMessage(java.lang.String message)
Sets the validation message to be shown.
|
void |
setShowMessageFor(java.lang.String showMessageFor)
Sets the client identifiers to show the validation message for.
|
protected void |
showMessage(javax.faces.context.FacesContext context,
java.util.List<javax.faces.component.UIInput> inputs)
Show the message at the desired place(s) depending on the value of the
showMessageFor attribute. |
protected void |
validateComponents(javax.faces.context.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(javax.faces.context.FacesContext context,
java.util.List<javax.faces.component.UIInput> components,
java.util.List<java.lang.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(java.lang.String defaultMessage)
null
.protected void validateHierarchy() throws java.lang.IllegalArgumentException
validateHierarchy
in class ValidatorFamily
java.lang.IllegalArgumentException
- When there is no parent of type UIForm
, or when there are any children.protected void validateComponents(javax.faces.context.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 java.util.List<javax.faces.component.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.java.lang.IllegalArgumentException
- When the components
attribute is missing, or when it references an
non-existing component, or when it references a non-input component.protected java.util.List<java.lang.Object> collectValues(java.util.List<javax.faces.component.UIInput> inputs)
inputs
- The input components to collect values from.protected abstract boolean validateValues(javax.faces.context.FacesContext context, java.util.List<javax.faces.component.UIInput> components, java.util.List<java.lang.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(javax.faces.context.FacesContext context, java.util.List<javax.faces.component.UIInput> inputs)
showMessageFor
attribute.
@this
: message will be added to the <h:message>
for this component.
@all
: message will be added to all components as specified in components
attribute.
UIInput
component.
context
- The faces context to work with.inputs
- The validated input components.public java.lang.String getComponents()
public void setComponents(java.lang.String components)
components
- The client identifiers of components which are to be validated.public java.lang.String getMessage()
public void setMessage(java.lang.String message)
message
- The validation message to be shown.public java.lang.String getShowMessageFor()
public void setShowMessageFor(java.lang.String showMessageFor)
showMessageFor
- The client identifiers to show the validation message for.public java.lang.Boolean isDisabled()
public void setDisabled(java.lang.Boolean disabled)
disabled
- Whether the validation should be disabled or not.public boolean isValidationFailed()