1 package guru.mikelue.jdut;
2
3 import java.sql.Connection;
4 import java.sql.SQLException;
5 import java.util.Optional;
6 import javax.sql.DataSource;
7
8 import org.slf4j.Logger;
9 import org.slf4j.LoggerFactory;
10
11 import guru.mikelue.jdut.datagrain.DataGrain;
12 import guru.mikelue.jdut.datagrain.DataRow;
13 import guru.mikelue.jdut.decorate.DataGrainDecorator;
14 import guru.mikelue.jdut.decorate.TableSchemaLoadingDecorator;
15 import guru.mikelue.jdut.jdbc.JdbcFunction;
16 import guru.mikelue.jdut.jdbc.function.DbRelease;
17 import guru.mikelue.jdut.operation.DataGrainOperator;
18 import guru.mikelue.jdut.operation.DataRowOperator;
19 import guru.mikelue.jdut.operation.DataRowsOperator;
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 public class DataConductor {
43 private Logger logger = LoggerFactory.getLogger(DataConductor.class);
44 private final DataSource dataSource;
45 private final DataGrainDecorator schemaLoadingDecorator;
46
47
48
49
50
51
52 public DataConductor(DataSource newDataSource)
53 {
54 dataSource = newDataSource;
55 schemaLoadingDecorator = new TableSchemaLoadingDecorator(dataSource);
56 }
57
58
59
60
61
62
63
64
65
66
67
68 public JdbcFunction<Connection, DataGrain> buildJdbcFunction(
69 DataGrain dataGrain, DataGrainOperator operator,
70 DataGrainDecorator decorator
71 ) {
72 return conn -> {
73 DataGrain dataGrainOfSchemaLoaded = dataGrain.decorate(schemaLoadingDecorator);
74
75 if (decorator != null) {
76 dataGrainOfSchemaLoaded = dataGrain.decorate(decorator);
77 }
78
79 return operator.toJdbcFunction(dataGrainOfSchemaLoaded)
80 .asFunction().apply(conn);
81 };
82 }
83
84
85
86
87
88
89
90
91
92 public JdbcFunction<Connection, DataGrain> buildJdbcFunction(
93 DataGrain dataGrain, DataGrainOperator operator
94 ) {
95 return buildJdbcFunction(dataGrain, operator, null);
96 }
97
98
99
100
101
102
103
104
105
106 public DataGrain./../../guru/mikelue/jdut/datagrain/DataGrain.html#DataGrain">DataGrain conduct(DataGrain dataGrain, DataGrainOperator operator)
107 {
108 return conduct(dataGrain, operator, Optional.empty());
109 }
110
111
112
113
114
115
116
117
118
119
120 public DataGrain./../../guru/mikelue/jdut/datagrain/DataGrain.html#DataGrain">DataGrain conduct(DataGrain dataGrain, DataGrainOperator operator, DataGrainDecorator decorator)
121 {
122 return conduct(dataGrain, operator, Optional.of(decorator));
123 }
124
125
126
127
128
129
130
131
132 public DataGrain./../../guru/mikelue/jdut/datagrain/DataGrain.html#DataGrain">DataGrain conduct(DataGrain dataGrain, DataRowsOperator operator)
133 {
134 return conduct(dataGrain, operator.toDataGrainOperator());
135 }
136
137
138
139
140
141
142
143
144
145 public DataGrain./../../guru/mikelue/jdut/datagrain/DataGrain.html#DataGrain">DataGrain conduct(DataGrain dataGrain, DataRowsOperator operator, DataGrainDecorator decorator)
146 {
147 return conduct(dataGrain, operator.toDataGrainOperator(), decorator);
148 }
149
150
151
152
153
154
155
156
157 public DataGrain./../../guru/mikelue/jdut/datagrain/DataGrain.html#DataGrain">DataGrain conduct(DataGrain dataGrain, DataRowOperator operator)
158 {
159 return conduct(dataGrain, operator.toDataGrainOperator());
160 }
161
162
163
164
165
166
167
168
169
170 public DataGrain./../../guru/mikelue/jdut/datagrain/DataGrain.html#DataGrain">DataGrain conduct(DataGrain dataGrain, DataRowOperator operator, DataGrainDecorator decorator)
171 {
172 return conduct(dataGrain, operator.toDataGrainOperator(), decorator);
173 }
174
175 private DataGrain./../../guru/mikelue/jdut/datagrain/DataGrain.html#DataGrain">DataGrain conduct(DataGrain dataGrain, DataGrainOperator operator, Optional<DataGrainDecorator> decorator)
176 {
177 dataGrain = dataGrain.decorate(schemaLoadingDecorator);
178
179 if (decorator.isPresent()) {
180 dataGrain = dataGrain.decorate(decorator.get());
181 }
182
183 return conduct(
184 operator.toJdbcFunction(dataGrain)
185 );
186 }
187
188
189
190
191
192
193
194
195
196 public <T> T conduct(JdbcFunction<Connection, T> jdbcFunction)
197 {
198 try {
199 return jdbcFunction
200 .surroundedBy(
201 f -> conn -> {
202 logger.debug("Put connection to context: [{}]", conn);
203 ConductorContext.setCurrentConnection(conn);
204
205 try {
206 return f.applyJdbc(conn);
207 } finally {
208 logger.debug("Remove connection from context: [{}]", conn);
209 ConductorContext.cleanCurrentConnection();
210 }
211 }
212 )
213 .surroundedBy(DbRelease::autoClose)
214 .applyJdbc(dataSource.getConnection());
215 } catch (SQLException e) {
216 throw new DataConductException(e);
217 }
218 }
219 }