/* * Copyright (C) 2003-2007 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. */ package org.exoplatform.services.jcr.impl.storage.jdbc; import org.exoplatform.services.jcr.JcrAPIBaseTest; import org.exoplatform.services.jcr.datamodel.InternalQName; import org.exoplatform.services.jcr.datamodel.NodeData; import org.exoplatform.services.jcr.impl.Constants; import org.exoplatform.services.jcr.impl.dataflow.TransientNodeData; import java.io.ByteArrayInputStream; import java.sql.Connection; import java.sql.ResultSet; import javax.naming.InitialContext; import javax.sql.DataSource; /** * Created by The eXo Platform SAS * * 01.07.2009 * * @author <a href="mailto:dezder@bk.ru">Denis Grebenyuk</a> * @version $Id:$ */ abstract public class JDBCConnectionTestBase extends JcrAPIBaseTest { protected JDBCStorageConnection jdbcConn = null; protected String tableType = null; private Connection connect = null; @Override protected void tearDown() throws Exception { connect.commit(); connect.close(); super.tearDown(); } public Connection getJNDIConnection() throws Exception { DataSource ds = (DataSource)new InitialContext().lookup("jdbcjcrtest"); connect = ds.getConnection(); return connect; } private NodeData setNode() throws Exception { InternalQName[] iqn = {InternalQName.parse("[]DbJDBCConnectionTest")}; TransientNodeData tnd = new TransientNodeData(Constants.JCR_NODETYPES_PATH, "Z", 9, Constants.SV_NODE_NAME, iqn, 8, null, null); return tnd; } private NodeData giveNodeForRename() throws Exception { InternalQName[] iqn = {InternalQName.parse("[]DbJDBCConnectionTest")}; TransientNodeData tnd = new TransientNodeData(Constants.JCR_NODETYPES_PATH, "B", 9, Constants.SV_NODE_NAME, iqn, 8, null, null); return tnd; } public void testAddNode() throws Exception { jdbcConn.add(setNode()); ResultSet rs = connect.createStatement() .executeQuery("select * from " + "JCR_" + tableType + "ITEM" + " where N_ORDER_NUM=8"); rs.next(); assertEquals("[http://www.jcp.org/jcr/1.0]nodetypes", rs.getString("NAME")); } public void testAddValueData() throws Exception { byte data[] = {5}; ByteArrayInputStream bas = new ByteArrayInputStream(data); jdbcConn.addValueData("C", 2, bas, bas.available(), "J"); ResultSet rs = connect.createStatement().executeQuery( "select * from " + "JCR_" + tableType + "VALUE" + " where PROPERTY_ID='C'"); rs.next(); assertEquals("05", rs.getString("DATA")); } public void testRenameNode() throws Exception { jdbcConn.renameNode(giveNodeForRename()); ResultSet rs = connect.createStatement() .executeQuery("select * from " + "JCR_" + tableType + "ITEM" + " where N_ORDER_NUM=8"); rs.next(); assertEquals("[http://www.jcp.org/jcr/1.0]nodetypes", rs.getString("NAME")); } public void testUpdateNodeByIdentifier() throws Exception { jdbcConn.updateNodeByIdentifier(200923, 4512, 20, "B"); ResultSet rs = connect.createStatement().executeQuery("select * from " + "JCR_" + tableType + "ITEM" + " where ID='B'"); rs.next(); assertEquals(20, rs.getInt("N_ORDER_NUM")); } public void testUpdatePropertyByIdentifier() throws Exception { jdbcConn.updatePropertyByIdentifier(200923, 4512, "C"); ResultSet rs = connect.createStatement().executeQuery("select * from " + "JCR_" + tableType + "ITEM" + " where ID='C'"); rs.next(); assertEquals(4512, rs.getInt("P_TYPE")); } public void testDeleteReference() throws Exception { jdbcConn.deleteReference("A"); ResultSet rs = connect.createStatement().executeQuery( "select * from " + "JCR_" + tableType + "REF" + " where PROPERTY_ID='A'"); assertEquals(false, rs.next()); } public void testDeleteItemByIdentifier() throws Exception { jdbcConn.deleteItemByIdentifier("C"); ResultSet rs = connect.createStatement().executeQuery("select * from " + "JCR_" + tableType + "ITEM" + " where ID='C'"); assertEquals(false, rs.next()); } public void testDeleteValueData() throws Exception { jdbcConn.deleteValueData("A"); ResultSet rs = connect.createStatement().executeQuery( "select * from " + "JCR_" + tableType + "VALUE" + " where PROPERTY_ID='A'"); assertEquals(false, rs.next()); } public void testFindItemByIdentifier() throws Exception { ResultSet rsRemote = jdbcConn.findItemByIdentifier("A"); rsRemote.next(); ResultSet rs = connect.createStatement().executeQuery("select * from " + "JCR_" + tableType + "ITEM" + " where ID='A'"); rs.next(); assertEquals(rsRemote.getString("PARENT_ID"), rs.getString("PARENT_ID")); } public void testFindPropertyByName() throws Exception { ResultSet rsRemote = jdbcConn.findPropertyByName("A", "test1"); rsRemote.next(); ResultSet rs = connect .createStatement() .executeQuery( "select V.DATA from JCR_" + tableType + "ITEM I, JCR_" + tableType + "VALUE V " + "where I.I_CLASS=2 and I.PARENT_ID='A' and I.NAME='test1' and I.ID=V.PROPERTY_ID order by V.ORDER_NUM"); rs.next(); assertEquals(rsRemote.getString("DATA"), rs.getString("DATA")); } public void testFindItemByName() throws Exception { ResultSet rsRemote = jdbcConn.findItemByName("A", "test1", 1233); rsRemote.next(); ResultSet rs = connect.createStatement().executeQuery( "select * from JCR_" + tableType + "ITEM" + " where PARENT_ID='A' and NAME='test1' and I_INDEX=1233 order by I_CLASS, VERSION DESC"); rs.next(); assertEquals(rsRemote.getString("ID"), rs.getString("ID")); } public void testFindChildNodesByParentIdentifier() throws Exception { ResultSet rsRemote = jdbcConn.findChildNodesByParentIdentifier("A"); rsRemote.next(); ResultSet rs = connect.createStatement().executeQuery( "select * from " + "JCR_" + tableType + "ITEM" + " where I_CLASS=1 and PARENT_ID='A'"); rs.next(); assertEquals(rsRemote.getString("NAME"), rs.getString("NAME")); } public void testFindChildPropertiesByParentIdentifier() throws Exception { ResultSet rsRemote = jdbcConn.findChildPropertiesByParentIdentifier("A"); rsRemote.next(); ResultSet rs = connect.createStatement().executeQuery( "select * from JCR_" + tableType + "ITEM" + " where I_CLASS=2 and PARENT_ID='A' order by ID"); rs.next(); assertEquals(rsRemote.getString("NAME"), rs.getString("NAME")); } public void testFindReferences() throws Exception { ResultSet rsRemote = jdbcConn.findReferences("D"); rsRemote.next(); ResultSet rs = connect.createStatement().executeQuery( "select P.ID, P.PARENT_ID, P.VERSION, P.P_TYPE, P.P_MULTIVALUED, P.NAME" + " from JCR_" + tableType + "REF R, JCR_" + tableType + "ITEM P" + " where R.NODE_ID='D' and P.ID=R.PROPERTY_ID and P.I_CLASS=2"); rs.next(); assertEquals(rsRemote.getString("ID"), rs.getString("ID")); } public void testFindValuesByPropertyId() throws Exception { ResultSet rsRemote = jdbcConn.findValuesByPropertyId("A"); rsRemote.next(); ResultSet rs = connect.createStatement().executeQuery( "select PROPERTY_ID, ORDER_NUM, STORAGE_DESC from " + "JCR_" + tableType + "VALUE" + " where PROPERTY_ID='A' order by ORDER_NUM"); rs.next(); assertEquals(rsRemote.getString("STORAGE_DESC"), rs.getString("STORAGE_DESC")); } }