6.2. Formal attributes
Usually all attributes are formal attributes, in the sense that properties of a type are managed by PicketLink. In order to get them managed by PicketLink you need to annotate each property of your type with Section 3.5.1, “The
@AttributeProperty
Annotation”
If you take the
User
type as an example, you'll see that all its properties are defined as follows:
public class User extends Agent { @AttributeProperty private String firstName; @AttributeProperty private String lastName; @AttributeProperty private String email; }
Formal attributes are strongly-typed as they are directly defined as properties in your type.
Those attributes are also queriable. Which means you can use the Query API to search for types with a specific property and value. If a property is queriable, we recommend to always create a
QueryParameter
constant as follows:
public class User extends Agent { /** * A query parameter used to set the firstName value. */ public static final QueryParameter FIRST_NAME = QUERY_ATTRIBUTE.byName("firstName"); /** * A query parameter used to set the lastName value. */ public static final QueryParameter LAST_NAME = QUERY_ATTRIBUTE.byName("lastName"); /** * A query parameter used to set the email value. */ public static final QueryParameter EMAIL = QUERY_ATTRIBUTE.byName("email"); @AttributeProperty private String firstName; @AttributeProperty private String lastName; @AttributeProperty private String email; }
Once the query parameters are defined and mapped to your properties, you can search for types based on its properties as follows:
IdentityQueryBuilder queryBuilder = identityManager.getQueryBuilder(); IdentityQuery<User> query = queryBuilder.createIdentityQuery(User.class); query.where(queryBuilder.like(User.FIRST_NAME, "John%")); // find only by the first name List<User> result = query.getResultList(); for (User user : result) { // do something }