1 16 17 package org.springframework.orm.ibatis.support; 18 19 import java.io.ByteArrayInputStream ; 20 import java.io.ByteArrayOutputStream ; 21 import java.io.ObjectOutputStream ; 22 import java.sql.PreparedStatement ; 23 import java.sql.ResultSet ; 24 import java.sql.SQLException ; 25 import java.util.Arrays ; 26 import java.util.List ; 27 28 import javax.sql.DataSource ; 29 30 import junit.framework.TestCase; 31 import org.easymock.ArgumentsMatcher; 32 import org.easymock.MockControl; 33 34 import org.springframework.jdbc.datasource.DataSourceUtils; 35 import org.springframework.jdbc.datasource.DriverManagerDataSource; 36 import org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy; 37 import org.springframework.jdbc.support.lob.LobCreator; 38 import org.springframework.jdbc.support.lob.LobHandler; 39 import org.springframework.transaction.support.TransactionSynchronization; 40 import org.springframework.transaction.support.TransactionSynchronizationManager; 41 42 46 public class LobTypeHandlerTests extends TestCase { 47 48 private MockControl rsControl = MockControl.createControl(ResultSet .class); 49 private ResultSet rs = (ResultSet ) rsControl.getMock(); 50 private MockControl psControl = MockControl.createControl(PreparedStatement .class); 51 private PreparedStatement ps = (PreparedStatement ) psControl.getMock(); 52 53 private MockControl lobHandlerControl = MockControl.createControl(LobHandler.class); 54 private LobHandler lobHandler = (LobHandler) lobHandlerControl.getMock(); 55 private MockControl lobCreatorControl = MockControl.createControl(LobCreator.class); 56 private LobCreator lobCreator = (LobCreator) lobCreatorControl.getMock(); 57 58 protected void setUp() throws SQLException { 59 rs.findColumn("column"); 60 rsControl.setReturnValue(1); 61 62 lobHandler.getLobCreator(); 63 lobHandlerControl.setReturnValue(lobCreator); 64 lobCreator.close(); 65 lobCreatorControl.setVoidCallable(1); 66 67 rsControl.replay(); 68 psControl.replay(); 69 } 70 71 public void testClobStringTypeHandler() throws Exception { 72 lobHandler.getClobAsString(rs, 1); 73 lobHandlerControl.setReturnValue("content", 2); 74 lobCreator.setClobAsString(ps, 1, "content"); 75 lobCreatorControl.setVoidCallable(1); 76 77 lobHandlerControl.replay(); 78 lobCreatorControl.replay(); 79 80 ClobStringTypeHandler type = new ClobStringTypeHandler(lobHandler); 81 assertEquals("content", type.valueOf("content")); 82 assertEquals("content", type.getResult(rs, "column")); 83 assertEquals("content", type.getResult(rs, 1)); 84 85 TransactionSynchronizationManager.initSynchronization(); 86 try { 87 type.setParameter(ps, 1, "content", null); 88 List synchs = TransactionSynchronizationManager.getSynchronizations(); 89 assertEquals(1, synchs.size()); 90 assertTrue(synchs.get(0).getClass().getName().endsWith("LobCreatorSynchronization")); 91 ((TransactionSynchronization) synchs.get(0)).beforeCompletion(); 92 ((TransactionSynchronization) synchs.get(0)).afterCompletion(TransactionSynchronization.STATUS_COMMITTED); 93 } 94 finally { 95 TransactionSynchronizationManager.clearSynchronization(); 96 } 97 } 98 99 public void testClobStringTypeWithSynchronizedConnection() throws Exception { 100 DataSource dsTarget = new DriverManagerDataSource(); 101 DataSource ds = new LazyConnectionDataSourceProxy(dsTarget); 102 103 lobHandler.getClobAsString(rs, 1); 104 lobHandlerControl.setReturnValue("content", 2); 105 lobCreator.setClobAsString(ps, 1, "content"); 106 lobCreatorControl.setVoidCallable(1); 107 108 lobHandlerControl.replay(); 109 lobCreatorControl.replay(); 110 111 ClobStringTypeHandler type = new ClobStringTypeHandler(lobHandler); 112 assertEquals("content", type.valueOf("content")); 113 assertEquals("content", type.getResult(rs, "column")); 114 assertEquals("content", type.getResult(rs, 1)); 115 116 TransactionSynchronizationManager.initSynchronization(); 117 try { 118 DataSourceUtils.getConnection(ds); 119 type.setParameter(ps, 1, "content", null); 120 List synchs = TransactionSynchronizationManager.getSynchronizations(); 121 assertEquals(2, synchs.size()); 122 assertTrue(synchs.get(0).getClass().getName().endsWith("LobCreatorSynchronization")); 123 ((TransactionSynchronization) synchs.get(0)).beforeCompletion(); 124 ((TransactionSynchronization) synchs.get(0)).afterCompletion(TransactionSynchronization.STATUS_COMMITTED); 125 ((TransactionSynchronization) synchs.get(1)).beforeCompletion(); 126 ((TransactionSynchronization) synchs.get(1)).afterCompletion(TransactionSynchronization.STATUS_COMMITTED); 127 } 128 finally { 129 TransactionSynchronizationManager.clearSynchronization(); 130 } 131 } 132 133 public void testBlobByteArrayType() throws Exception { 134 byte[] content = "content".getBytes(); 135 lobHandler.getBlobAsBytes(rs, 1); 136 lobHandlerControl.setReturnValue(content, 2); 137 lobCreator.setBlobAsBytes(ps, 1, content); 138 lobCreatorControl.setVoidCallable(1); 139 140 lobHandlerControl.replay(); 141 lobCreatorControl.replay(); 142 143 BlobByteArrayTypeHandler type = new BlobByteArrayTypeHandler(lobHandler); 144 assertTrue(Arrays.equals(content, (byte[]) type.valueOf("content"))); 145 assertEquals(content, type.getResult(rs, "column")); 146 assertEquals(content, type.getResult(rs, 1)); 147 148 TransactionSynchronizationManager.initSynchronization(); 149 try { 150 type.setParameter(ps, 1, content, null); 151 List synchs = TransactionSynchronizationManager.getSynchronizations(); 152 assertEquals(1, synchs.size()); 153 ((TransactionSynchronization) synchs.get(0)).beforeCompletion(); 154 ((TransactionSynchronization) synchs.get(0)).afterCompletion(TransactionSynchronization.STATUS_COMMITTED); 155 } 156 finally { 157 TransactionSynchronizationManager.clearSynchronization(); 158 } 159 } 160 161 public void testBlobSerializableType() throws Exception { 162 ByteArrayOutputStream baos = new ByteArrayOutputStream (); 163 ObjectOutputStream oos = new ObjectOutputStream (baos); 164 oos.writeObject("content"); 165 oos.close(); 166 167 lobHandler.getBlobAsBinaryStream(rs, 1); 168 lobHandlerControl.setReturnValue(new ByteArrayInputStream (baos.toByteArray()), 1); 169 lobHandler.getBlobAsBinaryStream(rs, 1); 170 lobHandlerControl.setReturnValue(new ByteArrayInputStream (baos.toByteArray()), 1); 171 lobCreator.setBlobAsBytes(ps, 1, baos.toByteArray()); 172 lobCreatorControl.setMatcher(new ArgumentsMatcher() { 173 public boolean matches(Object [] o1, Object [] o2) { 174 return Arrays.equals((byte[]) o1[2], (byte[]) o2[2]); 175 } 176 public String toString(Object [] objects) { 177 return null; 178 } 179 }); 180 181 lobHandlerControl.replay(); 182 lobCreatorControl.replay(); 183 184 BlobSerializableTypeHandler type = new BlobSerializableTypeHandler(lobHandler); 185 assertEquals("content", type.valueOf("content")); 186 assertEquals("content", type.getResult(rs, "column")); 187 assertEquals("content", type.getResult(rs, 1)); 188 189 TransactionSynchronizationManager.initSynchronization(); 190 try { 191 type.setParameter(ps, 1, "content", null); 192 List synchs = TransactionSynchronizationManager.getSynchronizations(); 193 assertEquals(1, synchs.size()); 194 ((TransactionSynchronization) synchs.get(0)).beforeCompletion(); 195 ((TransactionSynchronization) synchs.get(0)).afterCompletion(TransactionSynchronization.STATUS_COMMITTED); 196 } 197 finally { 198 TransactionSynchronizationManager.clearSynchronization(); 199 } 200 } 201 202 public void testBlobSerializableTypeWithNull() throws Exception { 203 lobHandler.getBlobAsBinaryStream(rs, 1); 204 lobHandlerControl.setReturnValue(null, 2); 205 lobCreator.setBlobAsBytes(ps, 1, null); 206 207 lobHandlerControl.replay(); 208 lobCreatorControl.replay(); 209 210 BlobSerializableTypeHandler type = new BlobSerializableTypeHandler(lobHandler); 211 assertEquals(null, type.valueOf(null)); 212 assertEquals(null, type.getResult(rs, "column")); 213 assertEquals(null, type.getResult(rs, 1)); 214 215 TransactionSynchronizationManager.initSynchronization(); 216 try { 217 type.setParameter(ps, 1, null, null); 218 List synchs = TransactionSynchronizationManager.getSynchronizations(); 219 assertEquals(1, synchs.size()); 220 ((TransactionSynchronization) synchs.get(0)).beforeCompletion(); 221 } 222 finally { 223 TransactionSynchronizationManager.clearSynchronization(); 224 } 225 } 226 227 protected void tearDown() { 228 try { 229 rsControl.verify(); 230 psControl.verify(); 231 lobHandlerControl.verify(); 232 lobCreatorControl.verify(); 233 } 234 catch (IllegalStateException ex) { 235 } 237 assertTrue(TransactionSynchronizationManager.getResourceMap().isEmpty()); 238 assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); 239 } 240 241 } 242 | Popular Tags |