* {@inheritDoc}
*/
@Override
public final void initialize(Resource resource, final ValueMap params) throws
PersistenceException, RepositoryException {
final ModifiableValueMap properties = resource.adaptTo(ModifiableValueMap.class);
log.trace("Entering initialized");
if (properties.get(KEY_INITIALIZED, false)) {
log.warn("Refusing to re-initialize an already initialized Bulk Workflow Manager.");
return;
}
properties.putAll(params);
properties.put(KEY_JOB_NAME, resource.getPath());
// Query for all candidate resources
final ResourceResolver resourceResolver = resource.getResourceResolver();
final Session session = resourceResolver.adaptTo(Session.class);
final QueryManager queryManager = session.getWorkspace().getQueryManager();
final QueryResult queryResult = queryManager.createQuery(properties.get(KEY_QUERY, ""),
Query.JCR_SQL2).execute();
final NodeIterator nodes = queryResult.getNodes();
long size = nodes.getSize();
if (size < 0) {
log.debug("Using provided estimate total size [ {} ] as actual size [ {} ] could not be retrieved.",
properties.get(KEY_ESTIMATED_TOTAL, DEFAULT_ESTIMATED_TOTAL), size);
size = properties.get(KEY_ESTIMATED_TOTAL, DEFAULT_ESTIMATED_TOTAL);
}
final int batchSize = properties.get(KEY_BATCH_SIZE, DEFAULT_BATCH_SIZE);
final Bucket bucket = new Bucket(batchSize, size,
resource.getChild(NN_BATCHES).getPath(), "sling:Folder");
final String relPath = params.get(KEY_RELATIVE_PATH, "");
// Create the structure
String currentBatch = null;
int total = 0;
Node previousBatchNode = null, batchItemNode = null;
while (nodes.hasNext()) {
Node payloadNode = nodes.nextNode();
log.debug("nodes has next: {}", nodes.hasNext());
log.trace("Processing search result [ {} ]", payloadNode.getPath());
if (StringUtils.isNotBlank(relPath)) {
if (payloadNode.hasNode(relPath)) {
payloadNode = payloadNode.getNode(relPath);
} else {
log.warn("Could not find node at [ {} ]", payloadNode.getPath() + "/" + relPath);
continue;
}
// No rel path, so use the Query result node as the payload Node
}
total++;
final String batchPath = bucket.getNextPath(resourceResolver);
if (currentBatch == null) {
// Set the currentBatch to the first batch folder
currentBatch = batchPath;
}
final String batchItemPath = batchPath + "/" + total;
batchItemNode = JcrUtil.createPath(batchItemPath, SLING_FOLDER, JcrConstants.NT_UNSTRUCTURED, session,
false);
log.trace("Created batch item path at [ {} ]", batchItemPath);
JcrUtil.setProperty(batchItemNode, KEY_PATH, payloadNode.getPath());
log.trace("Added payload [ {} ] for batch item [ {} ]", payloadNode.getPath(), batchItemNode.getPath());
if (total % batchSize == 0) {
previousBatchNode = batchItemNode.getParent();
} else if ((total % batchSize == 1) && previousBatchNode != null) {
// Set the "next batch" property, so we know what the next batch to process is when
// the current batch is complete
JcrUtil.setProperty(previousBatchNode, KEY_NEXT_BATCH, batchItemNode.getParent().getPath());
}
if (total % SAVE_THRESHOLD == 0) {
session.save();
}
} // while
if (total > 0) {
// Set last batch's "next batch" property to complete so we know we're done
JcrUtil.setProperty(batchItemNode.getParent(), KEY_NEXT_BATCH, STATE_COMPLETE);
if (total % SAVE_THRESHOLD != 0) {
session.save();
}
properties.put(KEY_CURRENT_BATCH, currentBatch);
properties.put(KEY_TOTAL, total);
properties.put(KEY_INITIALIZED, true);
properties.put(KEY_STATE, STATE_NOT_STARTED);
resource.getResourceResolver().commit();
log.info("Completed initialization of Bulk Workflow Manager");
} else {