You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@struts.apache.org by "Ted Husted (JIRA)" <ji...@apache.org> on 2006/07/11 23:57:17 UTC

[jira] Updated: (STR-2462) [validator] Expression Language Field Validator

     [ http://issues.apache.org/struts/browse/STR-2462?page=all ]

Ted Husted updated STR-2462:
----------------------------

    Bugzilla Id:   (was: 34849)
    Fix Version: TBD
                     (was: 1.2.5)
    Description: 
For all of those who are tired of requiredif and validWhen - here is the
Expression Language Field Validator.

What it does?
It gives the developer the power of EL to do a validation. This implementation
also provides access to most EL scopes including request, session, and
application scope. 
No more "only two items may be joined with and or or ":)

Implementation notes:
 - uses JEXL (http://jakarta.apache.org/commons/jexl/)
 - uses EnumeratedMap from standard taglibs (if someone does not like this
dependency - Map can be copied over to struts package, or became the internal class)

Things added:
 - ELValidator - class that provides validate method
 - PageContext implementation (reused MockPageContext)

Two classes - simple and beautiful.


1. Features:
1.1 Operators
(http://jakarta.apache.org/commons/jexl/reference/syntax.html#Functions):
 - Arithmetic: +, - (binary), /, div (int division), % and mod, -(unary) 
 - Logical: and, &&, or, ||, not, ! 
 - Relational: ==, eq, !=, ne, <, lt, >, gt, <=, ge, >=, le. 
 - Array access: arr1[0], arr1.0
 - Empty()
 - Size()

Notes: 
 - Avoid the '&', '<', '>' in validation.xml 
	- escape them: &amp; &gt; &lt or use 'and' 'lt' 'gt'.
 - No ternary operator A?B:C, workaround:
   - if A return B else C 	-> can be translated as "(A and B) or (!A and C)"
   - if A return B	     	-> can be translated as "(B or !A)" 

1.2 Implicit Objects
 - pageContext provides access to:
    -	servletContext
    -	session
    -	request
    -	response, servletConfig (no access to response and ServletConfig)
 - param - maps a request parameter name to a single value
 - paramValues - maps a request parameter name to an array of values
 - cookie - maps a cookie name to a single cookie
 - header - maps a request header name to a single value
 - headerValues - maps a request header name to an array of values
 - initParam - maps a context initialization parameter name to a single value

1.3 Scoped variables:
 - pageScope - maps page-scoped variable names to their values
 - requestScope - maps request-scoped variable names to their values
 - sessionScope - maps session-scoped variable names to their values
 - applicationScope - maps application-scoped variable names to their values

1.4 Additional Objects
 - form - form bean, added as a place holder for form variables  
 - arrayUtils - "instance" of commons ArrayUtils 
        allows expressions like: 
            arrayUtils.contains(paramValues.topic, "spring')
 - stringUtils - "instance" of commons StringUtils 
 - var - contains variables defined for this field in the validaton definitions
 - vars - contains variables defined for this field in validator definitions,
each one is string array, elements should be coma separated

2. Definition (this step is not needed since the
jakarta-struts/conf/share/validator-rules.xml was updated)

Validator definition in global section of validation.xml:

    <validator name="EL" 
       classname=" org.apache.struts.validator.ELValidator"
       method="validateEL"
       methodParams="java.lang.Object,
                 org.apache.commons.validator.ValidatorAction,
                 org.apache.commons.validator.Field,
                 org.apache.struts.action.ActionMessages,
                 javax.servlet.http.HttpServletRequest,
		   javax.servlet.ServletContext"         
       msg=" errors.required"/>

3. Examples
3.1. Company field is required for everyone except CSR and Admin.

<field  property="company" depends="EL" page="1">
	<var><var-name>EL</var-name>
		<var-value>
		 (sessionScope.currentUser != null 
                   and (
                           sessionScope.currentUser.userCSR
                           or sessionScope.currentUser.userAdmin
                       ) 
                 ) or !empty form.company
		</var-value></var>
	<arg0 key="company.displayname"/> 
</field>

Note: Try to write it with the validWhen:)

3.2. Only published status is allowed.
<field  property= "status" depends="EL" page="1">
	<var><var-name>allowedStatus</var-name>
              <var-value>published</var-value></var> 
	<var><var-name>EL</var-name>
	          <var-value>
		 form.status == var.allowedStatus
		</var-value></var>
	<arg0 key="id.displayname"/> 
</field>

3.3. "id" required only for edit, delete and store methods (RequestDispatcher).

<field  property= "id" depends="EL" page="1">
	<var><var-name>methods</var-name>
              <var-value>editForm,insert,update,delete</var-value></var> 
	<var><var-name>EL</var-name>
	          <var-value>
		!empty form.id
		or !arrayUtils.contains(vars.methods, param.email) 
		</var-value></var>
	<arg0 key="id.displayname"/> 
</field>

In my opinion it makes validation a way easier to write and to read:)
Please fell free to post comments. I hope you will enjoy it.

Lukasz Racon

  was:
For all of those who are tired of requiredif and validWhen - here is the
Expression Language Field Validator.

What it does?
It gives the developer the power of EL to do a validation. This implementation
also provides access to most EL scopes including request, session, and
application scope. 
No more "only two items may be joined with and or or ":)

