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
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.