jackrabbit-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Roman Puchkovskiy <roman.puchkovs...@blandware.com>
Subject Re: Node.restore in transaction
Date Wed, 07 May 2008 09:11:35 GMT

I've reproduced initial problem. Following method is test which fails:

    public void testRemoveVersionInTxThreeTransactions() {
        final String v1 = (String) transactionTemplate.execute(new
TransactionCallback() {
            public Object doInTransaction(TransactionStatus status) {
                return (String) jcrTemplate.execute(new JcrCallback() {
                    public Object doInJcr(Session session) throws
IOException,
                            RepositoryException {
                        Node target =
session.getRootNode().addNode("target3");
                        target.addMixin("mix:versionable");
                        session.save();
                        VersionHistory vh = target.getVersionHistory();
                        Version v1 = target.checkin();
                        return v1.getName();
                    }
                });
            }
        });
        final String v2 = (String) transactionTemplate.execute(new
TransactionCallback() {
            public Object doInTransaction(TransactionStatus status) {
                return jcrTemplate.execute(new JcrCallback() {
                    public Object doInJcr(Session session) throws
IOException,
                            RepositoryException {
                        Node target =
session.getRootNode().getNode("target3");
                        VersionHistory vh = target.getVersionHistory();
                        target.checkout();
                        Version v2 = target.checkin();
                        return v2.getName();
                    }
                });
            }
        });
        transactionTemplate.execute(new TransactionCallback() {
            public Object doInTransaction(TransactionStatus status) {
                jcrTemplate.execute(new JcrCallback() {
                    public Object doInJcr(Session session) throws
IOException,
                            RepositoryException {
                        Node target =
session.getRootNode().getNode("target3");
                        VersionHistory vh = target.getVersionHistory();
                        target.restore(v1, true);
                        vh.removeVersion(v2);
                        return null;
                    }
                });
                return null;
            }
        });
    }

Following exception is thrown:

testRemoveVersionInTxThreeTransactions(RemoveVersionInTxTest)  Time elapsed:
0.07 sec  <<< ERROR!
org.springframework.dao.DataIntegrityViolationException: Referential
integrity violated; nested exception is
javax.jcr.ReferentialIntegrityException: Unable to remove version. At least
once referenced.
	at
org.springmodules.jcr.SessionFactoryUtils.translateException(SessionFactoryUtils.java:221)
	at
org.springmodules.jcr.JcrAccessor.convertJcrAccessException(JcrAccessor.java:58)
	at org.springmodules.jcr.JcrTemplate.execute(JcrTemplate.java:82)
	at org.springmodules.jcr.JcrTemplate.execute(JcrTemplate.java:108)
	at RemoveVersionInTxTest$4.doInTransaction(RemoveVersionInTxTest.java:99)
	at
org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:128)
	at
RemoveVersionInTxTest.testRemoveVersionInTxThreeTransactions(RemoveVersionInTxTest.java:97)
Caused by: javax.jcr.ReferentialIntegrityException: Unable to remove
version. At least once referenced.
	at
org.apache.jackrabbit.core.version.InternalVersionHistoryImpl.removeVersion(InternalVersionHistoryImpl.java:365)
	at
org.apache.jackrabbit.core.version.AbstractVersionManager.removeVersion(AbstractVersionManager.java:475)
	at
org.apache.jackrabbit.core.version.XAVersionManager.removeVersion(XAVersionManager.java:394)
	at
org.apache.jackrabbit.core.version.XAVersionManager.removeVersion(XAVersionManager.java:174)
	at
org.apache.jackrabbit.core.version.VersionHistoryImpl.removeVersion(VersionHistoryImpl.java:222)
	at RemoveVersionInTxTest$4$1.doInJcr(RemoveVersionInTxTest.java:105)
	at org.springmodules.jcr.JcrTemplate.execute(JcrTemplate.java:76)
	... 30 more

In this test, node is created and checked-in in first transaction, then
checked-out and checked-in in second transaction (so second version is
created), then node is restored to version 1 and its last version (version
2) is tried to be removed in third transaction - which fails.
If we put creation of second version, node restore and removal of first
version in one transaction, test does not fail.
-- 
View this message in context: http://www.nabble.com/Node.restore-in-transaction-tp17089810p17100346.html
Sent from the Jackrabbit - Users mailing list archive at Nabble.com.


Mime
View raw message