Implementation notes:
 - uses JEXL (http://jakarta.apache.org/commons/jexl/)
 - uses EnumeratedMap from standard taglibs (if someone does not like this
dependency – Map can be copied over to struts package, or became the internal class)

Things added:
 - ELValidator - class that provides validate method
 - PageContext implementation (reused MockPageContext)

Two classes - simple and beautiful.


1. Features:
1.1 Operators
(http://jakarta.apache.org/commons/jexl/reference/syntax.html#Functions):
 - Arithmetic: +, - (binary), /, div (int division), % and mod, -(unary) 
 - Logical: and, &&, or, ||, not, ! 
 - Relational: ==, eq, !=, ne, <, lt, >, gt, <=, ge, >=, le. 
 - Array access: arr1[0], arr1.0
 - Empty()
 - Size()

Notes: 
 - Avoid the '&', '<', '>' in validation.xml 
	- escape them: &amp; &gt; &lt or use 'and' 'lt' 'gt'.
 - No ternary operator A?B:C, workaround:
   - if A return B else C 	-> can be translated as "(A and B) or (!A and C)"
   - if A return B	     	-> can be translated as "(B or !A)" 

1.2 Implicit Objects
 - pageContext provides access to:
    –	servletContext
    –	session
    –	request
    –	response, servletConfig (no access to response and ServletConfig)
 - param - maps a request parameter name to a single value
 - paramValues - maps a request parameter name to an array of values
 - cookie - maps a cookie name to a single cookie
 - header - maps a request header name to a single value
 - headerValues - maps a request header name to an array of values
 - initParam - maps a context initialization parameter name to a single value

1.3 Scoped variables:
 - pageScope - maps page-scoped variable names to their values
 - requestScope - maps request-scoped variable names to their values
 - sessionScope - maps session-scoped variable names to their values
 - applicationScope - maps application-scoped variable names to their values

1.4 Additional Objects
 - form - form bean, added as a place holder for form variables  
 - arrayUtils - "instance" of commons ArrayUtils 
        allows expressions like: 
            arrayUtils.contains(paramValues.topic, "spring')
 - stringUtils - "instance" of commons StringUtils 
 - var - contains variables defined for this field in the validaton definitions
 - vars - contains variables defined for this field in validator definitions,
each one is string array, elements should be coma separated

2. Definition (this step is not needed since the
jakarta-struts/conf/share/validator-rules.xml was updated)

Validator definition in global section of validation.xml:

    <validator name="EL" 
       classname=" org.apache.struts.validator.ELValidator"
       method="validateEL"
       methodParams="java.lang.Object,
                 org.apache.commons.validator.ValidatorAction,
                 org.apache.commons.validator.Field,
                 org.apache.struts.action.ActionMessages,
                 javax.servlet.http.HttpServletRequest,
		   javax.servlet.ServletContext"         
       msg=" errors.required"/>

3. Examples
3.1. Company field is required for everyone except CSR and Admin.

<field  property="company" depends="EL" page="1">
	<var><var-name>EL</var-name>
		<var-value>
		 (sessionScope.currentUser != null 
                   and (
                           sessionScope.currentUser.userCSR
                           or sessionScope.currentUser.userAdmin
                       ) 
                 ) or !empty form.company
		</var-value></var>
	<arg0 key="company.displayname"/> 
</field>

Note: Try to write it with the validWhen:)

3.2. Only published status is allowed.
<field  property= "status" depends="EL" page="1">
	<var><var-name>allowedStatus</var-name>
              <var-value>published</var-value></var> 
	<var><var-name>EL</var-name>
	          <var-value>
		 form.status == var.allowedStatus
		</var-value></var>
	<arg0 key="id.displayname"/> 
</field>

3.3. "id" required only for edit, delete and store methods (RequestDispatcher).

<field  property= "id" depends="EL" page="1">
	<var><var-name>methods</var-name>
              <var-value>editForm,insert,update,delete</var-value></var> 
	<var><var-name>EL</var-name>
	          <var-value>
		!empty form.id
		or !arrayUtils.contains(vars.methods, param.email) 
		</var-value></var>
	<arg0 key="id.displayname"/> 
</field>

In my opinion it makes validation a way easier to write and to read:)
Please fell free to post comments. I hope you will enjoy it.

Lukasz Racon

      Assign To:     (was: Struts Developers)

> [validator] Expression Language Field Validator
> -----------------------------------------------
>
>          Key: STR-2462
>          URL: http://issues.apache.org/struts/browse/STR-2462
>      Project: Struts 1
>         Type: Improvement

>   Components: Core
>     Versions: 1.2.6 Beta
>  Environment: Operating System: other
> Platform: Other
>     Reporter: Lukasz Racon
>     Priority: Minor
>      Fix For: TBD
>  Attachments: jexlValidator.patch, jexlValidator_ELValidator.patch, jexlValidator_PageContext.patch
>
> For all of those who are tired of requiredif and validWhen - here is the
> Expression Language Field Validator.
> What it does?
> It gives the developer the power of EL to do a validation. This implementation
> also provides access to most EL scopes including request, session, and
> application scope. 
> No more "only two items may be joined with and or or ":)
> Implementation notes:
>  - uses JEXL (http://jakarta.apache.org/commons/jexl/)
>  - uses EnumeratedMap from standard taglibs (if someone does not like this
> dependency - Map can be copied over to struts package, or became the internal class)
> Things added:
>  - ELValidator - class that provides validate method
>  - PageContext implementation (reused MockPageContext)
> Two classes - simple and beautiful.
> 1. Features:
> 1.1 Operators
> (http://jakarta.apache.org/commons/jexl/reference/syntax.html#Functions):
>  - Arithmetic: +, - (binary), /, div (int division), % and mod, -(unary) 
>  - Logical: and, &&, or, ||, not, ! 
>  - Relational: ==, eq, !=, ne, <, lt, >, gt, <=, ge, >=, le. 
>  - Array access: arr1[0], arr1.0
>  - Empty()
>  - Size()
> Notes: 
>  - Avoid the '&', '<', '>' in validation.xml 
> 	- escape them: &amp; &gt; &lt or use 'and' 'lt' 'gt'.
>  - No ternary operator A?B:C, workaround:
>    - if A return B else C 	-> can be translated as "(A and B) or (!A and C)"
>    - if A return B	     	-> can be translated as "(B or !A)" 
> 1.2 Implicit Objects
>  - pageContext provides access to:
>     -	servletContext
>     -	session
>     -	request
>     -	response, servletConfig (no access to response and ServletConfig)
>  - param - maps a request parameter name to a single value
>  - paramValues - maps a request parameter name to an array of values
>  - cookie - maps a cookie name to a single cookie
>  - header - maps a request header name to a single value
>  - headerValues - maps a request header name to an array of values
>  - initParam - maps a context initialization parameter name to a single value
> 1.3 Scoped variables:
>  - pageScope - maps page-scoped variable names to their values
>  - requestScope - maps request-scoped variable names to their values
>  - sessionScope - maps session-scoped variable names to their values
>  - applicationScope - maps application-scoped variable names to their values
> 1.4 Additional Objects
>  - form - form bean, added as a place holder for form variables  
>  - arrayUtils - "instance" of commons ArrayUtils 
>         allows expressions like: 
>             arrayUtils.contains(paramValues.topic, "spring')
>  - stringUtils - "instance" of commons StringUtils 
>  - var - contains variables defined for this field in the validaton definitions
>  - vars - contains variables defined for this field in validator definitions,
> each one is string array, elements should be coma separated
> 2. Definition (this step is not needed since the
> jakarta-struts/conf/share/validator-rules.xml was updated)
> Validator definition in global section of validation.xml:
>     <validator name="EL" 
>        classname=" org.apache.struts.validator.ELValidator"
>        method="validateEL"
>        methodParams="java.lang.Object,
>                  org.apache.commons.validator.ValidatorAction,
>                  org.apache.commons.validator.Field,
>                  org.apache.struts.action.ActionMessages,
>                  javax.servlet.http.HttpServletRequest,
> 		   javax.servlet.ServletContext"         
>        msg=" errors.required"/>
> 3. Examples
> 3.1. Company field is required for everyone except CSR and Admin.
> <field  property="company" depends="EL" page="1">
> 	<var><var-name>EL</var-name>
> 		<var-value>
> 		 (sessionScope.currentUser != null 
>                    and (
>                            sessionScope.currentUser.userCSR
>                            or sessionScope.currentUser.userAdmin
>                        ) 
>                  ) or !empty form.company
> 		</var-value></var>
> 	<arg0 key="company.displayname"/> 
> </field>
> Note: Try to write it with the validWhen:)
> 3.2. Only published status is allowed.
> <field  property= "status" depends="EL" page="1">
> 	<var><var-name>allowedStatus</var-name>
>               <var-value>published</var-value></var> 
> 	<var><var-name>EL</var-name>
> 	          <var-value>
> 		 form.status == var.allowedStatus
> 		</var-value></var>
> 	<arg0 key="id.displayname"/> 
> </field>
> 3.3. "id" required only for edit, delete and store methods (RequestDispatcher).
> <field  property= "id" depends="EL" page="1">
> 	<var><var-name>methods</var-name>
>               <var-value>editForm,insert,update,delete</var-value></var> 
> 	<var><var-name>EL</var-name>
> 	          <var-value>
> 		!empty form.id
> 		or !arrayUtils.contains(vars.methods, param.email) 
> 		</var-value></var>
> 	<arg0 key="id.displayname"/> 
> </field>
> In my opinion it makes validation a way easier to write and to read:)
> Please fell free to post comments. I hope you will enjoy it.
> Lukasz Racon

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/struts/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira