/*
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.services.jcr.api.version;
import javax.jcr.Node;
/**
* Created by The eXo Platform SAS
*
* 18.01.2007
*
* @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter Nedonosko</a>
* @version $Id: TestVersionLocks.java 11907 2008-03-13 15:36:21Z ksm $
*/
public class TestVersionLocks extends BaseVersionTest
{
protected final String TEST_ROOT = "lockable_version_test";
protected final int MAX = 10;
protected Node testBase = null;
public void setUp() throws Exception
{
super.setUp();
testBase = root.addNode(TEST_ROOT);
root.save();
}
@Override
protected void tearDown() throws Exception
{
try
{
testBase.remove();
root.save();
}
catch (Throwable e)
{
log.error("TEAR DOWN ERROR. " + getName() + ". " + e.getMessage(), e);
}
super.tearDown();
}
/**
* ISSUE: instable behavior in lock/unlock and checkout/checkin weaving
* http://jira.exoplatform.org/browse/JCR-129
*
* ========================================================
*
* if "node" is "mix:versionable" and "mix:lockable", then the following code fails for MAX > 2
* (but works for one or two iterations !): for (int i = 0; i < MAX; i++) { node.lock(false,
* true); node.checkout(); // editing & saving here doesn't change the issue ! node.checkin();
* node.unlock(); } an exception is thrown by "unlock": javax.jcr.InvalidItemStateException:
* (update) Item []:1[]node:1[http://www.jcp.org/jcr/1.0]lockOwner:1 not found. Probably was
* deleted by another session on the other hand, the following code works for every MAX I tried !
* for (int i = 0; i < MAX; i++) { node.lock(false, true); node.checkout(); node.unlock();
* node.checkin(); }
*/
public void testCheckinLocked() throws Exception
{
Node lockable = testBase.addNode("lockable");
testBase.save();
lockable.addMixin("mix:lockable");
lockable.addMixin("mix:versionable");
testBase.save();
for (int i = 0; i < MAX; i++)
{
lockable.lock(false, true);
lockable.checkout();
// editing & saving here doesn't change the issue !
lockable.addNode("any node " + i).setProperty("any property", 123d);
if (i >= 2)
{
lockable.getNode("any node " + (i - 2)).remove();
}
lockable.save();
lockable.checkin();
lockable.unlock();
}
}
public void testCheckinUnlocked() throws Exception
{
Node lockable = testBase.addNode("lockable");
testBase.save();
lockable.addMixin("mix:lockable");
lockable.addMixin("mix:versionable");
testBase.save();
for (int i = 0; i < MAX; i++)
{
lockable.lock(false, true);
lockable.checkout();
// editing & saving here doesn't change the issue !
lockable.addNode("any node " + i).setProperty("any property", 123d);
if (i >= 2)
{
lockable.getNode("any node " + (i - 2)).remove();
}
lockable.save();
lockable.unlock();
lockable.checkin();
}
}
}