in src/main/java/org/apache/sling/api/resource/ResourceUtil.java [641:707]
private static Resource getOrCreateResourceInternal(
final ResourceResolver resolver,
final String path,
final Map<String, Object> resourceProperties,
final String intermediateResourceType,
final boolean autoCommit)
throws PersistenceException {
Resource rsrc = resolver.getResource(path);
if (rsrc == null) {
final int lastPos = path.lastIndexOf('/');
final String name = path.substring(lastPos + 1);
final Resource parentResource;
if (lastPos == 0) {
parentResource = resolver.getResource("/");
} else {
final String parentPath = path.substring(0, lastPos);
parentResource = getOrCreateResource(
resolver, parentPath, intermediateResourceType, intermediateResourceType, autoCommit);
}
if (autoCommit) {
resolver.refresh();
}
try {
int retry = 5;
while (retry > 0 && rsrc == null) {
rsrc = resolver.create(parentResource, name, resourceProperties);
// check for SNS
if (!name.equals(rsrc.getName())) {
resolver.refresh();
resolver.delete(rsrc);
rsrc = resolver.getResource(parentResource, name);
}
retry--;
}
if (rsrc == null) {
throw new PersistenceException("Unable to create resource.");
}
} catch (final PersistenceException pe) {
// this could be thrown because someone else tried to create this
// node concurrently
resolver.refresh();
rsrc = resolver.getResource(parentResource, name);
if (rsrc == null) {
throw pe;
}
}
if (autoCommit) {
try {
resolver.commit();
resolver.refresh();
rsrc = resolver.getResource(parentResource, name);
} catch (final PersistenceException pe) {
// try again - maybe someone else did create the resource in the meantime
// or we ran into Jackrabbit's stale item exception in a clustered environment
resolver.revert();
resolver.refresh();
rsrc = resolver.getResource(parentResource, name);
if (rsrc == null) {
rsrc = resolver.create(parentResource, name, resourceProperties);
resolver.commit();
}
}
}
}
return rsrc;
}