You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2009/02/11 15:19:25 UTC

svn commit: r743343 - in /jackrabbit/branches/1.5: ./ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/XAItemStateManager.java jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java

Author: jukka
Date: Wed Feb 11 14:19:24 2009
New Revision: 743343

URL: http://svn.apache.org/viewvc?rev=743343&view=rev
Log:
1.5: Merged revision 741652 (JCR-1554). Ignored other revisions.

Modified:
    jackrabbit/branches/1.5/   (props changed)
    jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/XAItemStateManager.java
    jackrabbit/branches/1.5/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java

Propchange: jackrabbit/branches/1.5/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Feb 11 14:19:24 2009
@@ -1,2 +1,2 @@
 /jackrabbit/branches/1.3:631261
-/jackrabbit/trunk:703899-704158,704165,704167,704324,704358,704361,704864,704933,704939,705010,705033,705243,705496,705522,705579,705925,705932,705934,705937-705938,705961,706242,706273,706285-706286,706562,706606,706649,706655,706660,706697,706918,707303-707304,707307,707310,707630,708206,708598,708609,708613,708619,708634,708840,708863,708909,708929,708943,709115,709142,709207,709211,710047,711238,711566-711567,711595,711841-711843,712984-712985,713037,713059,713065,713072,713076,713162,713214,713956,713958,713964,713971,713975,714034,718218,718249-718250,718371,718376,718566,718632,718981,719225,719282,719575-719577,719579,719585-719586,719588,719592,720455,720484,720492,720524,720533,720540,720673,720679,720687,720784,720940,720969,721186,721191,721194,721235,721387-721389,721470,721495,722068-722069,722463,722465,722467,722470,722825,723281,723346,723728,723784,724300,724387,725292,727376,727388,727390,727395,727397,727402,727492,727701,728022,731896,731934,731941,73234
 7,732678,732686,732689,732693,732703,732715-732716,732719,732728,732730,732734-732738,732740,732742-732743,732745,732867,732883,733057-733059,733061,733080,734092,734366,734375,734400,734709,735401,736021,736030,736274,736276,736650-736651,736653-736656,736658,736680,737695,738087,740262,740736-740738,740747,740749-740750,741052,741100,741121,741206,741208-741210,741213,741509,741524
+/jackrabbit/trunk:703899-704158,704165,704167,704324,704358,704361,704864,704933,704939,705010,705033,705243,705496,705522,705579,705925,705932,705934,705937-705938,705961,706242,706273,706285-706286,706562,706606,706649,706655,706660,706697,706918,707303-707304,707307,707310,707630,708206,708598,708609,708613,708619,708634,708840,708863,708909,708929,708943,709115,709142,709207,709211,710047,711238,711566-711567,711595,711841-711843,712984-712985,713037,713059,713065,713072,713076,713162,713214,713956,713958,713964,713971,713975,714034,718218,718249-718250,718371,718376,718566,718632,718981,719225,719282,719575-719577,719579,719585-719586,719588,719592,720455,720484,720492,720524,720533,720540,720673,720679,720687,720784,720940,720969,721186,721191,721194,721235,721387-721389,721470,721495,722068-722069,722463,722465,722467,722470,722825,723281,723346,723728,723784,724300,724387,725292,727376,727388,727390,727395,727397,727402,727492,727701,728022,731896,731934,731941,73234
 7,732678,732686,732689,732693,732703,732715-732716,732719,732728,732730,732734-732738,732740,732742-732743,732745,732867,732883,733057-733059,733061,733080,734092,734366,734375,734400,734709,735401,736021,736030,736274,736276,736650-736651,736653-736656,736658,736680,737695,738087,738119,738121,738419,738422,738474,738512,739210,739212,739226,740262,740734,740736-740738,740747,740749-740750,741052,741100,741121,741206,741208-741210,741213,741509,741524,741652

Modified: jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/XAItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/XAItemStateManager.java?rev=743343&r1=743342&r2=743343&view=diff
==============================================================================
--- jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/XAItemStateManager.java (original)
+++ jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/XAItemStateManager.java Wed Feb 11 14:19:24 2009
@@ -27,6 +27,8 @@
 import org.apache.jackrabbit.uuid.UUID;
 import org.apache.commons.collections.iterators.FilterIterator;
 import org.apache.commons.collections.Predicate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import javax.jcr.ReferentialIntegrityException;
 import javax.jcr.PropertyType;
