Antonio Sanso created SLING-2913:
------------------------------------

             Summary: Issue in AbstractCreateOperation#deepGetOrCreateNode
                 Key: SLING-2913
                 URL: https://issues.apache.org/jira/browse/SLING-2913
             Project: Sling
          Issue Type: Bug
          Components: Servlets
            Reporter: Antonio Sanso


While updating the AbstractCreateOperation to use new CRUD support in POST 
servlet has been some lost in translation.

The previous code looked like 

{code}

    protected Node deepGetOrCreateNode(Session session, String path,
            Map<String, RequestProperty> reqProperties, List<Modification> 
changes,
            VersioningConfiguration versioningConfiguration)
            throws RepositoryException {
        if (log.isDebugEnabled()) {
            log.debug("Deep-creating Node '{}'", path);
        }
        if (path == null || !path.startsWith("/")) {
            throw new IllegalArgumentException("path must be an absolute 
path.");
        }
        // get the starting node
        String startingNodePath = path;
        Node startingNode = null;
        while (startingNode == null) {
            if (startingNodePath.equals("/")) {
                startingNode = session.getRootNode();
            } else if (session.itemExists(startingNodePath)) {
                startingNode = (Node) session.getItem(startingNodePath);
                updateNodeType(session, startingNodePath, reqProperties, 
changes, versioningConfiguration);
                updateMixins(session, startingNodePath, reqProperties, changes, 
versioningConfiguration);
            } else {
                int pos = startingNodePath.lastIndexOf('/');
                if (pos > 0) {
                    startingNodePath = startingNodePath.substring(0, pos);
                } else {
                    startingNodePath = "/";
                }
            }
        }
{code}

while the updated is 

{code}
protected Resource deepGetOrCreateNode(final ResourceResolver resolver,
                    final String path,
                    final Map<String, RequestProperty> reqProperties,
                    final List<Modification> changes,
                    final VersioningConfiguration versioningConfiguration)
    throws PersistenceException, RepositoryException {
        if (log.isDebugEnabled()) {
            log.debug("Deep-creating resource '{}'", path);
        }
        if (path == null || !path.startsWith("/")) {
            throw new IllegalArgumentException("path must be an absolute 
path.");
        }
        // get the starting resource
        String startingResourcePath = path;
        Resource startingResource = null;
        while (startingResource == null) {
            if (startingResourcePath.equals("/")) {
                startingResource = resolver.getResource("/");
            } else if (resolver.getResource(startingResourcePath) != null) {
                startingResource = resolver.getResource(startingResourcePath);
                updateNodeType(resolver, startingResourcePath, reqProperties, 
changes, versioningConfiguration);
                updateMixins(resolver, startingResourcePath, reqProperties, 
changes, versioningConfiguration);
            } else {
                int pos = startingResourcePath.lastIndexOf('/');
                if (pos > 0) {
                    startingResourcePath = startingResourcePath.substring(0, 
pos);
                } else {
                    startingResourcePath = "/";
                }
            }
        }
{code}

The main difference is in that the 

 startingNode = session.getRootNode(); could throw a RepositoryException e.g. 
if the session did not have enough permission while startingResource = 
resolver.getResource("/"); would just return null.

This might cause a theoretical infinite loop.



--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to