in vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/Importer.java [968:1042]
private void commit(Session session, TxInfo info, LinkedList<TxInfo> skipList) throws RepositoryException, IOException {
try {
ImportInfoImpl imp = null;
if (skipList.isEmpty()) {
if (info == cpTxInfo) {
// don't need to import again, just set import info
log.trace("skipping last checkpoint info {}", info.path);
imp = cpImportInfo;
} else {
imp = commit(session, info);
if (imp != null) {
nodesToCheckin.addAll(imp.getToVersion());
memberships.putAll(imp.getMemberships());
autoSave.modified(imp.numModified());
deletedPrincipalAcls.putAll(imp.getDeletedPrincipalAcls());
createdAuthorizableIds.addAll(imp.getCreatedAuthorizableIds());
}
}
} else if (log.isDebugEnabled()) {
StringBuilder skips = new StringBuilder();
for (TxInfo i: skipList) {
skips.append(i.path).append(',');
}
log.trace("skip list: {}", skips);
}
if (autoSave.needsSave()) {
autoSave.save(session, true); // this is only intermediate
// save checkpoint
cpTxInfo = info;
cpAutosave = autoSave.copy();
cpImportInfo = imp;
recoveryRetryCounter = 0;
/*
todo: check retry logic if it's ok to discard all processed infos or if some ancestors should be excluded
// discard processed infos to free some memory
for (TxInfo i: processedInfos) {
i.discard();
}
*/
removedIntermediates.clear();
processedInfos.clear();
}
// copy the children collection since children could be removed during remapping
List<TxInfo> children = new ArrayList<TxInfo>(info.children().values());
// traverse children but skip the ones not in the skip list
TxInfo next = skipList.isEmpty() ? null : skipList.removeFirst();
for (TxInfo child: children) {
if (next == null || next == child) {
commit(session, child, skipList);
// continue normally after lng child was found
next = null;
} else {
log.trace("skipping {}", child.path);
}
}
// see if any child nodes need to be reordered
if (info.nameList != null) {
Node node = info.getNode(session);
if (node == null) {
log.warn("Unable to restore order of {}. Node does not exist.", info.path);
} else if (info.nameList.needsReorder(node)) {
log.trace("Restoring order of {}.", info.path);
info.nameList.restoreOrder(node);
}
}
processedInfos.add(info);
} catch (RepositoryException e) {
log.error("Error while committing {}: {}", info.path, e.toString());
throw e;
}
}