in src/main/java/org/apache/sling/api/resource/ResourceUtil.java [637:706]
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;
}