*/
public void execute( final ExecutionContext context,
final Request request ) throws RepositorySourceException {
if (request instanceof AccessQueryRequest) {
AccessQueryRequest queryRequest = (AccessQueryRequest)request;
RequestProcessor searchProcessor = searchEngine().createProcessor(context, null, true);
try {
searchProcessor.process(queryRequest);
} finally {
searchProcessor.close();
}
} else if (request instanceof FullTextSearchRequest) {
FullTextSearchRequest searchRequest = (FullTextSearchRequest)request;
RequestProcessor searchProcessor = searchEngine().createProcessor(context, null, true);
try {
searchProcessor.process(searchRequest);
} finally {
searchProcessor.close();
}
} else if (request instanceof CompositeRequest) {
CompositeRequest composite = (CompositeRequest)request;
List<Request> delegateRequests = null;
RequestProcessor searchProcessor = null;
try {
Request delegateRequest = composite;
for (Request nested : composite) {
if (nested instanceof AccessQueryRequest) {
AccessQueryRequest queryRequest = (AccessQueryRequest)request;
if (searchProcessor == null) searchProcessor = searchEngine().createProcessor(context, null, true);
searchProcessor.process(queryRequest);
delegateRequest = null;
} else if (nested instanceof FullTextSearchRequest) {
FullTextSearchRequest searchRequest = (FullTextSearchRequest)request;
if (searchProcessor == null) searchProcessor = searchEngine().createProcessor(context, null, true);
searchProcessor.process(searchRequest);
delegateRequest = null;
} else {
// Delegate the request ...
if (delegateRequests == null) {
delegateRequests = new LinkedList<Request>();
}
delegateRequests.add(request);
}
}
if (delegateRequest == null) {
// Then there was at least one query or search request ...
if (delegateRequests != null) {
// There was other requests ...
assert !delegateRequests.isEmpty();
delegateRequest = CompositeRequest.with(delegateRequests);
delegateConnection().execute(context, delegateRequest);
} else {
// There were no other requests in the composite other than the search and/or query requests ...
// So nothing to do ...
}
} else {
// There were no search or query requests, so delegate the orginal composite request ...
delegateConnection().execute(context, request);
}
} finally {
if (searchProcessor != null) {
searchProcessor.close();
}
}
} else {
// Just a single, non-query and non-search request ...
delegateConnection().execute(context, request);