You need to test the state of a bean, testing for the presence or absence of simple and nested bean properties.
Use a BeanPredicate
from Commons BeanUtils. A BeanPredicate
is an implementation of the
Predicate
interface defined in
Commons Collections. As described in Chapter
4, a Predicate
's evaluate()
method takes an object and returns
a boolean
; BeanPredicate
decorates another Predicate
, allowing that Predicate
to evaluate a bean property: simple,
nested, indexed, or mapped. The following code demonstrates the use of
BeanPredicate
to validate the
condition of a bean:
import org.apache.commons.beanutils.*; import org.apache.commons.collections.*; // A Predicate that returns true if the "name" property is not null Predicate teamNotNull = new BeanPredicate( "name", new NotNullPredicate( ) ); // A Predicate that returns true if the "coach.firstName" property // is "Tom" Predicate coachFirstName = new BeanPredicate( "coach.firstName", new EqualsPredicate("Tom") ); // Tie two Predicates together into an AndPredicate Predicate validateTeam = new AllPredicate( predicateArray ); // Create Team Objects Team fish = new Team( "Swordfish", new Coach( "Tom", "O'Connell") ); Team hens = new Team( "Hens", new Coach( "Bob", "McGarry") ); boolean fishValid = validateTeam.evaluate( fish ); boolean henValid = validateTeam.evaluate( hens ); System.out.println( "Is Swordfish team valid? " + fishValid ); System.out.println( "Is Hens team valid? " + hensValid );
Assume that the two Team
objects contain two properties: name
and coach
. The coach
property on Team
is a Coach
object with two properties: firstName
and lastName
. The first BeanPredicate
, teamNotNull
, uses a NotNullPredicate
to test the simple property
name
. The second BeanPredicate
uses an EqualPredicate
to test the nested property
coach.firstName
. In the previous
example, a Team
object is only valid
if it has a name, and the first name of the coach is "Tom." Two teams
are created and the following output is printed:
Is Swordfish team valid? true Is Hens team valid? false
A BeanPredicate
obtains the
value of the specified bean property using PropertyUtils
and passes the resulting
property value to the Predicate
it
was constructed with; BeanPredicate
decorates another Predicate
. The
following example demonstrates the use of BeanPredicate
, wrapping an EqualPredicate
, InstanceofPredicate
, and a composite AnyPredicate
:
import org.apache.commons.collections.Predicate; import org.apache.commons.beanutils.BeanPredicate; import org.apache.commons.collections.functors.AnyPredicate; import org.apache.commons.collections.functors.EqualPredicate; import org.apache.commons.collections.functors.InstanceofPredicate; import org.apache.commons.collections.functors.OrPredicate; // A predicate to validate the value of the age property Predicate example1 = new BeanPredicate( "age", new EqualPredicate( new Integer( 10 ) ); // A predicate to validate the type of the title property Predicate example2 = new BeanPredicate( "book[4].title", new InstanceofPredicate( String.class ) ); // A composite predicate definition Predicate equalA = new EqualsPredicate("A"); Predicate equalB = new EqualsPredicate("B"); Predicate equalC = new EqualsPredicate("C"); Predicate eitherABC = new AnyPredicate( new Predicate[] { equalA, equalB, equalC } ); // A predicate to validate the type of the title property Predicate example3 = new BeanPredicate( "mode", eitherABC );
Predicate example1
tests the
age
property of a bean, passing the
property value to an EqualPredicate
,
which returns true if age is 10. Predicate example2
tests the property title
from the fifth element in the book
property; if the book's title property
value is of type String
, example2
returns true. Predicate example3
tests the value of the mode
property of a bean, it evaluates to true
if mode
equals "A," "B," or "C."
These three examples demonstrate that a BeanPredicate
is a simple decorator, which
allows one to apply any Predicate
to
a bean property.
Chapter 4 contains more recipes
focused on using Predicate
implementations to perform complex validation and to create intelligent,
self-validating collections. This recipe introduces two simple
predicates; EqualPredicate
and
NotNullPredicate
are discussed in
Recipe 4.7. For more
information about using predicates, see Chapter
4 and the Commons Collections project site at http://commons.apache.org/collections.