• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

future-architect / uroborosql / #692

pending completion
#692

push

HidekiSugimoto189
Added output judgment for log output arguments that are string processed

53 of 53 new or added lines in 6 files covered. (100.0%)

7895 of 8761 relevant lines covered (90.12%)

0.9 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

92.55
/src/main/java/jp/co/future/uroborosql/UroboroSQL.java
1
/**
2
 * Copyright (c) 2017-present, Future Corporation
3
 *
4
 * This source code is licensed under the MIT license found in the
5
 * LICENSE file in the root directory of this source tree.
6
 */
7
package jp.co.future.uroborosql;
8

9
import java.sql.Connection;
10
import java.time.Clock;
11
import java.util.ServiceLoader;
12
import java.util.stream.StreamSupport;
13

14
import javax.sql.DataSource;
15

16
import org.slf4j.Logger;
17
import org.slf4j.LoggerFactory;
18

19
import jp.co.future.uroborosql.config.SqlConfig;
20
import jp.co.future.uroborosql.connection.ConnectionContext;
21
import jp.co.future.uroborosql.connection.ConnectionContextBuilder;
22
import jp.co.future.uroborosql.connection.ConnectionSupplier;
23
import jp.co.future.uroborosql.connection.DataSourceConnectionSupplierImpl;
24
import jp.co.future.uroborosql.connection.DefaultConnectionSupplierImpl;
25
import jp.co.future.uroborosql.connection.JdbcConnectionSupplierImpl;
26
import jp.co.future.uroborosql.context.SqlContext;
27
import jp.co.future.uroborosql.context.SqlContextFactory;
28
import jp.co.future.uroborosql.context.SqlContextFactoryImpl;
29
import jp.co.future.uroborosql.dialect.DefaultDialect;
30
import jp.co.future.uroborosql.dialect.Dialect;
31
import jp.co.future.uroborosql.expr.ExpressionParser;
32
import jp.co.future.uroborosql.expr.ExpressionParserFactory;
33
import jp.co.future.uroborosql.filter.SqlFilterManager;
34
import jp.co.future.uroborosql.filter.SqlFilterManagerImpl;
35
import jp.co.future.uroborosql.mapping.DefaultEntityHandler;
36
import jp.co.future.uroborosql.mapping.EntityHandler;
37
import jp.co.future.uroborosql.store.SqlManager;
38
import jp.co.future.uroborosql.store.SqlManagerImpl;
39

40
/**
41
 * UroboroSQLを利用する際、初めに利用するクラス.
42
 *
43
 * @author H.Sugimoto
44
 * @since v0.4.0
45
 */
