1   package org.jencks.samples.outbound;
2   
3   import java.sql.Types;
4   
5   import javax.sql.DataSource;
6   
7   import org.springframework.jdbc.core.JdbcTemplate;
8   import org.springframework.transaction.PlatformTransactionManager;
9   import org.springframework.transaction.TransactionDefinition;
10  import org.springframework.transaction.TransactionStatus;
11  import org.springframework.transaction.support.DefaultTransactionDefinition;
12  
13  public abstract class AbstractJdbcOutboundMessagingTest extends AbstractDependencyInjectionSpringContextTests {
14  
15  	public final static String TEST_FIELD_VALUE="test value";
16  	public final static String INITIAL_FIELD_VALUE="initial value";
17  	public final static int FIELD_ID=1;
18  	
19  	public final static String CREATE_SCHEMA="create table TEST (" +
20  			"TEST_ID bigint generated by default as identity(start with 1)," +
21  			"TEST_VALUE varchar(255)," +
22  			"primary key (TEST_ID))";
23  	public final static String DROP_SCHEMA="drop table TEST";
24  	public final static String POPULATE_SCHEMA="insert into TEST" +
25  			" (TEST_ID,TEST_VALUE) values("+FIELD_ID+",'"+INITIAL_FIELD_VALUE+"')";
26  	
27  	public final static String UPDATE_FIELD_REQUEST="update TEST" +
28  			" set TEST_VALUE=? where TEST_ID=?";
29  	public final static String SELECT_FIELD_REQUEST="select TEST_VALUE" +
30  			" from TEST where TEST_ID=?";
31  	
32  	private DataSource dataSource;
33  	private PlatformTransactionManager transactionManager;
34  	
35  	public PlatformTransactionManager getTransactionManager() {
36  		return transactionManager;
37  	}
38  
39  	public void setTransactionManager(PlatformTransactionManager transactionManager) {
40  		this.transactionManager = transactionManager;
41  	}
42  
43  	public DataSource getDataSource() {
44  		return dataSource;
45  	}
46  
47  	public void setDataSource(DataSource dataSource) {
48  		this.dataSource = dataSource;
49  	}
50  
51  	private void updateDatabase(String ddlRequest) {
52  		JdbcTemplate template=new JdbcTemplate(getDataSource());
53  		template.update(ddlRequest);
54  	}
55  	
56  	protected void onSetUp() throws Exception {
57  		super.onSetUp();
58  		updateDatabase(CREATE_SCHEMA);
59  		updateDatabase(POPULATE_SCHEMA);
60  	}
61  
62  	protected void onTearDown() throws Exception {
63  		super.onTearDown();
64  		updateDatabase(DROP_SCHEMA);
65  	}
66  
67  	private void checkStoredMessage(String message) {
68  		JdbcTemplate template=new JdbcTemplate(getDataSource());
69  		String storedMessage=(String)template.queryForObject(SELECT_FIELD_REQUEST,
70  				new Object[] {new Integer(FIELD_ID)},
71  				new int[] {Types.INTEGER},String.class);
72  		assertEquals(message,storedMessage);
73  	}
74  
75  	public void testOutboundWithCommit() throws Exception {
76  		//Update the field in a JTA transaction
77  		DefaultTransactionDefinition definition=new DefaultTransactionDefinition();
78  		definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
79  		TransactionStatus status=null;
80  		try {
81  			status=transactionManager.getTransaction(definition);
82  			JdbcTemplate template=new JdbcTemplate(getDataSource());
83  			template.update(UPDATE_FIELD_REQUEST,
84  					new Object[] {TEST_FIELD_VALUE,new Integer(FIELD_ID)},
85  					new int[] {Types.VARCHAR,Types.INTEGER});
86  			transactionManager.commit(status);
87  		} catch(Exception ex) {
88  			ex.printStackTrace();
89  			transactionManager.rollback(status);
90  			fail("Undesired exception.");
91  		}
92  
93  		//Check if the message has been stored in the database
94  		checkStoredMessage(TEST_FIELD_VALUE);
95  	}
96  
97  	public void testOutboundWithRollback() throws Exception {
98  		//Update the field in a JTA transaction
99  		DefaultTransactionDefinition definition=new DefaultTransactionDefinition();
100 		definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
101 		TransactionStatus status=null;
102 		try {
103 			status=transactionManager.getTransaction(definition);
104 			JdbcTemplate template=new JdbcTemplate(getDataSource());
105 			template.update(UPDATE_FIELD_REQUEST,
106 					new Object[] {TEST_FIELD_VALUE,new Integer(FIELD_ID)},
107 					new int[] {Types.VARCHAR,Types.INTEGER});
108 			transactionManager.rollback(status);
109 		} catch(Exception ex) {
110 			ex.printStackTrace();
111 			transactionManager.rollback(status);
112 			fail("Undesired exception.");
113 		}
114 
115 		//Check if the message has not been stored in the database
116 		checkStoredMessage(INITIAL_FIELD_VALUE);
117 	}
118 
119 }