You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jackrabbit.apache.org by "alban seurat (JIRA)" <ji...@apache.org> on 2010/05/11 11:21:48 UTC

[jira] Updated: (JCR-2626) Merge with transaction prevent to have modified and deleted reference between 2 nodes

     [ https://issues.apache.org/jira/browse/JCR-2626?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

alban seurat updated JCR-2626:
------------------------------

    Attachment: merge.patch

A tempory proposed patch which doesn't delete modifiedState when we merge deletedStates of ChangeLog.



> Merge with transaction prevent to have modified and deleted reference between 2 nodes
> -------------------------------------------------------------------------------------
>
>                 Key: JCR-2626
>                 URL: https://issues.apache.org/jira/browse/JCR-2626
>             Project: Jackrabbit Content Repository
>          Issue Type: Bug
>          Components: jackrabbit-core
>    Affects Versions: 1.6.1
>         Environment: Windows XP 
>            Reporter: alban seurat
>            Priority: Critical
>         Attachments: merge.patch
>
>
> I've created a test case to reproduce the issue. 
> In short, I have 2 artifacts where one has a reference on the second one. I want to copy/delete the second one and update the reference, save my operation and do a copy/delete of the first artefact afterward. 
> Here is the test case 
> package com.testjcr;
> import java.io.IOException;
> import java.rmi.NotBoundException;
> import java.rmi.RemoteException;
> import java.rmi.registry.LocateRegistry;
> import java.rmi.registry.Registry;
> import javax.jcr.ItemExistsException;
> import javax.jcr.LoginException;
> import javax.jcr.Node;
> import javax.jcr.NodeIterator;
> import javax.jcr.Property;
> import javax.jcr.PropertyIterator;
> import javax.jcr.Repository;
> import javax.jcr.RepositoryException;
> import javax.jcr.Session;
> import javax.jcr.SimpleCredentials;
> import javax.transaction.xa.XAException;
> import javax.transaction.xa.XAResource;
> import javax.transaction.xa.Xid;
> import org.apache.jackrabbit.api.XASession;
> import org.apache.jackrabbit.core.TransientRepository;
> import org.apache.jackrabbit.rmi.remote.RemoteRepository;
> import org.apache.jackrabbit.rmi.server.RemoteAdapterFactory;
> import org.apache.jackrabbit.rmi.server.ServerAdapterFactory;
> /**
>  * Hello world!
>  *
>  */
> public class App {
>     public static final String userNodeName = "User";
>     public static final String sharedNodeName = "Shared";
>     public static final String node1Name = "Node1";
>     public static final String node2Name = "Node2";
>     public static void main(String[] args) throws IOException, LoginException, RepositoryException, RemoteException, NotBoundException, XAException, Exception {
>         TransientRepository repository = new TransientRepository();
>         RemoteAdapterFactory factory = null;
>         factory = new ServerAdapterFactory();
>         RemoteRepository remote = factory.getRemoteRepository(repository);
>         Registry reg;
>         try {
>             reg = LocateRegistry.createRegistry(2100);
>         } catch (RemoteException ex) {
>             reg = LocateRegistry.getRegistry(2100);
>         }
>         reg.rebind("alban", remote);
>         Session session = repository.login(new SimpleCredentials("", "".toCharArray()));
>         Node rootNode = session.getRootNode();
>         Node userNode = rootNode.addNode(userNodeName);
>         Node sharedNode = rootNode.addNode(sharedNodeName);
>         Node node1 = userNode.addNode(node1Name);
>         node1.addMixin("mix:referenceable");
>         Node node2 = userNode.addNode(node2Name);
>         node2.addMixin("mix:referenceable");
>         node1.setProperty("reference", node2);
>         session.save();
>         session.logout();
>         doOperation(repository);
>     }
>     private static void moveNode(Session xaSession, Node sharedNode, Node node) throws Exception {
>         Node copyNode = sharedNode.addNode(node.getName());
>         copyNode.addMixin("mix:referenceable");
>         PropertyIterator it = node.getReferences();
>         while (it.hasNext()) {
>             it.nextProperty().setValue(copyNode);
>         }
>         
>         node.remove();
>         xaSession.save();
>         //copyNode.checkin();
>     }
>     private static void doOperation(TransientRepository repository) throws Exception {
>         XASession xaSession = (XASession) repository.login(new SimpleCredentials("", "".toCharArray()));
>         Xid xid = new Xid() {
>             public byte[] getBranchQualifier() {
>                 return new byte[0];
>             }
>             public int getFormatId() {
>                 return 0;
>             }
>             public byte[] getGlobalTransactionId() {
>                 return new byte[0];
>             }
>         };
>         XAResource xaResource = xaSession.getXAResource();
>         xaResource.start(xid, XAResource.TMNOFLAGS);
>         ////////////////////////////////////////////////////////////////
>         Node rootNode = xaSession.getRootNode();
>         Node sharedNode = rootNode.getNode(sharedNodeName);
>         Node userNode = rootNode.getNode(userNodeName);
>         moveNode(xaSession, sharedNode, userNode.getNode(node2Name));
>         moveNode(xaSession, sharedNode, userNode.getNode(node1Name));
>         //xaSession.save();
>         
>         ////////////////////////////////////////////////////////////////
>         // Finally commit this transaction to persist the changes made to xaSession.
>         xaResource.end(xid, XAResource.TMSUCCESS);
>         xaResource.prepare(xid);
>         xaResource.commit(xid, false);
>         xaSession.logout();
>     }
> }

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