You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jackrabbit.apache.org by Przemyslaw Pakulski <pp...@o2.pl> on 2006/01/12 11:00:28 UTC

Restoring node with referenced child problem

Hi,

I found a unexpected exception during restoring node, which has child 
referenced. I tested following scenario :

1. Create root node,
2. Add 1st child node (CHILD_0) below root node,
3. Add 2nd child node (CHILD_1) below root node,
4. Create reference property on 2nd node (CHILD_1) to 1st node (CHILD_0),
5. Create new version of root node (checkout -> set some property -> 
checkin),
6. Try to restore root node to previous version.

When I try to restore root node exception occurs:
javax.jcr.ItemNotFoundException: 
f201e30f-42f2-46b6-bdab-8aa472777c92/{http://www.jcp.org/jcr/1.0}primaryType

> 10:53:22,031 INFO  com.oyster.mom.contentserver.prototyping.it5.TestRestoreNodeWithChildReferenced.main(TestRestoreNodeWithChildReferenced.java:63) - Initial version : 1.0
> 10:53:22,140 INFO  com.oyster.mom.contentserver.prototyping.it5.TestRestoreNodeWithChildReferenced.main(TestRestoreNodeWithChildReferenced.java:70) - Next version : 1.1
> javax.jcr.ItemNotFoundException: 59842503-3277-421f-896c-86c508ad8e76/{http://www.jcp.org/jcr/1.0}isCheckedOut
> 	at org.apache.jackrabbit.core.ItemManager.createItemInstance(ItemManager.java:467)
> 	at org.apache.jackrabbit.core.ItemManager.getItem(ItemManager.java:319)
> 	at org.apache.jackrabbit.core.ItemImpl.restoreTransientItems(ItemImpl.java:691)
> 	at org.apache.jackrabbit.core.ItemImpl.save(ItemImpl.java:1192)
> 	at org.apache.jackrabbit.core.SessionImpl.save(SessionImpl.java:758)
> 	at org.apache.jackrabbit.core.NodeImpl.internalRestore(NodeImpl.java:3502)
> 	at org.apache.jackrabbit.core.NodeImpl.restore(NodeImpl.java:2848)
> 	at com.oyster.mom.contentserver.prototyping.it5.TestRestoreNodeWithChildReferenced.main(TestRestoreNodeWithChildReferenced.java:74)
> 10:53:22,281 INFO  com.oyster.mom.contentserver.prototyping.it5.TestRestoreNodeWithChildReferenced.main(TestRestoreNodeWithChildReferenced.java:84) - Done.

Find attached source test.

Regards
Przemo Pakulski
www.cognifide.com


Re: Restoring node with referenced child problem

Posted by Dominique Pfister <do...@day.com>.
Hi Przemo,

The check for referential integrity was actually too strict and did
not take into account nodes that were added again with same UUID as
the deleted ones when looking for dangling node references. Thank you
again for reporting this bug! It should be fixed with revision 368779.

Cheers
Dominique


On 1/13/06, Dominique Pfister <do...@day.com> wrote:
> Hi Przemo,
>
> there were actually two errors, one (ReferentialIntegrityException)
> and a follow-up error (ItemNotFoundException) when trying to restore
> the state before the "versioning restore" operation was invoked. I
> checked in some changes that should fix the latter and I'll take a
> closer look at why the former happens.
>
> Thank you for reporting
> Dominique

Re: Restoring node with referenced child problem

Posted by Dominique Pfister <do...@day.com>.
Hi Przemo,

there were actually two errors, one (ReferentialIntegrityException)
and a follow-up error (ItemNotFoundException) when trying to restore
the state before the "versioning restore" operation was invoked. I
checked in some changes that should fix the latter and I'll take a
closer look at why the former happens.

Thank you for reporting
Dominique

On 1/12/06, Przemyslaw Pakulski <pp...@o2.pl> wrote:
> Hi,
>
> I found a unexpected exception during restoring node, which has child
> referenced. I tested following scenario :
>
> 1. Create root node,
> 2. Add 1st child node (CHILD_0) below root node,
> 3. Add 2nd child node (CHILD_1) below root node,
> 4. Create reference property on 2nd node (CHILD_1) to 1st node (CHILD_0),
> 5. Create new version of root node (checkout -> set some property ->
> checkin),
> 6. Try to restore root node to previous version.
>
> When I try to restore root node exception occurs:
> javax.jcr.ItemNotFoundException:
> f201e30f-42f2-46b6-bdab-8aa472777c92/{http://www.jcp.org/jcr/1.0}primaryType
>
> > 10:53:22,031 INFO  com.oyster.mom.contentserver.prototyping.it5.TestRestoreNodeWithChildReferenced.main(TestRestoreNodeWithChildReferenced.java:63) - Initial version : 1.0
> > 10:53:22,140 INFO  com.oyster.mom.contentserver.prototyping.it5.TestRestoreNodeWithChildReferenced.main(TestRestoreNodeWithChildReferenced.java:70) - Next version : 1.1
> > javax.jcr.ItemNotFoundException: 59842503-3277-421f-896c-86c508ad8e76/{http://www.jcp.org/jcr/1.0}isCheckedOut
> >       at org.apache.jackrabbit.core.ItemManager.createItemInstance(ItemManager.java:467)
> >       at org.apache.jackrabbit.core.ItemManager.getItem(ItemManager.java:319)
> >       at org.apache.jackrabbit.core.ItemImpl.restoreTransientItems(ItemImpl.java:691)
> >       at org.apache.jackrabbit.core.ItemImpl.save(ItemImpl.java:1192)
> >       at org.apache.jackrabbit.core.SessionImpl.save(SessionImpl.java:758)
> >       at org.apache.jackrabbit.core.NodeImpl.internalRestore(NodeImpl.java:3502)
> >       at org.apache.jackrabbit.core.NodeImpl.restore(NodeImpl.java:2848)
> >       at com.oyster.mom.contentserver.prototyping.it5.TestRestoreNodeWithChildReferenced.main(TestRestoreNodeWithChildReferenced.java:74)
> > 10:53:22,281 INFO  com.oyster.mom.contentserver.prototyping.it5.TestRestoreNodeWithChildReferenced.main(TestRestoreNodeWithChildReferenced.java:84) - Done.
>
> Find attached source test.
>
> Regards
> Przemo Pakulski
> www.cognifide.com
>
>
>
> /*
>  * Created by Cognifide on 2006-12-11
>  */
> package com.oyster.mom.contentserver.prototyping.it5;
>
> import javax.jcr.Node;
> import javax.jcr.Repository;
> import javax.jcr.RepositoryException;
> import javax.jcr.Session;
> import javax.jcr.SimpleCredentials;
> import javax.jcr.version.Version;
>
> import org.apache.jackrabbit.core.RepositoryImpl;
> import org.apache.jackrabbit.core.config.RepositoryConfig;
>
> /**
>  * @author przemyslaw_pakulski
>  */
> public class TestRestoreNodeWithChildReferenced {
>
>     private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory
>             .getLog(TestRestoreNodeWithChildReferenced.class);
>
>     public static String REPOSITORY_HOME = "D:/repo/jndi/";
>
>     public static String REPOSITORY_CONFIG = REPOSITORY_HOME + "repository.xml";
>
>     public static String CHILD_NAME = "child";
>
>     public static void main(String[] args) throws RepositoryException {
>         System.setProperty("java.security.auth.login.config", "jaas_jcr.config");
>
>         RepositoryConfig config = RepositoryConfig.create(REPOSITORY_CONFIG, REPOSITORY_HOME);
>         Repository repository = RepositoryImpl.create(config);
>
>         Session session = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
>
>         /*
>          * build some simple hierarchy as presented below:
>          *
>          * child1 references child0
>          *
>          * node +--child0 <--|
>          *      +--child1 ---|
>          */
>         Node root = session.getRootNode();
>
>         Node node = root.addNode("node");
>         node.addMixin("mix:versionable");
>
>         Node child0 = node.addNode(CHILD_NAME);
>         child0.addMixin("mix:versionable");
>
>         Node child1 = node.addNode(CHILD_NAME);
>         child1.addMixin("mix:versionable");
>         child1.setProperty("reference", child0);
>
>         root.save();
>         child0.checkin();
>         child1.checkin();
>         node.checkin();
>
>         Version version = node.getBaseVersion();
>         log.info("Initial version : " + version.getName());
>
>         // prepare next version
>         node.checkout();
>         node.setProperty("test", true);
>         node.save();
>         node.checkin();
>         log.info("Next version : " + node.getBaseVersion().getName());
>
>         try {
>             // try to restore node to initial version
>             node.restore(version, false);
>         }
>         catch (RepositoryException e) {
>             e.printStackTrace();
>         }
>
>         session.logout();
>
>         ((RepositoryImpl) repository).shutdown();
>
>         log.info("Done.");
>     }
> }
>
>
>