1 package com.atlassian.sal.spring.connection;
2
3 import io.atlassian.fugue.Option;
4 import com.atlassian.sal.api.rdbms.ConnectionCallback;
5 import com.atlassian.sal.spi.HostConnectionAccessor;
6 import org.springframework.transaction.PlatformTransactionManager;
7 import org.springframework.transaction.TransactionDefinition;
8 import org.springframework.transaction.support.DefaultTransactionDefinition;
9 import org.springframework.transaction.support.TransactionCallback;
10 import org.springframework.transaction.support.TransactionTemplate;
11
12 import javax.annotation.Nonnull;
13 import java.sql.Connection;
14
15
16
17
18
19
20
21
22
23
24 public class SpringHostConnectionAccessor implements HostConnectionAccessor {
25
26 private final ConnectionProvider connectionProvider;
27
28 private final PlatformTransactionManager transactionManager;
29
30 public SpringHostConnectionAccessor(@Nonnull final ConnectionProvider connectionProvider, @Nonnull final PlatformTransactionManager transactionManager) {
31 this.connectionProvider = connectionProvider;
32 this.transactionManager = transactionManager;
33 }
34
35 @Override
36 public <A> A execute(final boolean readOnly, final boolean newTransaction, @Nonnull final ConnectionCallback<A> callback) {
37
38 final DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
39 transactionDefinition.setName("SALSpringTx");
40 transactionDefinition.setReadOnly(readOnly);
41 transactionDefinition.setPropagationBehavior(newTransaction
42 ? TransactionDefinition.PROPAGATION_REQUIRES_NEW : TransactionDefinition.PROPAGATION_REQUIRED);
43
44
45 final TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager, transactionDefinition);
46
47
48
49 return (A) transactionTemplate.execute((TransactionCallback) status -> {
50
51
52 final Connection connection = connectionProvider.getConnection();
53
54
55 return callback.execute(connection);
56 });
57 }
58
59 @Nonnull
60 @Override
61 public Option<String> getSchemaName() {
62 return connectionProvider.getSchemaName();
63 }
64
65
66
67
68 public interface ConnectionProvider {
69
70
71
72
73
74
75
76
77
78
79
80 @Nonnull
81 Connection getConnection();
82
83
84
85
86
87
88
89
90 @Nonnull
91 Option<String> getSchemaName();
92 }
93 }