The user management API provided with Jackrabbit comes with a dedicated query API that allows for searching authorizables indepedant of the underlying user management implementation.
The following conditions can be used to find authorizables by properties:
Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() { public <T> void build(QueryBuilder<T> builder) { builder.setCondition(builder.eq("@name", vf.createValue("jackrabbit"))); } }); Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() { public <T> void build(QueryBuilder<T> builder) { builder.setCondition(builder.gt("profile/@weight", vf.createValue(200.0))); } }); Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() { public <T> void build(QueryBuilder<T> builder) { builder.setCondition(builder.contains("profile/@color", "gold")); } }); Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() { public <T> void build(QueryBuilder<T> builder) { builder.setCondition(builder.exists("@poisonous")); } });
The following conditions allow to specify a search pattern, where ‘%’ represents any string of zero or more characters and ‘_’ represents any single character.
Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() { public <T> void build(QueryBuilder<T> builder) { builder.setCondition(builder.like("profile/@food", "c%")); } }); Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() { public <T> void build(QueryBuilder<T> builder) { builder.setCondition(builder.like("profile/@food", "c_t")); } });
Use “.” to indicate that properties with any name at a given relative path should be included in the search result.
Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() { public <T> void build(QueryBuilder<T> builder) { builder.setCondition(builder.contains(".", ""jackrabbit"")); } }); Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() { public <T> void build(QueryBuilder<T> builder) { builder.setCondition(builder.contains("profile/.", "gold")); } });
Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() { public <T> void build(QueryBuilder<T> builder) { builder.setCondition(builder.and( builder.eq("profile/@cute", vf.createValue(true)), builder.eq("profile/@color", vf.createValue("black")) )); } }); Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() { public <T> void build(QueryBuilder<T> builder) { builder.setCondition(builder.or( builder.eq("profile/@food", vf.createValue("mice")), builder.eq("profile/@food", vf.createValue("nectar")) ) ); } }); Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() { public <T> void build(QueryBuilder<T> builder) { builder.setCondition(builder.not(builder.exists("profile/@food")) )); } }); Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() { public <T> void build(QueryBuilder<T> builder) { builder.setCondition(builder.and( builder.eq("profile/@cute", vf.createValue(true)), builder.not(builder.eq("profile/@color", vf.createValue("black"))) )); } });
where direction can be either of
final boolean ignoreCase = true; Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() { public <T> void build(QueryBuilder<T> builder) { builder.setCondition(builder.exists("profile/@weight")); builder.setSortOrder("profile/@weight", QueryBuilder.Direction.ASCENDING, ignoreCase); } });
final long offset = 25; final long maxCount = 1000; // -1 for no limit Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() { public <T> void build(QueryBuilder<T> builder) { builder.setLimit(offset, maxCount); } }); Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() { public <T> void build(QueryBuilder<T> builder) { builder.setCondition(builder.eq("profile/@cute", vf.createValue(true))); builder.setSortOrder("profile/@weight", QueryBuilder.Direction.ASCENDING, true); builder.setLimit(vf.createValue(1000.0), count); } });
The selector may take any of the following values:
NOTE: the ‘nameMatches’ condition is a shortcut for a regular search for the principal name, which in the default implementation is stored in rep:principalName. It does not take any custom name properties into account nor query rep:authorizableId.
Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() { public <T> void build(QueryBuilder<T> builder) { builder.setCondition(builder.nameMatches("j%P")); } }); Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() { public <T> void build(QueryBuilder<T> builder) { builder.setCondition(builder.nameMatches("c_tP")); } });
See sections Differences to Jackrabbit 2.x and The Default Implementation for details.
See org.apache.jackrabbit.commons.jackrabbit.user.AuthorizableQueryManager for a utility class provided by the jcr-commons module present with Jackrabbit.