[ 
https://issues.apache.org/jira/browse/JCR-1099?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12533166
 ] 

angela commented on JCR-1099:
-----------------------------

i see 2 possibilities to solve this (apart from the obvious one "get rid of 
SNSs" ;-)):

1) only check for NodeDefinition.allowsSNS if the definition has been retrieved 
before.
     if the definition is not yet present (which is the default for existing 
nodes), the index is calculated from the
     parents child entries.
     potential drawback: more traffic to the server since the entries list 
probably more often get invalidated compared 
     to the chance, that no matching definition is found in the 
ItemDefinitionProvider (which would result in the 
    described problem).

2) omit the fallback in ItemDefinitionProvider, that tries to retrieve the 
definition from the server
     if no matching definition can be found.
     drawback: if the definition is not available on the client, the retrieval 
of the definition fails with exception. i couldn't
     produce that since in my test case all definitions are available, but i'm 
quite sure that this would cause problems.

so... basically i would prefer 2) but i think 1) is the proper solution to go 
for just for the sake of stability and that
special (unlikely?) case that no matching definition can be found....  
comments?

angela

> jcr2spi NodeEntryImpl.getPath() blows stack due to getIndex() calling itself
> ----------------------------------------------------------------------------
>
>                 Key: JCR-1099
>                 URL: https://issues.apache.org/jira/browse/JCR-1099
>             Project: Jackrabbit
>          Issue Type: Bug
>          Components: SPI
>            Reporter: David Rauschenbach
>         Attachments: repository.xml
>
>
> The jcr2spi NodeEntryImpl class contains logic that causes getIndex() to call 
> itself.
> Calling code:
>     Session sess = repo.login(creds);
>     Node inboxNode = sess.getRootNode().getNode("Inbox");
>     inboxNode.getPath(); <== blows stack
> Tracing reveals:
>     1. NodeEntryImpl.getPath() ultimately calls getIndex()
>     2. getIndex() calls NodeState.getDefinition()
>     3. which calls ItemDefinitionProviderImpl.getQNodeDefinition(...)
>     4. which catches a RepositoryException then calls 
> NodeEntryImpl.getWorkspaceId()
>     5. which calls NodeEntryImpl.getWorkspaceIndex()
>     6. which calls getIndex() (back to step 2, ad infinitum)
> Configuration:
>     1. A configuration is loaded specifying in-memory persist manager
>     2. Config is wrapped in TransientRepository
>     3. that's wrapped in spi2jcr's RepositoryService using default 
> BatchReadConfig
>     4. a jcr2spi provider is instantiated that directly couples to spi2jcr
>     5. Node in question is created as follows:
>     Session sess = repo.login(creds);
>     sess.getRootNode().addNode("Inbox", "nt:folder");
>     sess.save();
> I guess that's about it.
> David

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

Reply via email to