/* * Copyright 2004-2015 the Seasar Foundation and the Others. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ package org.seasar.extension.jdbc.manager; import java.util.Arrays; import java.util.List; import javax.sql.DataSource; import javax.transaction.TransactionManager; import junit.framework.TestCase; import org.seasar.extension.datasource.DataSourceFactory; import org.seasar.extension.datasource.impl.DataSourceFactoryImpl; import org.seasar.extension.datasource.impl.SelectableDataSourceProxy; import org.seasar.extension.jdbc.JdbcContext; import org.seasar.extension.jdbc.dialect.StandardDialect; import org.seasar.extension.jdbc.entity.Aaa; import org.seasar.extension.jdbc.entity.Eee; import org.seasar.extension.jdbc.entity.Iii; import org.seasar.extension.jdbc.exception.NoIdPropertyRuntimeException; import org.seasar.extension.jdbc.manager.JdbcManagerImpl.SynchronizationImpl; import org.seasar.extension.jdbc.meta.ColumnMetaFactoryImpl; import org.seasar.extension.jdbc.meta.EntityMetaFactoryImpl; import org.seasar.extension.jdbc.meta.PropertyMetaFactoryImpl; import org.seasar.extension.jdbc.meta.TableMetaFactoryImpl; import org.seasar.extension.jdbc.query.AutoBatchDeleteImpl; import org.seasar.extension.jdbc.query.AutoBatchInsertImpl; import org.seasar.extension.jdbc.query.AutoBatchUpdateImpl; import org.seasar.extension.jdbc.query.AutoDeleteImpl; import org.seasar.extension.jdbc.query.AutoFunctionCallImpl; import org.seasar.extension.jdbc.query.AutoInsertImpl; import org.seasar.extension.jdbc.query.AutoProcedureCallImpl; import org.seasar.extension.jdbc.query.AutoSelectImpl; import org.seasar.extension.jdbc.query.AutoUpdateImpl; import org.seasar.extension.jdbc.query.SqlBatchUpdateImpl; import org.seasar.extension.jdbc.query.SqlFileBatchUpdateImpl; import org.seasar.extension.jdbc.query.SqlFileFunctionCallImpl; import org.seasar.extension.jdbc.query.SqlFileProcedureCallImpl; import org.seasar.extension.jdbc.query.SqlFileSelectImpl; import org.seasar.extension.jdbc.query.SqlFileUpdateImpl; import org.seasar.extension.jdbc.query.SqlFunctionCallImpl; import org.seasar.extension.jdbc.query.SqlProcedureCallImpl; import org.seasar.extension.jdbc.query.SqlSelectImpl; import org.seasar.extension.jdbc.query.SqlUpdateImpl; import org.seasar.extension.jta.TransactionImpl; import org.seasar.extension.jta.TransactionManagerImpl; import org.seasar.extension.jta.TransactionSynchronizationRegistryImpl; import org.seasar.framework.convention.impl.PersistenceConventionImpl; import org.seasar.framework.mock.sql.MockDataSource; /** * @author higa * */ public class JdbcManagerImplTest extends TestCase { private JdbcManagerImpl manager; private TransactionManager transactionManager; @Override protected void setUp() throws Exception { manager = new JdbcManagerImpl(); manager.setDialect(new StandardDialect()); transactionManager = new TransactionManagerImpl(); manager.setSyncRegistry(new TransactionSynchronizationRegistryImpl( transactionManager)); manager.setDataSource(new MockDataSource()); PersistenceConventionImpl convention = new PersistenceConventionImpl(); EntityMetaFactoryImpl emFactory = new EntityMetaFactoryImpl(); emFactory.setPersistenceConvention(convention); TableMetaFactoryImpl tableMetaFactory = new TableMetaFactoryImpl(); tableMetaFactory.setPersistenceConvention(convention); emFactory.setTableMetaFactory(tableMetaFactory); PropertyMetaFactoryImpl pFactory = new PropertyMetaFactoryImpl(); pFactory.setPersistenceConvention(convention); ColumnMetaFactoryImpl cmFactory = new ColumnMetaFactoryImpl(); cmFactory.setPersistenceConvention(convention); pFactory.setColumnMetaFactory(cmFactory); emFactory.setPropertyMetaFactory(pFactory); emFactory.initialize(); manager.setEntityMetaFactory(emFactory); } @Override protected void tearDown() throws Exception { manager = null; } /** * @throws Exception * */ public void testSelectBySql() throws Exception { String sql = "select * from aaa"; SqlSelectImpl<Aaa> select = (SqlSelectImpl<Aaa>) manager.selectBySql( Aaa.class, sql); assertNotNull(select); assertSame(manager, select.getJdbcManager()); assertEquals(Aaa.class, select.getBaseClass()); assertEquals(sql, select.getSql()); } /** * @throws Exception * */ public void testSelectBySql_parameters() throws Exception { String sql = "select * from aaa where id = ?"; SqlSelectImpl<Aaa> query = (SqlSelectImpl<Aaa>) manager.selectBySql( Aaa.class, sql, 1); assertNotNull(query); assertSame(manager, query.getJdbcManager()); assertEquals(Aaa.class, query.getBaseClass()); assertEquals(sql, query.getSql()); Object[] vars = query.getParamValues(); assertEquals(1, vars.length); assertEquals(1, vars[0]); } /** * @throws Exception * */ public void testUpdateBySql() throws Exception { String sql = "update aaa set name = ? where id = ?"; SqlUpdateImpl query = (SqlUpdateImpl) manager.updateBySql(sql, String.class, Integer.class); assertNotNull(query); assertSame(manager, query.getJdbcManager()); assertEquals(sql, query.getExecutedSql()); } /** * @throws Exception * */ public void testUpdateBatchBySql() throws Exception { String sql = "update aaa set name = ? where id = ?"; SqlBatchUpdateImpl query = (SqlBatchUpdateImpl) manager .updateBatchBySql(sql, String.class, Integer.class); assertNotNull(query); assertSame(manager, query.getJdbcManager()); assertEquals(sql, query.getExecutedSql()); } /** * @throws Exception * */ public void testSelectBySqlFile() throws Exception { String path = "select.sql"; SqlFileSelectImpl<Aaa> query = (SqlFileSelectImpl<Aaa>) manager .selectBySqlFile(Aaa.class, path); assertNotNull(query); assertSame(manager, query.getJdbcManager()); assertEquals(Aaa.class, query.getBaseClass()); assertEquals(path, query.getPath()); } /** * @throws Exception * */ public void testUpdateBySqlFile() throws Exception { String path = "update.sql"; SqlFileUpdateImpl query = (SqlFileUpdateImpl) manager.updateBySqlFile( path, 1); assertNotNull(query); assertSame(manager, query.getJdbcManager()); assertEquals(path, query.getPath()); } /** * * @throws Exception */ public void testUpdateBatchBySqlFile() throws Exception { String path = "update.sql"; SqlFileBatchUpdateImpl<String> query = (SqlFileBatchUpdateImpl<String>) manager .updateBatchBySqlFile(path, "foo", "bar"); assertNotNull(query); assertSame(manager, query.getJdbcManager()); assertEquals(path, query.getPath()); } /** * @throws Exception * */ public void testCall_procedure() throws Exception { manager.maxRows = 100; manager.fetchSize = 10; manager.queryTimeout = 5; AutoProcedureCallImpl query = (AutoProcedureCallImpl) manager.call( "myProc", 1); assertNotNull(query); assertSame(manager, query.getJdbcManager()); assertEquals(100, query.getMaxRows()); assertEquals(10, query.getFetchSize()); assertEquals(5, query.getQueryTimeout()); assertEquals(1, query.getParameter()); } /** * @throws Exception * */ public void testCallBySql_procedure() throws Exception { manager.maxRows = 100; manager.fetchSize = 10; manager.queryTimeout = 5; String sql = "{call hoge(?)}"; SqlProcedureCallImpl query = (SqlProcedureCallImpl) manager.callBySql( sql, 1); assertNotNull(query); assertSame(manager, query.getJdbcManager()); assertEquals(100, query.getMaxRows()); assertEquals(10, query.getFetchSize()); assertEquals(5, query.getQueryTimeout()); assertEquals(sql, query.getExecutedSql()); assertEquals(1, query.getParameter()); } /** * @throws Exception * */ public void testCallBySqlFile_procedure() throws Exception { manager.maxRows = 100; manager.fetchSize = 10; manager.queryTimeout = 5; String path = "call.sql"; SqlFileProcedureCallImpl query = (SqlFileProcedureCallImpl) manager .callBySqlFile(path, 1); assertNotNull(query); assertSame(manager, query.getJdbcManager()); assertEquals(100, query.getMaxRows()); assertEquals(10, query.getFetchSize()); assertEquals(5, query.getQueryTimeout()); assertEquals(path, query.getPath()); assertEquals(1, query.getParameter()); } /** * @throws Exception * */ public void testCall_function() throws Exception { manager.maxRows = 100; manager.fetchSize = 10; manager.queryTimeout = 5; AutoFunctionCallImpl<String> query = (AutoFunctionCallImpl<String>) manager .call(String.class, "myFunc", 1); assertNotNull(query); assertSame(manager, query.getJdbcManager()); assertEquals(100, query.getMaxRows()); assertEquals(10, query.getFetchSize()); assertEquals(5, query.getQueryTimeout()); assertEquals(1, query.getParameter()); } /** * @throws Exception * */ public void testCallBySql_function() throws Exception { manager.maxRows = 100; manager.fetchSize = 10; manager.queryTimeout = 5; String sql = "{? = call hoge(?)}"; SqlFunctionCallImpl<String> query = (SqlFunctionCallImpl<String>) manager .callBySql(String.class, sql, 1); assertNotNull(query); assertSame(manager, query.getJdbcManager()); assertEquals(100, query.getMaxRows()); assertEquals(10, query.getFetchSize()); assertEquals(5, query.getQueryTimeout()); assertEquals(sql, query.getExecutedSql()); assertEquals(1, query.getParameter()); } /** * @throws Exception * */ public void testCallBySqlFile_function() throws Exception { manager.maxRows = 100; manager.fetchSize = 10; manager.queryTimeout = 5; String path = "call.sql"; SqlFileFunctionCallImpl<String> query = (SqlFileFunctionCallImpl<String>) manager .callBySqlFile(String.class, path, 1); assertNotNull(query); assertSame(manager, query.getJdbcManager()); assertEquals(100, query.getMaxRows()); assertEquals(10, query.getFetchSize()); assertEquals(5, query.getQueryTimeout()); assertEquals(path, query.getPath()); assertEquals(1, query.getParameter()); } /** * @throws Exception */ public void testFrom() throws Exception { AutoSelectImpl<Aaa> query = (AutoSelectImpl<Aaa>) manager .from(Aaa.class); assertNotNull(query); assertSame(manager, query.getJdbcManager()); assertEquals(Aaa.class, query.getBaseClass()); } /** * @throws Exception */ public void testAutoInsert() throws Exception { Eee eee = new Eee(); AutoInsertImpl<Eee> query = (AutoInsertImpl<Eee>) manager.insert(eee); assertNotNull(query); assertSame(manager, query.getJdbcManager()); assertSame(eee, query.getEntity()); } /** * @throws Exception */ public void testAutoBatchInsert_array() throws Exception { Eee[] entities = new Eee[] { new Eee(1, "foo"), new Eee(2, "bar"), new Eee(3, "baz") }; AutoBatchInsertImpl<Eee> query = (AutoBatchInsertImpl<Eee>) manager .insertBatch(entities); assertNotNull(query); assertSame(manager, query.getJdbcManager()); assertEquals(3, query.getEntities().size()); assertSame(entities[0], query.getEntities().get(0)); assertSame(entities[1], query.getEntities().get(1)); assertSame(entities[2], query.getEntities().get(2)); } /** * @throws Exception */ public void testAutoBatchInsert_list() throws Exception { List<Eee> entities = Arrays.asList(new Eee(1, "foo"), new Eee(2, "bar"), new Eee(3, "baz")); AutoBatchInsertImpl<Eee> query = (AutoBatchInsertImpl<Eee>) manager .insertBatch(entities); assertNotNull(query); assertSame(manager, query.getJdbcManager()); assertSame(entities, query.getEntities()); } /** * @throws Exception * */ public void testAutoUpdate() throws Exception { Eee eee = new Eee(); AutoUpdateImpl<Eee> query = (AutoUpdateImpl<Eee>) manager.update(eee); assertNotNull(query); assertSame(manager, query.getJdbcManager()); assertSame(eee, query.getEntity()); try { manager.update(new Iii()); fail(); } catch (NoIdPropertyRuntimeException expected) { System.out.println(expected); } } /** * @throws Exception */ public void testAutoBatchUpdate_array() throws Exception { Eee[] entities = new Eee[] { new Eee(1, "foo"), new Eee(2, "bar"), new Eee(3, "baz") }; AutoBatchUpdateImpl<Eee> query = (AutoBatchUpdateImpl<Eee>) manager .updateBatch(entities); assertNotNull(query); assertSame(manager, query.getJdbcManager()); assertEquals(3, query.getEntities().size()); assertSame(entities[0], query.getEntities().get(0)); assertSame(entities[1], query.getEntities().get(1)); assertSame(entities[2], query.getEntities().get(2)); try { manager.updateBatch(new Iii[] { new Iii() }); fail(); } catch (NoIdPropertyRuntimeException expected) { System.out.println(expected); } } /** * @throws Exception */ public void testAutoBatchUpdate_list() throws Exception { List<Eee> entities = Arrays.asList(new Eee(1, "foo"), new Eee(2, "bar"), new Eee(3, "baz")); AutoBatchUpdateImpl<Eee> query = (AutoBatchUpdateImpl<Eee>) manager .updateBatch(entities); assertNotNull(query); assertSame(manager, query.getJdbcManager()); assertSame(entities, query.getEntities()); try { manager.updateBatch(Arrays.asList(new Iii())); fail(); } catch (NoIdPropertyRuntimeException expected) { System.out.println(expected); } } /** * @throws Exception * */ public void testAutoDelete() throws Exception { Eee eee = new Eee(); AutoDeleteImpl<Eee> query = (AutoDeleteImpl<Eee>) manager.delete(eee); assertNotNull(query); assertSame(manager, query.getJdbcManager()); assertSame(eee, query.getEntity()); try { manager.delete(new Iii()); fail(); } catch (NoIdPropertyRuntimeException expected) { System.out.println(expected); } } /** * @throws Exception */ public void testAutoBatchDelete_array() throws Exception { Eee[] entities = new Eee[] { new Eee(1, "foo"), new Eee(2, "bar"), new Eee(3, "baz") }; AutoBatchDeleteImpl<Eee> query = (AutoBatchDeleteImpl<Eee>) manager .deleteBatch(entities); assertNotNull(query); assertSame(manager, query.getJdbcManager()); assertEquals(3, query.getEntities().size()); assertSame(entities[0], query.getEntities().get(0)); assertSame(entities[1], query.getEntities().get(1)); assertSame(entities[2], query.getEntities().get(2)); try { manager.deleteBatch(new Iii[] { new Iii() }); fail(); } catch (NoIdPropertyRuntimeException expected) { System.out.println(expected); } } /** * @throws Exception */ public void testAutoBatchDelete_list() throws Exception { List<Eee> entities = Arrays.asList(new Eee(1, "foo"), new Eee(2, "bar"), new Eee(3, "baz")); AutoBatchDeleteImpl<Eee> query = (AutoBatchDeleteImpl<Eee>) manager .deleteBatch(entities); assertNotNull(query); assertSame(manager, query.getJdbcManager()); assertSame(entities, query.getEntities()); try { manager.deleteBatch(Arrays.asList(new Iii())); fail(); } catch (NoIdPropertyRuntimeException expected) { System.out.println(expected); } } /** * @throws Exception * */ public void testGetJdbcContext_tx() throws Exception { transactionManager.begin(); JdbcContext ctx = manager.getJdbcContext(); assertNotNull(ctx); assertTrue(ctx.isTransactional()); assertSame(ctx, manager.getJdbcContext()); TransactionImpl tx = (TransactionImpl) transactionManager .getTransaction(); assertEquals(1, tx.getInterposedSynchronizations().size()); SynchronizationImpl sync = SynchronizationImpl.class.cast(tx .getInterposedSynchronizations().get(0)); assertSame(manager.getJdbcContext(), sync.context); } /** * * @throws Exception */ public void testGetJdbcContext_tx_selectableDataSource() throws Exception { DataSourceFactory dataSourceFactory = new MockDataSourceFactory(); SelectableDataSourceProxy dataSource = new SelectableDataSourceProxy(); dataSource.setDataSourceFactory(dataSourceFactory); manager.setDataSource(dataSource); manager.setDataSourceFactory(dataSourceFactory); transactionManager.begin(); dataSourceFactory.setSelectableDataSourceName("hoge"); JdbcContext hogeCtx = manager.getJdbcContext(); assertNotNull(hogeCtx); assertTrue(hogeCtx.isTransactional()); assertSame(hogeCtx, manager.getJdbcContext()); assertEquals("hoge", manager.getSelectableDataSourceName()); dataSourceFactory.setSelectableDataSourceName("foo"); JdbcContext fooCtx = manager.getJdbcContext(); assertNotNull(fooCtx); assertTrue(fooCtx.isTransactional()); assertSame(fooCtx, manager.getJdbcContext()); assertEquals("foo", manager.getSelectableDataSourceName()); TransactionImpl tx = (TransactionImpl) transactionManager .getTransaction(); assertEquals(2, tx.getInterposedSynchronizations().size()); SynchronizationImpl sync = SynchronizationImpl.class.cast(tx .getInterposedSynchronizations().get(0)); assertSame(hogeCtx, sync.context); sync = SynchronizationImpl.class.cast(tx .getInterposedSynchronizations().get(1)); assertSame(fooCtx, sync.context); } /** * @throws Exception * */ public void testBeforeCompletion() throws Exception { transactionManager.begin(); JdbcContextImpl ctx = (JdbcContextImpl) manager.getJdbcContext(); ctx.getStatement(); transactionManager.commit(); assertTrue(ctx.isConnectionNull()); assertTrue(ctx.isStatementNull()); assertTrue(manager.isJdbcContextNull()); } /** * @throws Exception * */ public void testGetJdbcContext_notx() throws Exception { JdbcContext ctx = manager.getJdbcContext(); assertNotNull(ctx); assertFalse(ctx.isTransactional()); assertNotSame(ctx, manager.getJdbcContext()); } /** * * @author taedium */ public static class MockDataSourceFactory extends DataSourceFactoryImpl { @Override public DataSource getDataSource(String name) { return new MockDataSource(); } } }