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.