/*
* 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.impl.dataflow.persistent;
import org.exoplatform.services.jcr.JcrImplBaseTest;
import org.exoplatform.services.jcr.impl.core.NodeImpl;
import org.exoplatform.services.jcr.impl.core.PropertyImpl;
import org.exoplatform.services.jcr.impl.core.SessionImpl;
import javax.jcr.RepositoryException;
import javax.jcr.UnsupportedRepositoryOperationException;
/**
* Created by The eXo Platform SAS
*
* 09.01.2007
*
* We testing a workspace cache with mixin types. A cache work in shadow, but we try to do usecases
* of possible wrong cache work.
*
* @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter Nedonosko</a>
* @version $Id: TestCachedMixins.java 34801 2009-07-31 15:44:50Z dkatayev $
*/
public class TestCachedMixins extends JcrImplBaseTest
{
public final String TEST_NODE_NAME = "cache_test";
protected NodeImpl testNode;
@Override
public void setUp() throws Exception
{
super.setUp();
this.testNode = (NodeImpl)session.getRootNode().addNode(TEST_NODE_NAME);
this.session.save();
}
@Override
protected void tearDown() throws Exception
{
this.testNode.remove();
this.session.save();
super.tearDown();
}
public void testMixinAdd() throws Exception
{
this.testNode.addMixin("mix:referenceable");
this.session.save();
String uuid = null;
testNode = (NodeImpl)session.getRootNode().getNode(TEST_NODE_NAME);
try
{
uuid = testNode.getUUID();
}
catch (UnsupportedRepositoryOperationException e)
{
fail("Node isn't a referenceable, but must");
}
try
{
uuid = ((NodeImpl)session.getItem("/" + TEST_NODE_NAME)).getUUID();
}
catch (UnsupportedRepositoryOperationException e)
{
fail("Node isn't a referenceable, but must. Access from Session.geItem()");
}
SessionImpl anotherSession = (SessionImpl)repository.login(this.credentials);
NodeImpl anotherRoot = (NodeImpl)anotherSession.getRootNode();
try
{
NodeImpl aNode = (NodeImpl)anotherRoot.getNode(TEST_NODE_NAME);
assertEquals("UUIDs must equals", uuid, aNode.getUUID());
}
catch (UnsupportedRepositoryOperationException e)
{
fail("Node isn't a referenceable, but must");
}
try
{
NodeImpl aNode = (NodeImpl)anotherSession.getItem("/" + TEST_NODE_NAME);
assertEquals("UUIDs must equals. Access from Session.geItem()", uuid, aNode.getUUID());
}
catch (UnsupportedRepositoryOperationException e)
{
fail("Node isn't a referenceable, but must. Access from Session.geItem()");
}
}
public void testMixinAddRemove() throws Exception
{
this.testNode.addMixin("mix:referenceable");
this.session.save();
this.testNode.removeMixin("mix:referenceable");
this.session.save();
testNode = (NodeImpl)session.getRootNode().getNode(TEST_NODE_NAME);
try
{
testNode.getUUID();
fail("Node must be not referenceable, but it such.");
}
catch (UnsupportedRepositoryOperationException e)
{
// ok
}
try
{
((NodeImpl)session.getItem("/" + TEST_NODE_NAME)).getUUID();
fail("Node must be not referenceable, but it such. Access from Session.geItem().");
}
catch (UnsupportedRepositoryOperationException e)
{
// ok
}
SessionImpl anotherSession = (SessionImpl)repository.login(this.credentials /*
* session.getCredentials
* ()
*/);
NodeImpl anotherRoot = (NodeImpl)anotherSession.getRootNode();
NodeImpl aNode = (NodeImpl)anotherRoot.getNode(TEST_NODE_NAME);
try
{
aNode.getUUID();
fail("Node must be not referenceable, but it such.");
}
catch (UnsupportedRepositoryOperationException e)
{
// ok
}
aNode = (NodeImpl)anotherSession.getItem("/" + TEST_NODE_NAME);
try
{
aNode.getUUID();
fail("Node must be not referenceable, but it such. Access from Session.geItem().");
}
catch (UnsupportedRepositoryOperationException e)
{
// ok
}
}
public void testFewMixinAdd() throws Exception
{
String[] mixins = new String[]{"mix:referenceable", "mix:lockable"};
this.testNode.addMixin(mixins[0]);
this.session.save();
this.testNode.addMixin(mixins[1]);
this.session.save();
this.testNode.lock(true, false);
checkMixins(mixins, (NodeImpl)session.getRootNode().getNode(TEST_NODE_NAME));
checkMixins(mixins, (NodeImpl)session.getItem("/" + TEST_NODE_NAME));
SessionImpl anotherSession = (SessionImpl)repository.login(this.credentials /*
* session.getCredentials
* ()
*/);
checkMixins(mixins, (NodeImpl)anotherSession.getRootNode().getNode(TEST_NODE_NAME));
checkMixins(mixins, (NodeImpl)anotherSession.getItem("/" + TEST_NODE_NAME));
}
public void testFewMixinAdd_ObjectInHand() throws Exception
{
String[] mixins = new String[]{"mix:referenceable", "mix:lockable"};
NodeImpl node1 = (NodeImpl)this.testNode.addNode("node-1");
this.session.save();
node1.addMixin(mixins[0]);
node1.addMixin(mixins[1]);
this.testNode.save();
node1.lock(true, false);
checkMixins(mixins, node1);
}
public void testFewMixinAddRemove() throws Exception
{
String[] mixins = new String[]{"mix:referenceable", "mix:lockable"};
String[] finalMixins = new String[]{"mix:lockable"};
this.testNode.addMixin(mixins[0]);
this.session.save();
this.testNode.addMixin(mixins[1]);
this.session.save();
this.testNode.lock(true, false);
this.testNode.removeMixin(mixins[0]);
this.session.save();
checkMixins(finalMixins, (NodeImpl)session.getRootNode().getNode(TEST_NODE_NAME));
checkMixins(finalMixins, (NodeImpl)session.getItem("/" + TEST_NODE_NAME));
SessionImpl anotherSession = (SessionImpl)repository.login(this.credentials /*
* session.getCredentials
* ()
*/);
checkMixins(finalMixins, (NodeImpl)anotherSession.getRootNode().getNode(TEST_NODE_NAME));
checkMixins(finalMixins, (NodeImpl)anotherSession.getItem("/" + TEST_NODE_NAME));
}
public void testFewMixinAddRemove_ObjectInHand() throws Exception
{
String[] mixins = new String[]{"mix:referenceable", "mix:lockable"};
String[] finalMixins = new String[]{"mix:lockable"};
NodeImpl node1 = (NodeImpl)this.testNode.addNode("node-1");
this.session.save();
node1.addMixin(mixins[0]);
node1.addMixin(mixins[1]);
this.testNode.save();
node1.lock(true, false);
node1.removeMixin(mixins[0]);
this.testNode.save();
checkMixins(finalMixins, node1);
}
public void testMixinAddTransient() throws Exception
{
String[] mixins = new String[]{"mix:referenceable", "mix:lockable"};
String[] finalMixins = new String[]{"mix:lockable"};
NodeImpl node1 = (NodeImpl)this.testNode.addNode("node-1");
this.session.save();
node1.addMixin(mixins[0]);
node1.addMixin(mixins[1]);
PropertyImpl uuid = (PropertyImpl)node1.getProperty("jcr:uuid");
try
{
NodeImpl sameNode1 = (NodeImpl)session.getNodeByUUID(uuid.getString());
checkMixins(mixins, sameNode1);
assertEquals("Nodes must be same", node1, sameNode1);
}
catch (RepositoryException e)
{
fail("Transient node must be accessible by uuid. " + e);
}
try
{
NodeImpl sameNode1 = (NodeImpl)session.getItem(node1.getPath());
checkMixins(mixins, sameNode1);
assertEquals("Nodes must be same", node1, sameNode1);
}
catch (RepositoryException e)
{
fail("Transient node must be accessible by path. " + e);
}
this.testNode.save();
node1.removeMixin(mixins[0]);
this.testNode.save();
checkMixins(finalMixins, node1);
}
}