You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jackrabbit.apache.org by "Julian Reschke (JIRA)" <ji...@apache.org> on 2008/10/20 11:34:44 UTC

[jira] Commented: (JCR-1821) jcr2spi: Item.isSame may return wrong result if any ancestor is invalidated

    [ https://issues.apache.org/jira/browse/JCR-1821?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12640957#action_12640957 ] 

Julian Reschke commented on JCR-1821:
-------------------------------------

For completeness (not sure whether this is possible and worth the effort):

4) change RepositoryService.submit(batch) to return sufficient information so that JCR2SPI can update things like UUIDs and autocreated properties.



> jcr2spi: Item.isSame may return wrong result if any ancestor is invalidated
> ---------------------------------------------------------------------------
>
>                 Key: JCR-1821
>                 URL: https://issues.apache.org/jira/browse/JCR-1821
>             Project: Jackrabbit
>          Issue Type: Bug
>          Components: jackrabbit-jcr2spi
>            Reporter: angela
>            Assignee: angela
>             Fix For: 1.5.0
>
>
> julian detected an issue with jcr2spi that was previously shadowed due to heavy reloading of items upon save.
> with the most recent changes however reloading of items is postponed until the next access. this will cause the following test to fail:
>         Node n = testRootNode.addNode("aFile", "nt:file");
>         n = n.addNode("jcr:content", "nt:resource");
>         n.setProperty("jcr:lastModified", Calendar.getInstance());
>         n.setProperty("jcr:mimeType", "text/plain");
>         Property jcrData = n.setProperty("jcr:data", "abc", PropertyType.BINARY);
>         testRootNode.save();
>         // access same property through different session
>         Session otherSession = helper.getReadOnlySession();
>         try {
>             Property otherProperty = (Property) otherSession.getItem(jcrData.getPath());
>             assertTrue(jcrData.isSame(otherProperty));
>         } finally {
>             otherSession.logout();
>         }
> while 
>      
>        assertTrue(n.isSame(otherSession.getItem(n.getPath()));
> would be successful.
> the reason: the jcrData property is not reloaded and it's parent is still _invalidated_. consequently the property isn't aware of it's id having changed due to the fact that nt:resource is a node type extending from mix:referenceable.
> possible fixes:
> 1) mark all items _invalid_ after save 
>     instead of setting status non-protected/autocreated properties to EXISTING.
>     -> forcing jcrData to be reloaded before isSame can be called.
>     -> drawback: much more round trip(s) to the server just to make sure the id is up to date.
> 2) change Item#isSame to make sure the workspaceId is up to date (walking up the
>      hierarchy and force reloading of the first invalidated ancestor).
>      -> drawback: if referenceable nodes are rare or missing at all, this causes some
>           extra round trips.
>  
> 3) change Item.isSame to compare the 'workspacePath' instead of the 'workspaceId'.
>      -> drawback: upon persisted move of a referenceable node Item#isSame will return false
> after taking a closer look at the code and at some additional tests i would opt for 2).

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.