46
public final class UroboroSQL {
47
        /** ロガー */
48
        private static final Logger log = LoggerFactory.getLogger(UroboroSQL.class);
1✔
49

50
        private UroboroSQL() {
51
        }
52

53
        /**
54
         * Builderの生成
55
         *
56
         * @return UroboroSQLBuilder
57
         */
58
        public static UroboroSQLBuilder builder() {
59
                return new UroboroSQLBuilder();
1✔
60
        }
61

62
        /**
63
         * DBコネクションを指定してSqlConfigを取得する
64
         *
65
         * @param conn DBコネクション
66
         * @return UroboroSQLBuilder
67
         */
68
        public static UroboroSQLBuilder builder(final Connection conn) {
69
                return builder().setConnectionSupplier(new DefaultConnectionSupplierImpl(conn));
1✔
70
        }
71

72
        /**
73
         * DB接続情報を指定してSqlConfigを取得する
74
         *
75
         * @param url      JDBC接続URL
76
         * @param user     JDBC接続ユーザ
77
         * @param password JDBC接続パスワード
78
         * @return UroboroSQLBuilder
79
         */
80
        public static UroboroSQLBuilder builder(final String url, final String user, final String password) {
81
                return builder().setConnectionSupplier(
1✔
82
                                new JdbcConnectionSupplierImpl(ConnectionContextBuilder.jdbc(url, user, password)));
1✔
83
        }
84

85
        /**
86
         * DB接続情報を指定してSqlConfigを取得する
87
         *
88
         * @param url      JDBC接続URL
89
         * @param user     JDBC接続ユーザ
90
         * @param password JDBC接続パスワード
91
         * @param schema   JDBCスキーマ名
92
         * @return UroboroSQLBuilder
93
         */
94
        public static UroboroSQLBuilder builder(final String url, final String user, final String password,
95
                        final String schema) {
96
                return builder().setConnectionSupplier(
1✔
97
                                new JdbcConnectionSupplierImpl(ConnectionContextBuilder.jdbc(url, user, password, schema)));
1✔
98
        }
99

100
        /**
101
         * データソースを指定してSqlConfigを取得する
102
         *
103
         * @param dataSource データソース
104
         * @return UroboroSQLBuilder
105
         */
106
        public static UroboroSQLBuilder builder(final DataSource dataSource) {
107
                return builder().setConnectionSupplier(new DataSourceConnectionSupplierImpl(dataSource));
1✔
108
        }
109

110
        public static final class UroboroSQLBuilder {
111
                private ConnectionSupplier connectionSupplier;
112
                private SqlManager sqlManager;
113
                private SqlFilterManager sqlFilterManager;
114
                private SqlContextFactory sqlContextFactory;
115
                private SqlAgentFactory sqlAgentFactory;
116
                private EntityHandler<?> entityHandler;
117
                private Clock clock;
118
                private Dialect dialect;
119
                private ExpressionParser expressionParser;
120

121
                UroboroSQLBuilder() {
1✔
122
                        this.connectionSupplier = null;
1✔
123
                        this.sqlManager = new SqlManagerImpl();
1✔
124
                        this.sqlFilterManager = new SqlFilterManagerImpl();
1✔
125
                        this.sqlContextFactory = new SqlContextFactoryImpl();
1✔
126
                        this.sqlAgentFactory = new SqlAgentFactoryImpl();
1✔
127
                        this.entityHandler = new DefaultEntityHandler();
1✔
128
                        this.clock = null;
1✔
129
                        this.dialect = null;
1✔
130
                        this.expressionParser = null;
1✔
131
                }
1✔
132

133
                /**
134
                 * SqlManagerの設定.
135
                 *
136
                 * @param sqlManager sqlManager
137
                 * @return UroboroSQLBuilder
138
                 */
139
                public UroboroSQLBuilder setSqlManager(final SqlManager sqlManager) {
140
                        this.sqlManager = sqlManager;
1✔
141
                        return this;
1✔
142
                }
143

144
                /**
145
                 * SqlFilterManagerの設定.
146
                 *
147
                 * @param sqlFilterManager sqlFilterManager
148
                 * @return UroboroSQLBuilder
149
                 */
150
                public UroboroSQLBuilder setSqlFilterManager(final SqlFilterManager sqlFilterManager) {
151
                        this.sqlFilterManager = sqlFilterManager;
1✔
152
                        return this;
1✔
153
                }
154

155
                /**
156
                 * ConnectionSupplierの設定.
157
                 *
158
                 * @param connectionSupplier connectionSupplier
159
                 * @return UroboroSQLBuilder
160
                 */
161
                public UroboroSQLBuilder setConnectionSupplier(final ConnectionSupplier connectionSupplier) {
162
                        this.connectionSupplier = connectionSupplier;
1✔
163
                        return this;
1✔
164
                }
165

166
                /**
167
                 * SqlContextFactoryの作成.
168
                 *
169
                 * @param sqlContextFactory sqlContextFactory
170
                 * @return UroboroSQLBuilder
171
                 */
172
                public UroboroSQLBuilder setSqlContextFactory(final SqlContextFactory sqlContextFactory) {
173
                        this.sqlContextFactory = sqlContextFactory;
1✔
174
                        return this;
1✔
175
                }
176

177
                /**
178
                 * SqlAgentFactoryの設定.
179
                 *
180
                 * @param sqlAgentFactory sqlAgentFactory
181
                 * @return UroboroSQLBuilder
182
                 */
183
                public UroboroSQLBuilder setSqlAgentFactory(final SqlAgentFactory sqlAgentFactory) {
184
                        this.sqlAgentFactory = sqlAgentFactory;
1✔
185
                        return this;
1✔
186
                }
187

188
                /**
189
                 * EntityHandlerの設定.
190
                 *
191
                 * @param entityHandler entityHandler
192
                 * @return UroboroSQLBuilder
193
                 */
194
                public UroboroSQLBuilder setEntityHandler(final EntityHandler<?> entityHandler) {
195
                        this.entityHandler = entityHandler;
×
196
                        return this;
×
197
                }
198

199
                /**
200
                 * Clockの設定.
201
                 *
202
                 * @param clock clock
203
                 * @return UroboroSQLBuilder
204
                 */
205
                public UroboroSQLBuilder setClock(final Clock clock) {
206
                        this.clock = clock;
1✔
207
                        return this;
1✔
208
                }
209

210
                /**
211
                 * Dialectの設定.
212
                 *
213
                 * @param dialect dialect
214
                 * @return UroboroSQLBuilder
215
                 */
216
                public UroboroSQLBuilder setDialect(final Dialect dialect) {
217
                        this.dialect = dialect;
1✔
218
                        return this;
1✔
219
                }
220

221
                /**
222
                 * ExpressionParserの設定
223
                 *
224
                 * @param expressionParser ExpressionParser
225
                 * @return UroboroSQLBuilder
226
                 */
227
                public UroboroSQLBuilder setExpressionParser(final ExpressionParser expressionParser) {
228
                        this.expressionParser = expressionParser;
1✔
229
                        return this;
1✔
230
                }
231

232
                /**
233
                 * Builderに設定された内容を元にSqlConfigを構築する
234
                 *
235
                 * @return SqlConfig
236
                 */
237
                public SqlConfig build() {
238
                        if (this.connectionSupplier == null) {
1✔
239
                                throw new IllegalStateException(
1✔
240
                                                "ConnectionSupplier is mandatory. Please set ConnectionSupplier instance before calling build() method.");
241
                        }
242

243
                        return new InternalConfig(this.connectionSupplier,
1✔
244
                                        this.sqlManager,
245
                                        this.sqlContextFactory,
246
                                        this.sqlAgentFactory,
247
                                        this.sqlFilterManager,
248
                                        this.entityHandler,
249
                                        this.clock,
250
                                        this.dialect,
251
                                        this.expressionParser);
252
                }
253

254
        }
255

256
        public static final class InternalConfig implements SqlConfig {
257
                /**
258
                 * コネクション提供クラス.
259
                 */
260
                private final ConnectionSupplier connectionSupplier;
261

262
                /**
263
                 * SQL管理クラス.
264
                 */
265
                private final SqlManager sqlManager;
266

267
                /**
268
                 * SqlContextファクトリクラス.
269
                 */
270
                private final SqlContextFactory sqlContextFactory;
271

272
                /**
273
                 * SqlAgentファクトリクラス.
274
                 */
275
                private final SqlAgentFactory sqlAgentFactory;
276

277
                /**
278
                 * SqlFilter管理クラス.
279
                 */
280
                private final SqlFilterManager sqlFilterManager;
281

282
                /**
283
                 * Entityハンドラ.
284
                 */
285
                private final EntityHandler<?> entityHandler;
286

287
                /**
288
                 * Clock.
289
                 */
290
                private final Clock clock;
291

292
                /**
293
                 * Dialect.
294
                 */
295
                private final Dialect dialect;
296

297
                /**
298
                 * ExpressionParser
299
                 */
300
                private final ExpressionParser expressionParser;
301

302
                InternalConfig(final ConnectionSupplier connectionSupplier,
303
                                final SqlManager sqlManager,
304
                                final SqlContextFactory sqlContextFactory,
305
                                final SqlAgentFactory sqlAgentFactory,
306
                                final SqlFilterManager sqlFilterManager,
307
                                final EntityHandler<?> entityHandler,
308
                                final Clock clock,
309
                                final Dialect dialect,
310
                                final ExpressionParser expressionParser) {
1✔
311
                        this.connectionSupplier = connectionSupplier;
1✔
312
                        this.sqlManager = sqlManager;
1✔
313
                        this.sqlContextFactory = sqlContextFactory;
1✔
314
                        this.sqlAgentFactory = sqlAgentFactory;
1✔
315
                        this.sqlFilterManager = sqlFilterManager;
1✔
316
                        this.entityHandler = entityHandler;
1✔
317
                        if (clock == null) {
1✔
318
                                this.clock = Clock.systemDefaultZone();
1✔
319
                        } else {
320
                                this.clock = clock;
1✔
321
                        }
322
                        if (log.isDebugEnabled()) {
1✔
323
                                log.debug("SqlConfig - Clock : " + this.clock.toString() + " has been selected.");
×
324
                        }
325

326
                        if (dialect == null) {
1✔
327
                                this.dialect = StreamSupport.stream(ServiceLoader.load(Dialect.class).spliterator(), false)
1✔
328
                                                .filter(d -> d.accept(this.connectionSupplier)).findFirst().orElseGet(DefaultDialect::new);
1✔
329
                        } else {
330
                                this.dialect = dialect;
1✔
331
                        }
332
                        if (log.isDebugEnabled()) {
1✔
333
                                log.debug("SqlConfig - Dialect : " + this.dialect.getClass().getSimpleName() + " has been selected.");
×
334
                        }
335

336
                        if (expressionParser == null) {
1✔
337
                                ExpressionParserFactory expressionParserFactory = StreamSupport
1✔
338
                                                .stream(ServiceLoader.load(ExpressionParserFactory.class).spliterator(), false)
1✔
339
                                                .filter(e -> e.accept()).findFirst()
1✔
340
                                                .orElseThrow(() -> new IllegalStateException("ExpressionParser not found."));
1✔
341
                                this.expressionParser = expressionParserFactory.create();
1✔
342
                        } else {
1✔
343
                                this.expressionParser = expressionParser;
1✔
344
                        }
345
                        if (log.isDebugEnabled()) {
1✔
346
                                log.debug("SqlConfig - ExpressionParser : " + this.expressionParser.getClass().getSimpleName()
×
347
                                                + " has been selected.");
348
                        }
349

350
                        this.sqlManager.setDialect(this.dialect);
1✔
351
                        this.sqlContextFactory.setSqlConfig(this);
1✔
352
                        this.sqlAgentFactory.setSqlConfig(this);
1✔
353
                        this.expressionParser.setSqlConfig(this);
1✔
354
                        this.entityHandler.setSqlConfig(this);
1✔
355

356
                        this.sqlManager.initialize();
1✔
357
                        this.sqlFilterManager.initialize();
1✔
358
                        this.sqlContextFactory.initialize();
1✔
359
                        this.expressionParser.initialize();
1✔
360
                        this.entityHandler.initialize();
1✔
361
                }
1✔
362

363
                /**
364
                 * {@inheritDoc}
365
                 *
366
                 * @see jp.co.future.uroborosql.config.SqlConfig#context()
367
                 */
368
                @Override
369
                public SqlContext context() {
370
                        return sqlContextFactory.createSqlContext();
1✔
371
                }
372

373
                /**
374
                 * {@inheritDoc}
375
                 *
376
                 * @see jp.co.future.uroborosql.config.SqlConfig#contextFrom(java.lang.String)
377
                 */
378
                @Override
379
                public SqlContext contextFrom(final String sqlName) {
380
                        return sqlContextFactory.createSqlContext().setSqlName(sqlName);
×
381
                }
382

383
                /**
384
                 * {@inheritDoc}
385
                 *
386
                 * @see jp.co.future.uroborosql.config.SqlConfig#contextWith(java.lang.String)
387
                 */
388
                @Override
389
                public SqlContext contextWith(final String sql) {
390
                        return sqlContextFactory.createSqlContext().setSql(sql);
1✔
391
                }
392

393
                /**
394
                 * {@inheritDoc}
395
                 *
396
                 * @see jp.co.future.uroborosql.config.SqlConfig#createAgent()
397
                 */
398
                @Override
399
                @Deprecated
400
                public SqlAgent createAgent() {
401
                        return this.agent();
×
402
                }
403

404
                /**
405
                 * {@inheritDoc}
406
                 *
407
                 * @see jp.co.future.uroborosql.config.SqlConfig#createAgent()
408
                 */
409
                @Override
410
                public SqlAgent agent() {
411
                        return sqlAgentFactory.agent();
1✔
412
                }
413

414
                /**
415
                 * {@inheritDoc}
416
                 *
417
                 * @see jp.co.future.uroborosql.config.SqlConfig#agent(jp.co.future.uroborosql.connection.ConnectionContext)
418
                 */
419
                @Override
420
                public SqlAgent agent(final ConnectionContext connectionContext) {
421
                        return sqlAgentFactory.agent(connectionContext);
1✔
422
                }
423

424
                /**
425
                 * {@inheritDoc}
426
                 *
427
                 * @see jp.co.future.uroborosql.config.SqlConfig#getSqlManager()
428
                 */
429
                @Override
430
                public SqlManager getSqlManager() {
431
                        return sqlManager;
1✔
432
                }
433

434
                /**
435
                 * {@inheritDoc}
436
                 *
437
                 * @see jp.co.future.uroborosql.config.SqlConfig#getSqlFilterManager()
438
                 */
439
                @Override
440
                public SqlFilterManager getSqlFilterManager() {
441
                        return sqlFilterManager;
1✔
442
                }
443

444
                /**
445
                 * {@inheritDoc}
446
                 *
447
                 * @see jp.co.future.uroborosql.config.SqlConfig#getConnectionSupplier()
448
                 */
449
                @Override
450
                public ConnectionSupplier getConnectionSupplier() {
451
                        return connectionSupplier;
1✔
452
                }
453

454
                /**
455
                 * {@inheritDoc}
456
                 *
457
                 * @see jp.co.future.uroborosql.config.SqlConfig#getSqlContextFactory()
458
                 */
459
                @Override
460
                public SqlContextFactory getSqlContextFactory() {
461
                        return sqlContextFactory;
1✔
462
                }
463

464
                /**
465
                 * {@inheritDoc}
466
                 *
467
                 * @see jp.co.future.uroborosql.config.SqlConfig#getSqlAgentFactory()
468
                 */
469
                @Override
470
                public SqlAgentFactory getSqlAgentFactory() {
471
                        return sqlAgentFactory;
1✔
472
                }
473

474
                /**
475
                 * {@inheritDoc}
476
                 *
477
                 * @see jp.co.future.uroborosql.config.SqlConfig#getClock()
478
                 */
479
                @Override
480
                public Clock getClock() {
481
                        return clock;
1✔
482
                }
483

484
                /**
485
                 * {@inheritDoc}
486
                 *
487
                 * @see jp.co.future.uroborosql.config.SqlConfig#getDialect()
488
                 */
489
                @Override
490
                public Dialect getDialect() {
491
                        return dialect;
1✔
492
                }
493

494
                /**
495
                 * {@inheritDoc}
496
                 *
497
                 * @see jp.co.future.uroborosql.config.SqlConfig#getExpressionParser()
498
                 */
499
                @Override
500
                public ExpressionParser getExpressionParser() {
501
                        return expressionParser;
1✔
502
                }
503

504
                /**
505
                 * {@inheritDoc}
506
                 *
507
                 * @see jp.co.future.uroborosql.config.SqlConfig#getEntityHandler()
508
                 */
509
                @Override
510
                public EntityHandler<?> getEntityHandler() {
511
                        return entityHandler;
1✔
512
                }
513
        }
514
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc