You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@sling.apache.org by "Carsten Ziegeler (JIRA)" <ji...@apache.org> on 2013/07/09 09:15:48 UTC

[jira] [Assigned] (SLING-2913) Issue in AbstractCreateOperation#deepGetOrCreateNode

     [ https://issues.apache.org/jira/browse/SLING-2913?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Carsten Ziegeler reassigned SLING-2913:
---------------------------------------

    Assignee: Carsten Ziegeler
    
> 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
>            Assignee: Carsten Ziegeler
>             Fix For: Servlets Post 2.3.2
>
>         Attachments: SLING-2913-patch.txt
>
>
> 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