private static Resource getOrCreateResourceInternal()

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;
    }