Skip to content

Commit 598f726

Browse files
committed
Merge pull request #55 from backpaper0/get-listener-from-config
EntityListenerをConfig.getEntityListener()で取得するようにしました
2 parents 4d81dc5 + 37cd5bd commit 598f726

33 files changed

+858
-71
lines changed

docs/sources/config.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,16 @@ SELECT時のフェッチサイズをあらわす ``int`` を ``getFetchSize``
218218
この値は :doc:`query/batch-insert` 、:doc:`query/batch-update` 、:doc:`query/batch-delete`
219219
においてデフォルト値として使われます。
220220

221+
エンティティリスナーの取得
222+
--------------------------
223+
224+
``EntityListener`` を ``getEntityListener`` メソッドで返して下さい。
225+
``getEntityListener`` メソッドは ``EntityListener`` 実装クラスの ``Class`` と ``EntityListener`` 実装クラスのインスタンスを返す ``Supplier``
226+
を引数に取り、デフォルトの実装では ``Supplier.get`` メソッドを実行して得たインスタンスを返します。
227+
228+
``EntityListener`` 実装クラスのインスタンスをDIコンテナから取得したいなど、
229+
インスタンス取得方法をカスタマイズする場合は設定してください。
230+
221231
JDBC ドライバのロード
222232
=====================
223233

src/main/java/org/seasar/doma/internal/RuntimeConfig.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,15 @@
1717

1818
import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull;
1919

20+
import java.util.function.Supplier;
21+
2022
import javax.sql.DataSource;
2123

2224
import org.seasar.doma.jdbc.ClassHelper;
2325
import org.seasar.doma.jdbc.CommandImplementors;
2426
import org.seasar.doma.jdbc.Commenter;
2527
import org.seasar.doma.jdbc.Config;
28+
import org.seasar.doma.jdbc.ConfigException;
2629
import org.seasar.doma.jdbc.JdbcLogger;
2730
import org.seasar.doma.jdbc.MapKeyNaming;
2831
import org.seasar.doma.jdbc.QueryImplementors;
@@ -31,6 +34,7 @@
3134
import org.seasar.doma.jdbc.SqlLogType;
3235
import org.seasar.doma.jdbc.UnknownColumnHandler;
3336
import org.seasar.doma.jdbc.dialect.Dialect;
37+
import org.seasar.doma.jdbc.entity.EntityListener;
3438
import org.seasar.doma.jdbc.tx.TransactionManager;
3539

