1 package org.springframework.jdbc.core;
2 
3 import java.sql.Connection;
4 import java.sql.PreparedStatement;
5 import java.sql.DatabaseMetaData;
6 import java.sql.SQLException;
7 import java.util.List;
8 import java.util.Map;
9 import javax.sql.DataSource;
10 
11 import org.easymock.MockControl;
12 import org.apache.commons.logging.LogFactory;
13 
14 import org.springframework.jdbc.core.namedparam.SqlParameterSource;
15 
16 /**
17  * @author Thomas Risberg
18  */
19 public abstract class BatchUpdateTestHelper {
20 
prepareBatchUpdateMocks(String sqlToUse, Object ids, int[] sqlTypes, int[] rowsAffected, MockControl ctrlDataSource, DataSource mockDataSource, MockControl ctrlConnection, Connection mockConnection, MockControl ctrlPreparedStatement, PreparedStatement mockPreparedStatement, MockControl ctrlDatabaseMetaData, DatabaseMetaData mockDatabaseMetaData)21 	public static void prepareBatchUpdateMocks(String sqlToUse, Object ids, int[] sqlTypes,
22 			int[] rowsAffected,
23 			MockControl ctrlDataSource, DataSource mockDataSource, MockControl ctrlConnection, Connection mockConnection,
24 			MockControl ctrlPreparedStatement,
25 			PreparedStatement mockPreparedStatement, MockControl ctrlDatabaseMetaData, DatabaseMetaData mockDatabaseMetaData)
26 			throws SQLException {
27 		mockConnection.getMetaData();
28 		ctrlConnection.setDefaultReturnValue(null);
29 		mockConnection.close();
30 		ctrlConnection.setDefaultVoidCallable();
31 
32 		mockDataSource.getConnection();
33 		ctrlDataSource.setDefaultReturnValue(mockConnection);
34 
35 		mockPreparedStatement.getConnection();
36 		ctrlPreparedStatement.setReturnValue(mockConnection);
37 		int idLength = 0;
38 		if (ids instanceof SqlParameterSource[]) {
39 			idLength = ((SqlParameterSource[])ids).length;
40 		}
41 		else if (ids instanceof Map[]) {
42 			idLength = ((Map[])ids).length;
43 		}
44 		else {
45 			idLength = ((List)ids).size();
46 		}
47 
48 		for (int i = 0; i < idLength; i++) {
49 			if (ids instanceof SqlParameterSource[]) {
50 				if (sqlTypes != null) {
51 					mockPreparedStatement.setObject(1, ((SqlParameterSource[])ids)[i].getValue("id"), sqlTypes[0]);
52 				}
53 				else {
54 					mockPreparedStatement.setObject(1, ((SqlParameterSource[])ids)[i].getValue("id"));
55 				}
56 			}
57 			else if (ids instanceof Map[]) {
58 				if (sqlTypes != null) {
59 					mockPreparedStatement.setObject(1, ((Map[])ids)[i].get("id"), sqlTypes[0]);
60 				}
61 				else {
62 					mockPreparedStatement.setObject(1, ((Map[])ids)[i].get("id"));
63 				}
64 			}
65 			else {
66 				if (sqlTypes != null) {
67 					mockPreparedStatement.setObject(1, ((Object[])((List)ids).get(i))[0], sqlTypes[0]);
68 				}
69 				else {
70 					mockPreparedStatement.setObject(1, ((Object[])((List)ids).get(i))[0]);
71 				}
72 			}
73 			ctrlPreparedStatement.setVoidCallable();
74 			mockPreparedStatement.addBatch();
75 			ctrlPreparedStatement.setVoidCallable();
76 		}
77 		mockPreparedStatement.executeBatch();
78 		ctrlPreparedStatement.setReturnValue(rowsAffected);
79 		if (LogFactory.getLog(JdbcTemplate.class).isDebugEnabled()) {
80 			mockPreparedStatement.getWarnings();
81 			ctrlPreparedStatement.setReturnValue(null);
82 		}
83 		mockPreparedStatement.close();
84 		ctrlPreparedStatement.setVoidCallable();
85 
86 		mockDatabaseMetaData.getDatabaseProductName();
87 		ctrlDatabaseMetaData.setReturnValue("MySQL");
88 		mockDatabaseMetaData.supportsBatchUpdates();
89 		ctrlDatabaseMetaData.setReturnValue(true);
90 
91 		mockConnection.prepareStatement(sqlToUse);
92 		ctrlConnection.setReturnValue(mockPreparedStatement);
93 		mockConnection.getMetaData();
94 		ctrlConnection.setReturnValue(mockDatabaseMetaData, 2);
95 	}
96 
replayBatchUpdateMocks(MockControl ctrlDataSource, MockControl ctrlConnection, MockControl ctrlPreparedStatement, MockControl ctrlDatabaseMetaData)97 	public static void replayBatchUpdateMocks(MockControl ctrlDataSource,
98 			MockControl ctrlConnection,
99 			MockControl ctrlPreparedStatement,
100 			MockControl ctrlDatabaseMetaData) {
101 		ctrlPreparedStatement.replay();
102 		ctrlDatabaseMetaData.replay();
103 		ctrlDataSource.replay();
104 		ctrlConnection.replay();
105 	}
106 
verifyBatchUpdateMocks(MockControl ctrlPreparedStatement, MockControl ctrlDatabaseMetaData)107 	public static void verifyBatchUpdateMocks(MockControl ctrlPreparedStatement, MockControl ctrlDatabaseMetaData) {
108 		ctrlPreparedStatement.verify();
109 		ctrlDatabaseMetaData.verify();
110 	}
111 
112 }
113