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.