Skip to content

Commit 90eccc1

Browse files
author
hosonishi
committed
Bath系Builderの日本語エラーメッセージの外部化とunchecked警告がでていたのを修正
1 parent 38064cf commit 90eccc1

15 files changed

+125
-82
lines changed

src/main/java/org/seasar/doma/jdbc/builder/BatchBuilder.java

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*/
1616
package org.seasar.doma.jdbc.builder;
1717

18-
import java.util.function.Function;
18+
import java.util.function.Supplier;
1919
import java.util.Map;
2020
import java.util.HashMap;
2121
import java.util.List;
@@ -34,24 +34,24 @@
3434
* @author bakenezumi
3535
* @since 2.14.0
3636
*/
37-
public abstract class BatchBuilder<Q extends SqlBatchModifyQuery> {
37+
public abstract class BatchBuilder {
3838

3939
final BatchBuildingHelper helper;
4040

41-
final Q query;
41+
final SqlBatchModifyQuery query;
4242

4343
final ParamIndex paramIndex;
4444

4545
final Map<Integer, String> paramNameMap;
4646

47-
BatchBuilder(Q query) {
47+
BatchBuilder(SqlBatchModifyQuery query) {
4848
this.helper = new BatchBuildingHelper();
4949
this.query = query;
5050
this.paramIndex = new ParamIndex();
5151
paramNameMap = new HashMap<>();
5252
}
5353

54-
BatchBuilder(BatchBuildingHelper builder, Q query,
54+
BatchBuilder(BatchBuildingHelper builder, SqlBatchModifyQuery query,
5555
ParamIndex paramIndex, Map<Integer, String> paramNameMap) {
5656
this.helper = builder;
5757
this.query = query;
@@ -146,12 +146,12 @@ private void prepare() {
146146
query.prepare();
147147
}
148148

149-
int[] execute(Function<Q, BatchModifyCommand> commandBuilder) {
149+
int[] execute(Supplier<BatchModifyCommand> commandFactory) {
150150
if (query.getMethodName() == null) {
151151
query.setCallerMethodName("execute");
152152
}
153153
prepare();
154-
BatchModifyCommand command = commandBuilder.apply(query);
154+
BatchModifyCommand command = commandFactory.get();
155155
int[] result = command.execute();
156156
query.complete();
157157
return result;
@@ -165,13 +165,13 @@ List<? extends Sql<?>> getSqls() {
165165
return query.getSqls();
166166
}
167167

168-
private static class InitialBatchBuilder<Q extends SqlBatchModifyQuery> extends BatchBuilder<Q> {
168+
private static class InitialBatchBuilder extends BatchBuilder {
169169

170-
private InitialBatchBuilder(Q query) {
170+
private InitialBatchBuilder(SqlBatchModifyQuery query) {
171171
super(query);
172172
}
173173

174-
private InitialBatchBuilder(BatchBuildingHelper builder, Q query,
174+
private InitialBatchBuilder(BatchBuildingHelper builder, SqlBatchModifyQuery query,
175175
ParamIndex paramIndex, Map<Integer, String> paramNameMap) {
176176
super(builder, query, paramIndex, paramNameMap);
177177
}
@@ -193,7 +193,7 @@ public BatchBuilder removeLast() {
193193

194194
@Override
195195
<P> BatchBuilder appendParam(Class<P> paramClass, P param, boolean literal) {
196-
BatchParam batchParam = new BatchParam(paramClass, paramIndex, literal);
196+
BatchParam<P> batchParam = new BatchParam<>(paramClass, paramIndex, literal);
197197
batchParam.add(param);
198198
helper.appendParam(batchParam);
199199
paramNameMap.put(paramIndex.getValue(), batchParam.name);
@@ -203,10 +203,10 @@ <P> BatchBuilder appendParam(Class<P> paramClass, P param, boolean literal) {
203203

204204
}
205205

206-
private static class SubsequentBatchBuilder<Q extends SqlBatchModifyQuery> extends InitialBatchBuilder<Q> {
206+
private static class SubsequentBatchBuilder extends InitialBatchBuilder {
207207

208208
SubsequentBatchBuilder(BatchBuildingHelper builder,
209-
Q query, ParamIndex paramIndex,
209+
SqlBatchModifyQuery query, ParamIndex paramIndex,
210210
Map<Integer, String> paramNameMap) {
211211
super(builder, query, paramIndex, paramNameMap);
212212
}
@@ -221,9 +221,9 @@ public BatchBuilder sql(String sql) {
221221
}
222222
}
223223

224-
private static class FixedBatchBuilder<Q extends SqlBatchModifyQuery> extends BatchBuilder<Q> {
224+
private static class FixedBatchBuilder extends BatchBuilder {
225225

226-
private FixedBatchBuilder(BatchBuildingHelper builder, Q query, Map<Integer, String> paramNameMap) {
226+
private FixedBatchBuilder(BatchBuildingHelper builder, SqlBatchModifyQuery query, Map<Integer, String> paramNameMap) {
227227
super(builder, query, new ParamIndex(), paramNameMap);
228228
}
229229

@@ -238,26 +238,34 @@ public BatchBuilder removeLast() {
238238
}
239239

240240
@Override
241-
<P> BatchBuilder appendParam(Class<P> paramClass, P param, boolean literal) {
241+
<P extends Object> BatchBuilder appendParam(Class<P> paramClass, P param, boolean literal) {
242242
final String paramName = paramNameMap.get(paramIndex.getValue());
243243
if (paramName == null) {
244244
throw new JdbcException(Message.DOMA2231);
245245
}
246-
BatchParam batchParam = helper.getParam(paramName);
246+
final BatchParam<?> batchParam = helper.getParam(paramName);
247+
248+
if (literal != batchParam.literal) {
249+
throw new JdbcException(Message.DOMA2230);
250+
}
247251
if (paramClass != batchParam.paramClass) {
248-
// BatchParamの初期値が型:Object、値:nullの場合に限り型の上書きを許可
252+
// BatchParamの初期値が型:Object、値:nullの場合に限り型を上書き
249253
if (batchParam.paramClass == Object.class) {
250-
batchParam = new BatchParam(batchParam, paramClass);
251-
helper.modifyParam(batchParam);
252-
} else if (param != null || paramClass != Object.class) {
254+
final BatchParam<P> newBatchParam = new BatchParam<P>(batchParam, paramClass);
255+
newBatchParam.add(param);
256+
helper.modifyParam(newBatchParam);
257+
} else if (param == null && paramClass == Object.class) {
253258
// 型違いは型:Object、値:nullの場合のみ許可
254-
throw new JdbcException(Message.DOMA2229);
259+
batchParam.add(null);
260+
} else {
261+
throw new JdbcException(Message.DOMA2229);
255262
}
263+
} else {
264+
// paramClass == batchParam.paramClass であるため下記キャストは常に安全
265+
@SuppressWarnings("unchecked")
266+
final BatchParam<P> castedBatchParam = (BatchParam<P>) batchParam;
267+
castedBatchParam.add(param);
256268
}
257-
if (literal != batchParam.literal) {
258-
throw new JdbcException(Message.DOMA2230);
259-
}
260-
batchParam.add(param);
261269
paramIndex.increment();
262270
return this;
263271
}

src/main/java/org/seasar/doma/jdbc/builder/BatchBuildingHelper.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,12 @@ void appendSqlWithLineSeparator(String sql) {
5353
}
5454
}
5555

56-
void appendParam(BatchParam param) {
56+
void appendParam(BatchParam<?> param) {
5757
paramIndexMap.put(param.name, items.size());
5858
items.add(Item.param(param));
5959
}
6060

61-
void modifyParam(BatchParam param) {
61+
void modifyParam(BatchParam<?> param) {
6262
int index = paramIndexMap.get(param.name);
6363
items.set(index, Item.param(param));
6464
}
@@ -69,12 +69,12 @@ void removeLast() {
6969
}
7070
}
7171

72-
BatchParam getParam(String paramName) {
72+
BatchParam<?> getParam(String paramName) {
7373
return items.get(paramIndexMap.get(paramName)).param;
7474
}
7575

76-
List<BatchParam> getParams() {
77-
List<BatchParam> results = new ArrayList<BatchParam>();
76+
Iterable<BatchParam<?>> getParams() {
77+
List<BatchParam<?>> results = new ArrayList<>();
7878
for (Item item : items) {
7979
if (item.kind == ItemKind.PARAM) {
8080
results.add(item.param);
@@ -113,7 +113,7 @@ private static class Item {
113113

114114
private String sql;
115115

116-
private BatchParam param;
116+
private BatchParam<?> param;
117117

118118
public static Item sql(String sql) {
119119
Item item = new Item();
@@ -122,7 +122,7 @@ public static Item sql(String sql) {
122122
return item;
123123
}
124124

125-
public static Item param(BatchParam param) {
125+
public static Item param(BatchParam<?> param) {
126126
Item item = new Item();
127127
item.kind = ItemKind.PARAM;
128128
item.param = param;

src/main/java/org/seasar/doma/jdbc/builder/BatchDeleteExecutor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,12 +200,12 @@ public <P> int[] execute(Iterable<P> params, BiConsumer<P, BatchBuilder> buildCo
200200
if (query.getMethodName() == null) {
201201
query.setCallerMethodName("execute");
202202
}
203-
BatchBuilder<SqlBatchDeleteQuery> builder = BatchBuilder.newInstance(query);
203+
BatchBuilder builder = BatchBuilder.newInstance(query);
204204
for (P p : params) {
205205
buildConsumer.accept(p, builder);
206206
builder = builder.fixSql();
207207
}
208-
return builder.execute((q) -> new BatchDeleteCommand(q));
208+
return builder.execute(() -> new BatchDeleteCommand(query));
209209
}
210210

211211
/**

src/main/java/org/seasar/doma/jdbc/builder/BatchInsertExecutor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,12 +203,12 @@ public <P> int[] execute(Iterable<P> params, BiConsumer<P, BatchBuilder> buildCo
203203
if (query.getMethodName() == null) {
204204
query.setCallerMethodName("execute");
205205
}
206-
BatchBuilder<SqlBatchInsertQuery> builder = BatchBuilder.newInstance(query);
206+
BatchBuilder builder = BatchBuilder.newInstance(query);
207207
for (P p : params) {
208208
buildConsumer.accept(p, builder);
209209
builder = builder.fixSql();
210210
}
211-
return builder.execute((q) -> new BatchInsertCommand(q));
211+
return builder.execute(() -> new BatchInsertCommand(query));
212212
}
213213

214214
/**

src/main/java/org/seasar/doma/jdbc/builder/BatchParam.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.seasar.doma.jdbc.builder;
1717

18+
import static org.seasar.doma.internal.util.AssertionUtil.assertEquals;
1819
import static org.seasar.doma.internal.util.AssertionUtil.assertNull;
1920

2021
import java.util.List;
@@ -40,7 +41,8 @@ class BatchParam<P> {
4041
this.literal = literal;
4142
}
4243

43-
BatchParam(BatchParam<Object> baseParam, Class<P> paramClass) {
44+
BatchParam(BatchParam<?> baseParam, Class<P> paramClass) {
45+
assertEquals(Object.class, baseParam.paramClass);
4446
this.name = baseParam.name;
4547
this.paramClass = paramClass;
4648
this.literal = baseParam.literal;

src/main/java/org/seasar/doma/jdbc/builder/BatchUpdateExecutor.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,15 @@
5959
* <pre>
6060
* update Emp
6161
* set
62-
* name = 'SMIHT',
62+
* name = 'SMITH',
6363
* salary = 1000
6464
* where
6565
* id = 10
6666
*
6767
* update Emp
6868
* set
69-
* name = 'SMIHT',
70-
* ALLEN = 2000
69+
* name = 'ALLEN',
70+
* salary = 2000
7171
* where
7272
* id = 20
7373
* </pre>
@@ -206,12 +206,12 @@ public <P> int[] execute(Iterable<P> params, BiConsumer<P, BatchBuilder> buildCo
206206
if (query.getMethodName() == null) {
207207
query.setCallerMethodName("execute");
208208
}
209-
BatchBuilder<SqlBatchUpdateQuery> builder = BatchBuilder.newInstance(query);
209+
BatchBuilder builder = BatchBuilder.newInstance(query);
210210
for (P p : params) {
211211
buildConsumer.accept(p, builder);
212212
builder = builder.fixSql();
213213
}
214-
return builder.execute((q) -> new BatchUpdateCommand(q));
214+
return builder.execute(() -> new BatchUpdateCommand(query));
215215
}
216216

217217
/**

src/main/java/org/seasar/doma/jdbc/builder/MapBatchInsertBuilder.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,12 @@ public int[] execute(Iterable<? extends Map<String, Object>> parameter) {
125125
throw new DomaNullPointerException("parameter");
126126
}
127127
if (!parameter.iterator().hasNext() || parameter.iterator().next() == null) {
128-
throw new DomaIllegalArgumentException("parameter", "要素が空です");
128+
throw new JdbcException(Message.DOMA2232);
129129
}
130130
if (executor.getMethodName() == null) {
131131
executor.callerMethodName("execute");
132132
}
133-
final Set<String> keySet = new LinkedHashSet(parameter.iterator().next().keySet());
133+
final Set<String> keySet = new LinkedHashSet<>(parameter.iterator().next().keySet());
134134
final int keySetSize = keySet.size();
135135
return executor.execute(parameter, (map, builder) -> {
136136
if (keySetSize != map.size()) {
@@ -144,14 +144,17 @@ public int[] execute(Iterable<? extends Map<String, Object>> parameter) {
144144
builder.sql("values (");
145145
keySet.forEach(key -> {
146146
if (!map.containsKey(key)) {
147-
throw new DomaIllegalArgumentException("parameter",
148-
"要素Mapのキーに " + key + " が含まれていないものがあります");
147+
throw new JdbcException(Message.DOMA2233, key);
149148
}
150149
Object value = map.get(key);
151150
if (value == null) {
152-
builder.param(Object.class, value).sql(", ");
151+
builder.param(Object.class, null).sql(", ");
153152
} else {
154-
builder.param(((Class<Object>) value.getClass()), value).sql(", ");
153+
// 静的な型指定が行えないためObjectにキャストしている
154+
// BatchBuilder内で下記clazzを利用した型チェックが行われているため安全である
155+
@SuppressWarnings("unchecked")
156+
Class<Object> clazz = (Class<Object>) value.getClass();
157+
builder.param(clazz, value).sql(", ");
155158
}
156159
});
157160
builder.removeLast().sql(")");

src/main/java/org/seasar/doma/jdbc/builder/MapInsertBuilder.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
*
3838
* <pre>
3939
* MapInsertBuilder builder = MapInsertBuilder.newInstance(config, "Emp");
40-
* builder.execute(new LinkedHashMap(){{
40+
* builder.execute(new LinkedHashMap&lt;String, Object&gt;(){{
4141
* put("name", "SMITH");
4242
* put("salary", 1000)
4343
* }});
@@ -120,7 +120,11 @@ public int execute(Map<String, Object> parameter) {
120120
if (value == null) {
121121
builder.sql("NULL").sql(", ");
122122
} else {
123-
builder.param(((Class<Object>) value.getClass()), value).sql(", ");
123+
// 静的な型指定が行えないためObjectにキャストしている
124+
// BatchBuilder内で下記clazzを利用した型チェックが行われているため安全である
125+
@SuppressWarnings("unchecked")
126+
final Class<Object> clazz = (Class<Object>) value.getClass();
127+
builder.param(clazz, value).sql(", ");
124128
}
125129
});
126130
builder.removeLast().sql(")");

src/main/java/org/seasar/doma/jdbc/query/SqlBatchModifyQuery.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,10 @@ public void setSqlNode(SqlNode sqlNode) {
105105
this.sqlNode = sqlNode;
106106
}
107107

108-
public void addParameter(String name, Class<?> type, Iterable<Object> values) {
108+
public void addParameter(String name, Class<?> type, List<?> values) {
109109
assertNotNull(name, type);
110110
assertNotNull(values);
111-
List valueList = new ArrayList<Value>();
111+
List<Value> valueList = new ArrayList<>();
112112
for (Object value : values) {
113113
valueList.add(new Value(type, value));
114114
}

src/main/java/org/seasar/doma/message/Message.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ public enum Message implements MessageResource {
168168
DOMA2229("パラメータの型が異なります。バッチ実行されるクエリは全て同一でなければいけません。"),
169169
DOMA2230("パラメータなのかリテラルなのかは動的に変更できません。バッチ実行されるクエリは全て同一でなければいけません。"),
170170
DOMA2231("パラメータの数が異なります。バッチ実行されるクエリは全て同一でなければいけません。"),
171+
DOMA2232("パラメータの要素が空です。"),
172+
DOMA2233("要素Mapのキーに[{0}]が含まれていないものがあります。"),
171173

172174
// expression
173175
DOMA3001("式[{0}]の評価に失敗しました([{1}]番目の文字付近)。クラス[{2}]のメソッド[{3}]の実行に失敗しました。原因は次のものです。{4}"),

0 commit comments

Comments
 (0)