@@ -46,6 +48,11 @@
 public class XAItemStateManager extends LocalItemStateManager implements InternalXAResource {
 
     /**
+     * The logger instance.
+     */
+    private static Logger log = LoggerFactory.getLogger(XAItemStateManager.class);
+
+    /**
      * Default change log attribute name.
      */
     private static final String DEFAULT_ATTRIBUTE_NAME = "ChangeLog";
@@ -561,4 +568,30 @@
             references.modified(refs);
         }
     }
+
+    /**
+     * {@inheritDoc}
+     *
+     * Check whether the shared state modified is contained in our transactional
+     * log: in that case, update its state as well, as it might get reused
+     * in a subsequent transaction (see JCR-1554).
+     */
+    public void stateModified(ItemState modified) {
+        ChangeLog changeLog = (ChangeLog) commitLogs.get(Thread.currentThread());
+        if (changeLog != null) {
+            ItemState local;
+            if (modified.getContainer() != this) {
+                // shared state was modified
+                try {
+                    local = changeLog.get(modified.getId());
+                    if (local != null && local.isConnected()) {
+                        local.pull();
+                    }
+                } catch (NoSuchItemStateException e) {
+                    log.warn("Modified state marked for deletion: " + modified.getId());
+                }
+            }
+        }
+        super.stateModified(modified);
+    }
 }

Modified: jackrabbit/branches/1.5/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.5/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java?rev=743343&r1=743342&r2=743343&view=diff
==============================================================================
--- jackrabbit/branches/1.5/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java (original)
+++ jackrabbit/branches/1.5/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java Wed Feb 11 14:19:24 2009
@@ -1332,7 +1332,7 @@
         // assert: version label known in other session
         nOther.getVersionHistory().getVersionByLabel(versionLabel);
     }
-    
+
     /**
      * Tests two different Threads for prepare and commit in a Transaction
      */
@@ -1365,4 +1365,104 @@
             fail("Committed node not visible in this session");
         }
     }
+
+    /**
+     * Test setting the same property multiple times. Exposes an issue where
+     * the same property instance got reused in subsequent transactions
+     * (see JCR-1554).
+     *
+     * @throws Exception if an error occurs
+     */
+    public void testSetProperty() throws Exception {
+        final String testNodePath = testPath + "/" + Math.random();
+
+        Session session = helper.getSuperuserSession();
+
+        // Add node
+        doTransactional(new Operation() {
+            public void invoke(Session session) throws Exception {
+                session.getRootNode().addNode(testNodePath);
+                session.save();
+            }
+        }, session);
+
+        for (int i = 1; i <= 3; i++) {
+            // Set property "name" to value "value"
+            doTransactional(new Operation() {
+                public void invoke(Session session) throws Exception {
+                    Node n = (Node) session.getItem("/" + testNodePath);
+                    n.setProperty("name", "value");
+                    session.save();
+                }
+            }, session);
+        }
+    }
+
+    /**
+     * Test deleting a subnode after creation. Exposes an issue where
+     * the same node instance got reused in subsequent transactions
+     * (see JCR-1554).
+     *
+     * @throws Exception if an error occurs
+     */
+    public void testDeleteNode() throws Exception {
+        final String testNodePath = testPath + "/" + Math.random();
+
+        Session session = helper.getSuperuserSession();
+
+        for (int i = 1; i <= 3; i++) {
+            // Add parent node
+            doTransactional(new Operation() {
+                public void invoke(Session session) throws Exception {
+                    session.getRootNode().addNode(testNodePath);
+                    session.save();
+                }
+            }, session);
+
+            // Add child node
+            doTransactional(new Operation() {
+                public void invoke(Session session) throws Exception {
+                    session.getRootNode().addNode(testNodePath + "/subnode");
+                    session.save();
+                }
+            }, session);
+
+            // Remove parent node
+            doTransactional(new Operation() {
+                public void invoke(Session session) throws Exception {
+                    session.getRootNode().getNode(testNodePath).remove();
+                    session.save();
+                }
+            }, session);
+        }
+    }
+
+    /**
+     * Operation to invoke on a session scope.
+     */
+    interface Operation {
+
+        /**
+         * Invoke the operation.
+         * @param session session to use inside operation
+         * @throws Exception if an error occurs
+         */
+        void invoke(Session session) throws Exception;
+    }
+
+    /**
+     * Wrap a session-scoped operation with a transaction.
+     *
+     * @param op operation to invoke
+     * @param session session to use for the transaction
+     * @throws Exception if an error occurs
+     */
+    private void doTransactional(Operation op, Session session) throws Exception {
+        UserTransaction utx = new UserTransactionImpl(session);
+        utx.begin();
+
+        op.invoke(session);
+
+        utx.commit();
+    }
 }