/* * 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.version; import org.exoplatform.services.jcr.JcrImplBaseTest; import org.exoplatform.services.jcr.dataflow.ItemState; import org.exoplatform.services.jcr.datamodel.InternalQName; import org.exoplatform.services.jcr.datamodel.NodeData; import org.exoplatform.services.jcr.datamodel.PropertyData; import org.exoplatform.services.jcr.datamodel.ValueData; import org.exoplatform.services.jcr.impl.Constants; import org.exoplatform.services.jcr.impl.core.NodeImpl; import org.exoplatform.services.jcr.impl.core.SessionDataManagerTestWrapper; import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeManagerImpl; import org.exoplatform.services.jcr.impl.core.version.FrozenNodeInitializer; import org.exoplatform.services.jcr.impl.dataflow.TransientNodeData; import org.exoplatform.services.jcr.impl.dataflow.TransientPropertyData; import org.exoplatform.services.jcr.impl.dataflow.TransientValueData; import org.exoplatform.services.jcr.impl.dataflow.session.SessionChangesLog; import org.exoplatform.services.jcr.util.IdGenerator; import java.util.ArrayList; import java.util.List; import javax.jcr.PropertyType; /** * Created by The eXo Platform SAS 07.12.2006 * * @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter * Nedonosko</a> * @version $Id: BaseVersionImplTest.java 11907 2008-03-13 15:36:21Z ksm $ */ public class BaseVersionImplTest extends JcrImplBaseTest { protected static final int TESTCASE_ONPARENT_COPY = 0; protected static final int TESTCASE_ONPARENT_ABORT = 1; protected static final int TESTCASE_ONPARENT_IGNORE = 2; protected static final int TESTCASE_ONPARENT_VERSION = 3; protected String NS_TEST_IMPL_URI = "http://www.exoplatform.org/jcr/test/1.0"; protected InternalQName NT_TEST_ONPARENT_ABORT = new InternalQName(NS_TEST_IMPL_URI, "onParentAbort"); protected InternalQName PROPERTY_ABORTED = new InternalQName(NS_TEST_IMPL_URI, "abortedProperty"); protected InternalQName NODE_ABOORTED = new InternalQName(NS_TEST_IMPL_URI, "abortedNode"); protected InternalQName NT_TEST_ONPARENT_IGNORE = new InternalQName(NS_TEST_IMPL_URI, "onParentIgnore"); protected InternalQName PROPERTY_IGNORED = new InternalQName(NS_TEST_IMPL_URI, "ignoredProperty"); protected InternalQName NODE_IGNORED = new InternalQName(NS_TEST_IMPL_URI, "ignoredNode"); protected InternalQName NT_TEST_ONPARENT_VERSION = new InternalQName(NS_TEST_IMPL_URI, "onParentVersion"); protected InternalQName PROPERTY_VERSIONED = new InternalQName(NS_TEST_IMPL_URI, "versionedProperty"); protected InternalQName NODE_VERSIONED = new InternalQName(NS_TEST_IMPL_URI, "versionedNode"); protected static String TEST_ROOT = "testRoot"; protected static String TEST_NODE = "versionableNode"; protected static String TEST_FROZEN_ROOT = "frozenRoot"; protected InternalQName[] mixVersionable = new InternalQName[]{Constants.MIX_VERSIONABLE}; protected InternalQName testRootName = new InternalQName(Constants.NS_EXO_URI, TEST_ROOT); protected InternalQName frozenRootName = new InternalQName(Constants.NS_EXO_URI, TEST_FROZEN_ROOT); protected InternalQName nodeName1 = new InternalQName(Constants.NS_EXO_URI, "node 1"); protected InternalQName nodeName2 = new InternalQName(Constants.NS_EXO_URI, "node 2"); protected InternalQName nodeName3 = new InternalQName(Constants.NS_EXO_URI, "node 3"); protected InternalQName nodeName4 = new InternalQName(Constants.NS_EXO_URI, "node 4"); protected InternalQName nodeName5 = new InternalQName(Constants.NS_EXO_URI, "node 5"); protected InternalQName propertyName1 = new InternalQName(Constants.NS_EXO_URI, "property 1"); protected InternalQName propertyName2 = new InternalQName(Constants.NS_EXO_URI, "property 2"); protected InternalQName propertyName3 = new InternalQName(Constants.NS_EXO_URI, "property 3"); protected InternalQName propertyName4 = new InternalQName(Constants.NS_EXO_URI, "property 4"); protected InternalQName propertyName5 = new InternalQName(Constants.NS_EXO_URI, "property 5"); protected InternalQName propertyName6 = new InternalQName(Constants.NS_EXO_URI, "property 6"); protected List<ValueData> stringDataMultivalued; protected List<ValueData> stringDataSinglevalued; protected List<ValueData> longDataSinglevalued; protected List<ValueData> binaryDataSinglevalued; protected List<ValueData> versionedVersionHistoryData; // protected InternalQPath nodePath3 = // InternalQPath.makeChildPath(Constants.ROOT_PATH, new // InternalQName(Constants.NS_EXO_URI,"node 3")); protected String rootUuid; protected String frozenUuid; protected String versionedVersionHistoryUuid; // used // for // OnParentCopy // = // VERSION // test protected String nodeUuid1; protected String nodeUuid2; protected String nodeUuid3; protected String nodeUuid31; protected String nodeUuid32; protected String propertyUuid11; protected String propertyUuid12; protected String propertyUuid21; protected String propertyUuid22; protected String propertyUuid311; protected String propertyUuid312; protected NodeData testRoot; protected NodeData frozenRoot; protected NodeData versionable; protected SessionChangesLog changesLog; protected SessionChangesLog versionableLog; protected NodeTypeManagerImpl ntManager; protected FrozenNodeInitializer visitor; protected class TestTransientValueData extends TransientValueData { protected TestTransientValueData(byte[] data, int orderNumb) { super(orderNumb, data); } } public void setUp() throws Exception { super.setUp(); rootUuid = IdGenerator.generate(); frozenUuid = IdGenerator.generate(); versionedVersionHistoryUuid = IdGenerator.generate(); nodeUuid1 = IdGenerator.generate(); nodeUuid2 = IdGenerator.generate(); nodeUuid3 = IdGenerator.generate(); nodeUuid31 = IdGenerator.generate(); nodeUuid32 = IdGenerator.generate(); propertyUuid11 = IdGenerator.generate(); propertyUuid12 = IdGenerator.generate(); propertyUuid21 = IdGenerator.generate(); propertyUuid22 = IdGenerator.generate(); propertyUuid311 = IdGenerator.generate(); propertyUuid312 = IdGenerator.generate(); stringDataMultivalued = new ArrayList<ValueData>(); stringDataMultivalued.add(new TestTransientValueData("property data 1".getBytes(), 0)); stringDataMultivalued.add(new TestTransientValueData("property data 2".getBytes(), 1)); stringDataMultivalued.add(new TestTransientValueData("property data 3".getBytes(), 2)); stringDataSinglevalued = new ArrayList<ValueData>(); stringDataSinglevalued.add(new TestTransientValueData("property data".getBytes(), 0)); longDataSinglevalued = new ArrayList<ValueData>(); longDataSinglevalued.add(new TestTransientValueData(new Long(123456l).toString().getBytes(), 0)); binaryDataSinglevalued = new ArrayList<ValueData>(); binaryDataSinglevalued.add(new TestTransientValueData("property binary data".getBytes(), 0)); versionedVersionHistoryData = new ArrayList<ValueData>(); versionedVersionHistoryData.add(new TestTransientValueData(versionedVersionHistoryUuid.getBytes(), 0)); changesLog = new SessionChangesLog(session); ntManager = (NodeTypeManagerImpl)session.getWorkspace().getNodeTypeManager(); SessionChangesLog initChanges = new SessionChangesLog(session); NodeData wsRoot = (NodeData)((NodeImpl)session.getRootNode()).getData(); testRoot = TransientNodeData.createNodeData(wsRoot, new InternalQName(null, TEST_ROOT), Constants.NT_UNSTRUCTURED); initChanges.add(ItemState.createAddedState(testRoot)); frozenRoot = TransientNodeData.createNodeData(testRoot, frozenRootName, Constants.NT_UNSTRUCTURED); initChanges.add(ItemState.createAddedState(frozenRoot)); // session.getTransientNodesManager().getTransactManager().save(changesLog); SessionDataManagerTestWrapper managerWrapper = new SessionDataManagerTestWrapper(session.getTransientNodesManager()); managerWrapper.getChangesLog().addAll(initChanges.getAllStates()); visitor = new FrozenNodeInitializer(frozenRoot, session.getTransientNodesManager(), session.getWorkspace() .getNodeTypesHolder(), changesLog, session.getValueFactory()); } public void tearDown() throws Exception { changesLog.clear(); session.refresh(false); super.tearDown(); } /** * Prepare in session log: /testRoot/node 1 /testRoot/node 1/property 1 * /testRoot/node 1/property 2 /testRoot/node 2 /testRoot/node 2/property 3 * /testRoot/node 2/property 4 /testRoot/node 2/node 3 /testRoot/node 2/node * 3/property 5 */ public void createVersionable(int testCase) throws Exception { versionableLog = new SessionChangesLog(session); // target node versionable = TransientNodeData.createNodeData(testRoot, nodeName1, Constants.NT_UNSTRUCTURED, mixVersionable, nodeUuid1); versionableLog.add(ItemState.createAddedState(versionable)); PropertyData vChildProperty1 = TransientPropertyData.createPropertyData(versionable, propertyName1, 0, true, stringDataMultivalued); versionableLog.add(ItemState.createAddedState(vChildProperty1)); PropertyData vChildProperty2 = TransientPropertyData.createPropertyData(versionable, propertyName2, 0, false, longDataSinglevalued); versionableLog.add(ItemState.createAddedState(vChildProperty2)); NodeData vChildNode1 = TransientNodeData.createNodeData(versionable, nodeName2, Constants.NT_UNSTRUCTURED); versionableLog.add(ItemState.createAddedState(vChildNode1)); PropertyData vChildNode1_property1 = TransientPropertyData.createPropertyData(vChildNode1, propertyName3, 0, false, stringDataSinglevalued); versionableLog.add(ItemState.createAddedState(vChildNode1_property1)); PropertyData vChildNode1_property2 = TransientPropertyData.createPropertyData(vChildNode1, propertyName4, 0, false, binaryDataSinglevalued); versionableLog.add(ItemState.createAddedState(vChildNode1_property2)); NodeData vChildNode1_node3 = TransientNodeData.createNodeData(vChildNode1, nodeName3, Constants.NT_UNSTRUCTURED); versionableLog.add(ItemState.createAddedState(vChildNode1_node3)); PropertyData vChildNode1_node3_property1 = TransientPropertyData.createPropertyData(vChildNode1_node3, propertyName5, 0, false, stringDataSinglevalued); versionableLog.add(ItemState.createAddedState(vChildNode1_node3_property1)); NodeData vChildNode1_node4 = TransientNodeData.createNodeData(vChildNode1, nodeName4, Constants.NT_UNSTRUCTURED); versionableLog.add(ItemState.createAddedState(vChildNode1_node4)); PropertyData vChildNode1_node4_property1 = TransientPropertyData.createPropertyData(vChildNode1_node4, propertyName1, 0, false, stringDataMultivalued); versionableLog.add(ItemState.createAddedState(vChildNode1_node4_property1)); switch (testCase) { case (TESTCASE_ONPARENT_ABORT) : { NodeData vChildNode1_node5 = TransientNodeData.createNodeData(vChildNode1, nodeName5, NT_TEST_ONPARENT_ABORT); versionableLog.add(ItemState.createAddedState(vChildNode1_node5)); PropertyData vChildNode1_node5_propertyAborted = TransientPropertyData.createPropertyData(vChildNode1_node5, PROPERTY_ABORTED, 0, false, stringDataSinglevalued); versionableLog.add(ItemState.createAddedState(vChildNode1_node5_propertyAborted)); NodeData vChildNode1_node5_nodeAborted = TransientNodeData.createNodeData(vChildNode1_node5, NODE_ABOORTED, Constants.NT_UNSTRUCTURED); versionableLog.add(ItemState.createAddedState(vChildNode1_node5_nodeAborted)); PropertyData vChildNode1_node5_node1_property2 = TransientPropertyData.createPropertyData(vChildNode1_node5_nodeAborted, propertyName2, 0, false, stringDataSinglevalued); versionableLog.add(ItemState.createAddedState(vChildNode1_node5_node1_property2)); break; } case (TESTCASE_ONPARENT_IGNORE) : { NodeData vChildNode1_node5 = TransientNodeData.createNodeData(vChildNode1, nodeName5, NT_TEST_ONPARENT_IGNORE); versionableLog.add(ItemState.createAddedState(vChildNode1_node5)); PropertyData vChildNode1_node5_propertyIgnored = TransientPropertyData.createPropertyData(vChildNode1_node5, PROPERTY_IGNORED, 0, false, stringDataSinglevalued); versionableLog.add(ItemState.createAddedState(vChildNode1_node5_propertyIgnored)); NodeData vChildNode1_node5_nodeIgnored = TransientNodeData.createNodeData(vChildNode1_node5, NODE_IGNORED, Constants.NT_UNSTRUCTURED); versionableLog.add(ItemState.createAddedState(vChildNode1_node5_nodeIgnored)); PropertyData vChildNode1_node5_node1_property2 = TransientPropertyData.createPropertyData(vChildNode1_node5_nodeIgnored, propertyName2, 0, false, stringDataSinglevalued); versionableLog.add(ItemState.createAddedState(vChildNode1_node5_node1_property2)); break; } case (TESTCASE_ONPARENT_VERSION) : { NodeData vChildNode1_node5 = TransientNodeData.createNodeData(vChildNode1, nodeName5, NT_TEST_ONPARENT_VERSION); versionableLog.add(ItemState.createAddedState(vChildNode1_node5)); PropertyData vChildNode1_node5_propertyVersioned = TransientPropertyData.createPropertyData(vChildNode1_node5, PROPERTY_VERSIONED, 0, false, stringDataSinglevalued); // behaviour // of // COPY // will // be versionableLog.add(ItemState.createAddedState(vChildNode1_node5_propertyVersioned)); NodeData vChildNode1_node5_nodeVersioned = TransientNodeData.createNodeData(vChildNode1_node5, NODE_VERSIONED, Constants.NT_UNSTRUCTURED, mixVersionable); versionableLog.add(ItemState.createAddedState(vChildNode1_node5_nodeVersioned)); PropertyData vChildNode1_node5_node1_property2 = TransientPropertyData.createPropertyData(vChildNode1_node5_nodeVersioned, propertyName2, 0, false, stringDataSinglevalued); versionableLog.add(ItemState.createAddedState(vChildNode1_node5_node1_property2)); // version history for store in jcr:childVersionHistory property during // visitor work PropertyData vChildNode1_node5_nodeVersioned_versionHistory = TransientPropertyData.createPropertyData(vChildNode1_node5_nodeVersioned, Constants.JCR_VERSIONHISTORY, PropertyType.REFERENCE, false, versionedVersionHistoryData); versionableLog.add(ItemState.createAddedState(vChildNode1_node5_nodeVersioned_versionHistory)); break; } } SessionDataManagerTestWrapper managerWrapper = new SessionDataManagerTestWrapper(session.getTransientNodesManager()); managerWrapper.getChangesLog().addAll(versionableLog.getAllStates()); } }