/* * 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.storage; import org.exoplatform.container.ExoContainer; import org.exoplatform.services.jcr.JcrImplBaseTest; import org.exoplatform.services.jcr.config.WorkspaceEntry; import org.exoplatform.services.jcr.datamodel.ItemType; import org.exoplatform.services.jcr.datamodel.NodeData; import org.exoplatform.services.jcr.datamodel.PropertyData; import org.exoplatform.services.jcr.datamodel.QPathEntry; import org.exoplatform.services.jcr.impl.core.PropertyImpl; import org.exoplatform.services.jcr.impl.dataflow.TransientPropertyData; import org.exoplatform.services.jcr.impl.dataflow.TransientValueData; import org.exoplatform.services.jcr.impl.dataflow.persistent.SimpleChangedSizeHandler; import org.exoplatform.services.jcr.impl.storage.jdbc.JDBCDataContainerConfig.DatabaseStructureType; import org.exoplatform.services.jcr.impl.storage.jdbc.JDBCStorageConnection; import org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer; import org.exoplatform.services.jcr.storage.WorkspaceDataContainer; import org.exoplatform.services.jcr.storage.WorkspaceStorageConnection; import java.sql.Statement; import java.util.Calendar; import javax.jcr.Node; import javax.jcr.PropertyType; import javax.jcr.version.Version; /** * Created by The eXo Platform SAS Author : Peter Nedonosko peter.nedonosko@exoplatform.com.ua * 26.09.2006 VARNING! This test change data container database data directly in tables * JCR_XCONTAINER: version switched to 1.0 value. And then try update container to actual data in * StorageUpdateManager. * * @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter Nedonosko</a> * @version $Id: StorageUpdateTest.java 11907 2008-03-13 15:36:21Z ksm $ */ public class StorageUpdateTest extends JcrImplBaseTest { protected static final String REFERENCEABLE_NAME = "node_R__nt_file"; protected static final String VERSIONABLE_NAME = "node_V__nt_file"; private JDBCWorkspaceDataContainer dataContainer = null; private Node testNode = null; private Version version1_node_V = null; private Version version2_node_V = null; private Version version3_node_V = null; private Version version1_node_R = null; private Version version2_node_R = null; private DatabaseStructureType dbStructureType; @Override public void setUp() throws Exception { super.setUp(); ExoContainer exoContainer = session.getContainer(); if (exoContainer == null) fail("This test can be executed by user with ADMIN rights only"); dataContainer = (JDBCWorkspaceDataContainer)exoContainer.getComponentInstanceOfType(WorkspaceDataContainer.class); if (dataContainer == null) fail("This test can be executed on JDBCWorkspaceDataContainer instance only"); WorkspaceEntry wsEntry = (WorkspaceEntry)session.getContainer() .getComponentInstanceOfType(WorkspaceEntry.class); dbStructureType = DatabaseStructureType.valueOf(wsEntry.getContainer().getParameterValue( JDBCWorkspaceDataContainer.DB_STRUCTURE_TYPE)); testNode = session.getRootNode().addNode("test_node", "nt:unstructured"); // create referenceable node Node node_R = testNode.addNode(REFERENCEABLE_NAME, "nt:file"); Node content = node_R.addNode("jcr:content", "nt:unstructured"); content.setProperty("anyDate", Calendar.getInstance()); content.setProperty("anyString", "11111111111111<=Any string=>11111111111111111"); content.setProperty("anyNumb", 123.321d); content.setProperty("anyBinary", "11111111111111<=Any binary=>11111111111111111", PropertyType.BINARY); content.addNode("anyNode1").setProperty("_some_double", 1234.4321d); content.addNode("anyNode2").setProperty("_some_long", 123456789L); session.save(); if (node_R.canAddMixin("mix:versionable")) { node_R.addMixin("mix:versionable"); node_R.save(); } else { fail("Can't add mixin mix:versionable"); } session.save(); // show ref node jcr:uuid log.info("node_R node uuid: " + node_R.getUUID() + ", jcr:uuid: " + node_R.getProperty("jcr:uuid").getString()); Node node11 = testNode.addNode("node1").addNode("node11"); session.save(); session.getWorkspace().copy(node_R.getPath(), node11.getPath() + "/" + VERSIONABLE_NAME); // show ver node jcr:uuid Node node_V = node11.getNode(VERSIONABLE_NAME); log.info("node_V node uuid: " + node_V.getUUID() + ", jcr:uuid: " + node_V.getProperty("jcr:uuid").getString()); // ============================================================= // !!!!!!!!!!! add bug from Workspace.copy() ver.1.0 !!!!!!!!!!! // ============================================================= PropertyData jcrUuid = (PropertyData)((PropertyImpl)node_V.getProperty("jcr:uuid")).getData(); // Set a uuid of source node in Workspace.copy() TransientPropertyData bugData = new TransientPropertyData(jcrUuid.getQPath(), jcrUuid.getIdentifier(), jcrUuid.getPersistedVersion(), jcrUuid .getType(), jcrUuid.getParentIdentifier(), jcrUuid.isMultiValued(), new TransientValueData(node_R .getProperty("jcr:uuid").getString())); WorkspaceStorageConnection conn = dataContainer.openConnection(); if (conn instanceof JDBCStorageConnection) { JDBCStorageConnection jdbcConn = (JDBCStorageConnection)conn; conn.update(bugData, new SimpleChangedSizeHandler()); jdbcConn.getJdbcConnection().commit(); NodeData parent = (NodeData)session.getTransientNodesManager().getTransactManager() .getItemData(jcrUuid.getParentIdentifier()); QPathEntry[] qentry = bugData.getQPath().getEntries(); PropertyData persistedBugData = (PropertyData)conn.getItemData(parent, qentry[qentry.length - 1], ItemType.PROPERTY); log.info("node_V node BUG uuid: " + node_V.getUUID() + ", jcr:uuid: " + new String(persistedBugData.getValues().get(0).getAsByteArray())); // =================== remove version record =================== Statement smnt = jdbcConn.getJdbcConnection().createStatement(); log.info("Update container version records: " + smnt.executeUpdate("update JCR_" + (dbStructureType.isMultiDatabase() ? "M" : "S") + "CONTAINER set VERSION='1.0'")); jdbcConn.getJdbcConnection().commit(); conn.commit(); } else { conn.rollback(); fail("This test require WorkspaceStorageConnection instance of JDBCStorageConnection class only"); } // ============================================================= // perform some JCR life operations... versions like, // so bad uuid will be stored in jcr:frozenUuid props (fix will be // implemented in 1.1) // node_V life... version1_node_V = node_V.checkin(); node_V.checkout(); node_V.getNode("jcr:content").addNode("node111"); node_V.save(); version2_node_V = node_V.checkin(); node_V.checkout(); Node n111 = node_V.getNode("jcr:content").getNode("node111"); if (n111.canAddMixin("mix:versionable")) { n111.addMixin("mix:versionable"); n111.save(); n111.checkin(); n111.checkout(); n111.addNode("node111-1").setProperty("doublee111-1", 222D); n111.save(); n111.checkin(); n111.checkout(); } else { fail("Can't add mixin mix:versionable"); } node_V.getNode("jcr:content").getNode("node111").setProperty("prop111", "111111111111"); node_V.save(); version3_node_V = node_V.checkin(); node_V.checkout(); // node_R life... version1_node_R = node_R.checkin(); node_R.checkout(); node_R.getNode("jcr:content").addNode("node222").setProperty("prop222", Calendar.getInstance()); node_R.save(); version2_node_R = node_R.checkin(); node_R.checkout(); } public void testUpdate10() throws Exception { // TODO dataContainer.checkVersion(true); // As for now... check fixes manualy (in SQL tool) etc. } }