3640
/**
@@ -144,4 +148,16 @@ public int getBatchSize() {
144148
return config.getBatchSize();
145149
}
146150

151+
@Override
152+
public <ENTITY, LISTENER extends EntityListener<ENTITY>> LISTENER getEntityListener(
153+
Class<LISTENER> listenerClass, Supplier<LISTENER> listenerSupplier) {
154+
LISTENER listener = config.getEntityListener(listenerClass,
155+
listenerSupplier);
156+
if (listener == null) {
157+
throw new ConfigException(config.getClass().getName(),
158+
"getEntityListener");
159+
}
160+
return listener;
161+
}
162+
147163
}

src/main/java/org/seasar/doma/internal/apt/EntityTypeGenerator.java

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ protected void printClass() {
104104
printFields();
105105
printConstructor();
106106
printMethods();
107+
printListenerHolder();
107108
unindent();
108109
iprint("}%n");
109110
}
@@ -113,7 +114,7 @@ protected void printFields() {
113114
printOriginalStatesAccessorField();
114115
printIdGeneratorField();
115116
printPropertyTypeFields();
116-
printListenerField();
117+
printListenerSupplierField();
117118
printNamingTypeField();
118119
printImmutableField();
119120
printCatalogNameField();
@@ -262,14 +263,14 @@ protected void printPropertyTypeFields() {
262263
}
263264
}
264265

265-
protected void printListenerField() {
266+
protected void printListenerSupplierField() {
266267
if (entityMeta.isGenericEntityListener()) {
267-
iprint("private final %1$s<%2$s> __listener;%n", entityMeta
268-
.getEntityListenerElement().getQualifiedName(),
268+
iprint("private final java.util.function.Supplier<%1$s<%2$s>> __listenerSupplier;%n",
269+
entityMeta.getEntityListenerElement().getQualifiedName(),
269270
entityMeta.getEntityTypeName());
270271
} else {
271-
iprint("private final %1$s __listener;%n", entityMeta
272-
.getEntityListenerElement().getQualifiedName());
272+
iprint("private final java.util.function.Supplier<%1$s> __listenerSupplier;%n",
273+
entityMeta.getEntityListenerElement().getQualifiedName());
273274
}
274275
print("%n");
275276
}
@@ -332,14 +333,7 @@ protected void printEntityPropertyTypeMapField() {
332333

333334
protected void printConstructor() {
334335
iprint("private %1$s() {%n", simpleName);
335-
if (entityMeta.isGenericEntityListener()) {
336-
iprint(" __listener = new %1$s<%2$s>();%n", entityMeta
337-
.getEntityListenerElement().getQualifiedName(),
338-
entityMeta.getEntityTypeName());
339-
} else {
340-
iprint(" __listener = new %1$s();%n", entityMeta
341-
.getEntityListenerElement().getQualifiedName());
342-
}
336+
iprint(" __listenerSupplier = () -> ListenerHolder.listener;%n");
343337
iprint(" __namingType = %1$s.%2$s;%n", NamingType.class.getName(),
344338
entityMeta.getNamingType().name());
345339
iprint(" __immutable = %1$s;%n", entityMeta.isImmutable());
@@ -458,60 +452,72 @@ protected void printIsQuoteRequiredMethod() {
458452
}
459453

460454
protected void printPreInsertMethod() {
455+
iprint("@SuppressWarnings({\"rawtypes\", \"unchecked\"})%n");
461456
iprint("@Override%n");
462457
iprint("public void preInsert(%1$s entity, %2$s<%1$s> context) {%n",
463458
entityMeta.getEntityTypeName(),
464459
PreInsertContext.class.getName());
460+
printDeclareListener();
465461
iprint(" __listener.preInsert(entity, context);%n");
466462
iprint("}%n");
467463
print("%n");
468464
}
469465

470466
protected void printPreUpdateMethod() {
467+
iprint("@SuppressWarnings({\"rawtypes\", \"unchecked\"})%n");
471468
iprint("@Override%n");
472469
iprint("public void preUpdate(%1$s entity, %2$s<%1$s> context) {%n",
473470
entityMeta.getEntityTypeName(),
474471
PreUpdateContext.class.getName());
472+
printDeclareListener();
475473
iprint(" __listener.preUpdate(entity, context);%n");
476474
iprint("}%n");
477475
print("%n");
478476
}
479477

480478
protected void printPreDeleteMethod() {
479+
iprint("@SuppressWarnings({\"rawtypes\", \"unchecked\"})%n");
481480
iprint("@Override%n");
482481
iprint("public void preDelete(%1$s entity, %2$s<%1$s> context) {%n",
483482
entityMeta.getEntityTypeName(),
484483
PreDeleteContext.class.getName());
484+
printDeclareListener();
485485
iprint(" __listener.preDelete(entity, context);%n");
486486
iprint("}%n");
487487
print("%n");
488488
}
489489

490490
protected void printPostInsertMethod() {
491+
iprint("@SuppressWarnings({\"rawtypes\", \"unchecked\"})%n");
491492
iprint("@Override%n");
492493
iprint("public void postInsert(%1$s entity, %2$s<%1$s> context) {%n",
493494
entityMeta.getEntityTypeName(),
494495
PostInsertContext.class.getName());
496+
printDeclareListener();
495497
iprint(" __listener.postInsert(entity, context);%n");
496498
iprint("}%n");
497499
print("%n");
498500
}
499501

500502
protected void printPostUpdateMethod() {
503+
iprint("@SuppressWarnings({\"rawtypes\", \"unchecked\"})%n");
501504
iprint("@Override%n");
502505
iprint("public void postUpdate(%1$s entity, %2$s<%1$s> context) {%n",
503506
entityMeta.getEntityTypeName(),
504507
PostUpdateContext.class.getName());
508+
printDeclareListener();
505509
iprint(" __listener.postUpdate(entity, context);%n");
506510
iprint("}%n");
507511
print("%n");
508512
}
509513

510514
protected void printPostDeleteMethod() {
515+
iprint("@SuppressWarnings({\"rawtypes\", \"unchecked\"})%n");
511516
iprint("@Override%n");
512517
iprint("public void postDelete(%1$s entity, %2$s<%1$s> context) {%n",
513518
entityMeta.getEntityTypeName(),
514519
PostDeleteContext.class.getName());
520+
printDeclareListener();
515521
iprint(" __listener.postDelete(entity, context);%n");
516522
iprint("}%n");
517523
print("%n");
@@ -699,6 +705,27 @@ protected void printNewInstanceMethod() {
699705
print("%n");
700706
}
701707

708+
protected void printListenerHolder() {
709+
iprint("private static class ListenerHolder {%n");
710+
if (entityMeta.isGenericEntityListener()) {
711+
iprint(" private static %1$s<%2$s> listener = new %1$s<>();%n",
712+
entityMeta.getEntityListenerElement().getQualifiedName(),
713+
entityMeta.getEntityTypeName());
714+
} else {
715+
iprint(" private static %1$s listener = new %1$s();%n",
716+
entityMeta.getEntityListenerElement().getQualifiedName());
717+
}
718+
iprint("}%n");
719+
print("%n");
720+
}
721+
722+
private void printDeclareListener() {
723+
iprint(" Class __listenerClass = %1$s.class;%n", entityMeta
724+
.getEntityListenerElement().getQualifiedName());
725+
iprint(" %1$s __listener = context.getConfig().getEntityListener(__listenerClass, __listenerSupplier);%n",
726+
entityMeta.getEntityListenerElement().getQualifiedName());
727+
}
728+
702729
protected class IdGeneratorGenerator implements
703730
IdGeneratorMetaVisitor<Void, Void> {
704731

@@ -807,4 +834,4 @@ public Void visitDomainCtType(DomainCtType domainCtType, Void p)
807834
}
808835
}
809836

810-
}
837+
}

src/main/java/org/seasar/doma/jdbc/Config.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@
1717

1818
import java.sql.PreparedStatement;
1919
import java.sql.Statement;
20+
import java.util.function.Supplier;
2021

2122
import javax.sql.DataSource;
2223

2324
import org.seasar.doma.DomaIllegalArgumentException;
2425
import org.seasar.doma.jdbc.command.Command;
2526
import org.seasar.doma.jdbc.dialect.Dialect;
27+
import org.seasar.doma.jdbc.entity.EntityListener;
2628
import org.seasar.doma.jdbc.query.Query;
2729
import org.seasar.doma.jdbc.tx.TransactionManager;
2830
import org.seasar.doma.message.Message;
@@ -228,6 +230,29 @@ default int getBatchSize() {
228230
return 0;
229231
}
230232

233+
/**
234+
* {@link EntityListener} のインスタンスを取得します。
235+
* <p>
236+
* デフォルトの実装では単純に {@link Supplier#get()} を実行して取得したインスタンスを返します。
237+
*
238+
* {@link EntityListener} をDIコンテナで管理したい場合などはこのメソッドをオーバーライドし、
239+
* DIコンテナから取得したインスタンスを返すようにしてください。
240+
*
241+
* @param listenerClass
242+
* {@link EntityListener} の実装クラス
243+
* @param listenerSupplier
244+
* {@link EntityListener} のインスタンスを返す {@link Supplier}
245+
* @param <ENTITY>
246+
* エンティティの型
247+
* @param <LISTENER>
248+
* リスナーの型
249+
* @return {@link EntityListener} のインスタンス
250+
*/
251+
default <ENTITY, LISTENER extends EntityListener<ENTITY>> LISTENER getEntityListener(
252+
Class<LISTENER> listenerClass, Supplier<LISTENER> listenerSupplier) {
253+
return listenerSupplier.get();
254+
}
255+
231256
/**
232257
* {@link ConfigProvider} から {@link Config} を取得します。
233258
*
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
/*
2+
* Copyright 2004-2010 the Seasar Foundation and the Others.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13+
* either express or implied. See the License for the specific language
14+
* governing permissions and limitations under the License.
15+
*/
16+
package org.seasar.doma.internal;
17+
18+
import java.util.function.Supplier;
19+
20+
import javax.sql.DataSource;
21+
22+
import junit.framework.TestCase;
23+
24+
import org.seasar.doma.jdbc.Config;
25+
import org.seasar.doma.jdbc.ConfigException;
26+
import org.seasar.doma.jdbc.SimpleDataSource;
27+
import org.seasar.doma.jdbc.dialect.Dialect;
28+
import org.seasar.doma.jdbc.dialect.StandardDialect;
29+
import org.seasar.doma.jdbc.entity.EntityListener;
30+
31+
/**
32+
* @author backpaper0
33+
*
34+
*/
35+
public class RuntimeConfigTest extends TestCase {
36+
37+
public void testGetEntityListener() throws Exception {
38+
Config originalConfig = new MockConfig() {
39+
40+
@Override
41+
public <ENTITY, LISTENER extends EntityListener<ENTITY>> LISTENER getEntityListener(
42+
Class<LISTENER> listenerClass,
43+
Supplier<LISTENER> listenerSupplier) {
44+
return listenerSupplier.get();
45+
}
46+
};
47+
48+
RuntimeConfig runtimeConfig = new RuntimeConfig(originalConfig);
49+
50+
MockEntityListener entityListener = runtimeConfig.getEntityListener(
51+
MockEntityListener.class, MockEntityListener::new);
52+
assertNotNull(entityListener);
53+
}
54+
55+
public void testGetEntityListenerNullCheck() throws Exception {
56+
Config originalConfig = new MockConfig() {
57+
58+
@Override
59+
public <ENTITY, LISTENER extends EntityListener<ENTITY>> LISTENER getEntityListener(
60+
Class<LISTENER> listenerClass,
61+
Supplier<LISTENER> listenerSupplier) {
62+
return null;
63+
}
64+
};
65+
66+
RuntimeConfig runtimeConfig = new RuntimeConfig(originalConfig);
67+
68+
try {
69+
runtimeConfig.getEntityListener(MockEntityListener.class,
70+
MockEntityListener::new);
71+
fail();
72+
} catch (ConfigException e) {
73+
assertEquals(originalConfig.getClass().getName(), e.getClassName());
74+
assertEquals("getEntityListener", e.getMethodName());
75+
}
76+
}
77+
78+
private interface MockConfig extends Config {
79+
80+
@Override
81+
default Dialect getDialect() {
82+
return new StandardDialect();
83+
}
84+
85+
@Override
86+
default DataSource getDataSource() {
87+
return new SimpleDataSource();
88+
}
89+
}
90+
91+
private static class MockEntityListener implements EntityListener<Object> {
92+
}
93+
}

0 commit comments

Comments
 (0)