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