in src/main/java/org/apache/sling/event/impl/jobs/JobManagerImpl.java [391:511]
public Collection<Job> findJobs(final QueryType type,
final String topic,
final long limit,
final Map<String, Object>... templates) {
final boolean isHistoryQuery = type == QueryType.HISTORY
|| type == QueryType.SUCCEEDED
|| type == QueryType.CANCELLED
|| type == QueryType.DROPPED
|| type == QueryType.ERROR
|| type == QueryType.GIVEN_UP
|| type == QueryType.STOPPED;
final List<Job> result = new ArrayList<>();
final ResourceResolver resolver = this.configuration.createResourceResolver();
final StringBuilder buf = new StringBuilder(64);
try {
buf.append(buildBaseQuery(this.configuration.getJobsBasePathWithSlash(), topic, type, isHistoryQuery));
if ( templates != null && templates.length > 0 ) {
int index = 0;
for (final Map<String,Object> template : templates) {
// skip empty templates
if ( template.size() == 0 ) {
continue;
}
if ( index == 0 ) {
buf.append(" and (");
} else {
buf.append(" or ");
}
buf.append('(');
final Iterator<Map.Entry<String, Object>> i = template.entrySet().iterator();
boolean first = true;
while ( i.hasNext() ) {
final Map.Entry<String, Object> current = i.next();
final String key = current.getKey();
final char firstChar = key.length() > 0 ? key.charAt(0) : 0;
String propName;
final Operation op;
if ( firstChar == '=' ) {
propName = key.substring(1);
op = Operation.EQUALS;
} else if ( firstChar == '<' ) {
final char secondChar = key.length() > 1 ? key.charAt(1) : 0;
if ( secondChar == '=' ) {
op = Operation.LESS_OR_EQUALS;
propName = key.substring(2);
} else {
op = Operation.LESS;
propName = key.substring(1);
}
} else if ( firstChar == '>' ) {
final char secondChar = key.length() > 1 ? key.charAt(1) : 0;
if ( secondChar == '=' ) {
op = Operation.GREATER_OR_EQUALS;
propName = key.substring(2);
} else {
op = Operation.GREATER;
propName = key.substring(1);
}
} else {
propName = key;
op = Operation.EQUALS;
}
propName = ISO9075.encode(propName);
if ( first ) {
first = false;
buf.append('@');
} else {
buf.append(" and @");
}
buf.append(propName);
buf.append(' ');
switch ( op ) {
case EQUALS : buf.append('=');break;
case LESS : buf.append('<'); break;
case LESS_OR_EQUALS : buf.append("<="); break;
case GREATER : buf.append('>'); break;
case GREATER_OR_EQUALS : buf.append(">="); break;
}
buf.append(" '");
buf.append(current.getValue());
buf.append("'");
}
buf.append(')');
index++;
}
if ( index > 0 ) {
buf.append(')');
}
}
buf.append("] order by @");
if ( isHistoryQuery ) {
buf.append(JobImpl.PROPERTY_FINISHED_DATE);
buf.append(" descending");
} else {
buf.append(Job.PROPERTY_JOB_CREATED);
buf.append(" ascending");
}
final Iterator<Resource> iter = resolver.findResources(buf.toString(), "xpath");
long count = 0;
while ( iter.hasNext() && (limit < 1 || count < limit) ) {
final Resource jobResource = iter.next();
// sanity check for the path
if ( this.configuration.isJob(jobResource.getPath()) ) {
final JobImpl job = Utility.readJob(logger, jobResource);
if ( job != null ) {
count++;
result.add(job);
}
}
}
} catch (final QuerySyntaxException qse) {
logger.warn("Query syntax wrong " + buf.toString(), qse);
} finally {
resolver.close();
}
return result;
}