/* * 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.core; import org.exoplatform.services.jcr.JcrImplBaseTest; import org.exoplatform.services.jcr.access.AccessControlList; import org.exoplatform.services.jcr.dataflow.ItemState; import org.exoplatform.services.jcr.dataflow.PlainChangesLog; import org.exoplatform.services.jcr.datamodel.InternalQName; import org.exoplatform.services.jcr.datamodel.QPath; import org.exoplatform.services.jcr.impl.Constants; import org.exoplatform.services.jcr.impl.dataflow.TransientNodeData; import org.exoplatform.services.jcr.impl.dataflow.TransientPropertyData; import org.exoplatform.services.jcr.impl.dataflow.session.SessionChangesLog; import java.util.Collection; import java.util.List; import javax.jcr.PropertyType; import javax.jcr.RepositoryException; /** * Created by The eXo Platform SAS. * * @author <a href="mailto:geaz@users.sourceforge.net">Gennady Azarenkov</a> * @version $Id: TestItemDataChangesLog.java 11907 2008-03-13 15:36:21Z ksm $ */ public class TestItemDataChangesLog extends JcrImplBaseTest { private TransientNodeData data1; private TransientNodeData data2; private TransientPropertyData data3; public void setUp() throws Exception { super.setUp(); QPath path1 = QPath.makeChildPath(Constants.ROOT_PATH, new InternalQName(null, "testBasicOperations1")); QPath path2 = QPath.makeChildPath(Constants.ROOT_PATH, new InternalQName(null, "testBasicOperations2")); QPath path3 = QPath.makeChildPath(Constants.ROOT_PATH, new InternalQName(null, "testBasicOperations3")); data1 = new TransientNodeData(path1, "1", 0, new InternalQName(Constants.NS_NT_URI, "unstructured"), new InternalQName[0], 0, Constants.ROOT_UUID, new AccessControlList()); data2 = new TransientNodeData(path2, "2", 0, new InternalQName(Constants.NS_NT_URI, "unstructured"), new InternalQName[0], 0, Constants.ROOT_UUID, new AccessControlList()); data3 = new TransientPropertyData(path3, "3", 0, PropertyType.STRING, Constants.ROOT_UUID, false); } public void testBasicOperations() throws Exception { SessionChangesLog cLog = new SessionChangesLog(new DummySession("s1")); cLog.add(ItemState.createAddedState(data1)); cLog.add(ItemState.createAddedState(data2)); cLog.add(ItemState.createDeletedState(data2)); cLog.add(ItemState.createAddedState(data3)); cLog.add(ItemState.createUpdatedState(data3)); assertEquals(5, cLog.getSize()); assertTrue(cLog.getItemState(data1.getQPath()).isAdded()); assertTrue(cLog.getItemState(data2.getQPath()).isDeleted()); assertTrue(cLog.getItemState("1").isAdded()); assertTrue(cLog.getItemState("2").isDeleted()); List<ItemState> states = cLog.getItemStates("3"); assertEquals(2, states.size()); assertTrue(states.get(0).isAdded()); assertTrue(states.get(1).isUpdated()); } public void testSessionOperations() throws Exception { SessionChangesLog cLog = new SessionChangesLog(new DummySession("s1")); TransientNodeData d1 = TransientNodeData.createNodeData(data1, new InternalQName(null, "testSessionOperations"), new InternalQName( Constants.NS_NT_URI, "unstructured"), "d1"); // test remove cLog.add(ItemState.createAddedState(data1)); cLog.add(ItemState.createAddedState(d1)); assertEquals(2, cLog.getSize()); cLog.remove(data1.getQPath()); assertEquals(0, cLog.getSize()); // test getChanges cLog.add(ItemState.createAddedState(data1)); cLog.add(ItemState.createAddedState(data2)); cLog.add(ItemState.createAddedState(d1)); assertEquals(2, cLog.getDescendantsChanges(data1.getQPath()).size()); assertEquals(1, cLog.getDescendantsChanges(data2.getQPath()).size()); // test pushLog PlainChangesLog newLog = cLog.pushLog(data1.getQPath()); assertEquals(2, newLog.getSize()); assertEquals(1, cLog.getSize()); cLog.remove(data2.getQPath()); // test getLastStates cLog.add(ItemState.createAddedState(data1)); cLog.add(ItemState.createAddedState(data2)); cLog.add(ItemState.createAddedState(d1)); Collection<ItemState> nodeStates = cLog.getLastChildrenStates(data1, true); assertEquals(1, nodeStates.size()); ItemState s = nodeStates.iterator().next(); assertTrue(d1.getQPath().equals(s.getData().getQPath())); assertTrue(s.isAdded()); cLog.add(ItemState.createDeletedState(d1)); nodeStates = cLog.getLastChildrenStates(data1, true); s = nodeStates.iterator().next(); assertEquals(1, nodeStates.size()); // System.out.println("log ----- "+); assertTrue(s.isDeleted()); } public void testMixinsAddTransient() throws Exception { String[] mixins = new String[]{"mix:referenceable", "mix:lockable"}; String[] finalMixins = new String[]{"mix:lockable"}; NodeImpl testNode = (NodeImpl)session.getRootNode().addNode("mixin_transient_test"); NodeImpl node1 = (NodeImpl)testNode.addNode("node-1"); 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); } testNode.save(); node1.removeMixin(mixins[0]); testNode.save(); checkMixins(finalMixins, node1); // tear down - testNode will be deleted in tearDown() } }