jackrabbit-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Michael Daglian (JIRA)" <j...@apache.org>
Subject [jira] Created: (JCR-586) Removing a mixin that adds a same-name-sibling child node throws an ItemNotFoundException
Date Thu, 05 Oct 2006 20:16:19 GMT
Removing a mixin that adds a same-name-sibling child node throws an ItemNotFoundException
-----------------------------------------------------------------------------------------

                 Key: JCR-586
                 URL: http://issues.apache.org/jira/browse/JCR-586
             Project: Jackrabbit
          Issue Type: Bug
          Components: core, nodetype
    Affects Versions: 0.9, 1.0, 1.0.1, 1.1
         Environment: Tested with trunk from 04-Oct-2006 (1.1)
            Reporter: Michael Daglian
            Priority: Minor


Apologies in advance if this has previously been noted in JIRA or on the lists but I couldn't
find anything. When removing a mixin that defines a same-name-sibling child an ItemNotFoundException
is thrown due to child node indicies not being maintained. A similar method of NodeImpl (onRemove)
recongnized this and amended to remove from the tail but the removeMixin also has this issue.

Simple test reproduction:

Types:

[mix:foo] mixin
	+ bar (nt:bar) multiple
	
[nt:bar] > nt:unstructured, mix:referenceable

Code:

public class RemoveMixinTest extends AbstractServerTest {
    private static final String MIXIN = "mix:foo";
    private static final String CHILD = "bar";
    private static final String PTYPE = "nt:bar";
    
    public void testRemoveMixin() throws RepositoryException {
        Session session = getSession();
        Node root = session.getRootNode().addNode("root");
        root.addMixin(MIXIN);
        
        root.addNode(CHILD, PTYPE);
        root.addNode(CHILD, PTYPE);
        root.addNode(CHILD, PTYPE);
        
        session.save();
        
        for (NodeIterator it = root.getNodes(); it.hasNext(); ) {
            Node node = it.nextNode();
            System.out.println(node.getPath() + " : " + node.getUUID());
        }
        
        try {
            root.removeMixin(MIXIN);
            root.save();
        } catch (RepositoryException ex) {
            ex.printStackTrace();
        }
    }
}

Output:

/root/bar : 0b09e0b4-0727-4194-978a-4eadfbf93fa8
/root/bar[2] : 84d5e556-6f12-43fb-98e3-614bcf1f7bb7
/root/bar[3] : 8db95029-df3b-4e26-affb-438de0206cf5

javax.jcr.ItemNotFoundException: 8db95029-df3b-4e26-affb-438de0206cf5
at org.apache.jackrabbit.core.ItemManager.createItemInstance(ItemManager.java:463)
	at org.apache.jackrabbit.core.ItemManager.getItem(ItemManager.java:319)
	at org.apache.jackrabbit.core.NodeImpl.removeMixin(NodeImpl.java:1212)
	at org.apache.jackrabbit.core.NodeImpl.removeMixin(NodeImpl.java:2624)
	at com.ms.appmw.rcf.server.RemoveMixinTest.testRemoveMixin(RemoveMixinTest.java:48)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at junit.framework.TestCase.runTest(TestCase.java:154)
	at msjava.base.testutils.junit3.MSTestCase.runTest(MSTestCase.java:203)
	at msjava.base.testutils.junit3.TestCaseTearDownEvenIfSetUpFails.runBare(TestCaseTearDownEvenIfSetUpFails.java:92)
	at msjava.base.testutils.junit3.MSTestCase.runBare(MSTestCase.java:170)
	at junit.framework.TestResult$1.protect(TestResult.java:106)

The missing UUID for the last node is the one not found because upon removal of the second
the index [2] is still valid. Thanks!

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Mime
View raw message