11package org .seasar .doma .quarkus .deployment ;
22
33import static io .quarkus .deployment .annotations .ExecutionTime .STATIC_INIT ;
4+ import static java .util .stream .Collectors .toList ;
45
6+ import io .quarkus .agroal .DataSource ;
57import io .quarkus .agroal .deployment .JdbcDataSourceBuildItem ;
68import io .quarkus .arc .deployment .AdditionalBeanBuildItem ;
79import io .quarkus .arc .deployment .BeanArchiveIndexBuildItem ;
810import io .quarkus .arc .deployment .BeanContainerListenerBuildItem ;
911import io .quarkus .arc .deployment .BeanDefiningAnnotationBuildItem ;
12+ import io .quarkus .arc .deployment .SyntheticBeanBuildItem ;
13+ import io .quarkus .deployment .annotations .BuildProducer ;
1014import io .quarkus .deployment .annotations .BuildStep ;
1115import io .quarkus .deployment .annotations .Record ;
1216import io .quarkus .deployment .builditem .ApplicationArchivesBuildItem ;
1721import io .quarkus .deployment .builditem .nativeimage .ReflectiveClassBuildItem ;
1822import java .util .ArrayList ;
1923import java .util .List ;
20- import java .util .Optional ;
24+ import java .util .Objects ;
25+ import java .util .function .Function ;
26+ import java .util .function .Supplier ;
27+ import javax .enterprise .context .Dependent ;
28+ import javax .enterprise .inject .Default ;
2129import org .jboss .jandex .DotName ;
2230import org .seasar .doma .DaoImplementation ;
31+ import org .seasar .doma .jdbc .Config ;
32+ import org .seasar .doma .jdbc .criteria .Entityql ;
33+ import org .seasar .doma .jdbc .criteria .NativeSql ;
34+ import org .seasar .doma .quarkus .runtime .DomaConfig ;
2335import org .seasar .doma .quarkus .runtime .DomaProducer ;
2436import org .seasar .doma .quarkus .runtime .DomaRecorder ;
37+ import org .seasar .doma .quarkus .runtime .DomaSettings ;
2538import org .seasar .doma .quarkus .runtime .JtaRequiresNewController ;
2639import org .seasar .doma .quarkus .runtime .ScriptExecutor ;
2740import org .seasar .doma .quarkus .runtime .UnsupportedTransactionManager ;
@@ -38,7 +51,10 @@ FeatureBuildItem feature() {
3851 @ BuildStep
3952 AdditionalBeanBuildItem additionalBeans () {
4053 return new AdditionalBeanBuildItem (
41- DomaProducer .class , JtaRequiresNewController .class , UnsupportedTransactionManager .class );
54+ DomaProducer .class ,
55+ JtaRequiresNewController .class ,
56+ ScriptExecutor .class ,
57+ UnsupportedTransactionManager .class );
4258 }
4359
4460 @ BuildStep
@@ -59,22 +75,21 @@ DomaSettingsBuildItem domaSettings(
5975 }
6076
6177 @ BuildStep
62- Optional <HotDeploymentWatchedFileBuildItem > hotDeploymentWatchedFile (
63- DomaSettingsBuildItem settings ) {
64- var sqlLoadScript = settings .getSettings ().sqlLoadScript ;
65- if (sqlLoadScript == null ) {
66- return Optional .empty ();
67- }
68- return Optional .of (new HotDeploymentWatchedFileBuildItem (sqlLoadScript ));
78+ List <HotDeploymentWatchedFileBuildItem > hotDeploymentWatchedFile (DomaSettingsBuildItem settings ) {
79+ return settings .getSettings ().dataSources .stream ()
80+ .map (it -> it .sqlLoadScript )
81+ .filter (Objects ::nonNull )
82+ .map (HotDeploymentWatchedFileBuildItem ::new )
83+ .collect (toList ());
6984 }
7085
7186 @ BuildStep
7287 NativeImageResourceBuildItem nativeImageResources (DomaSettingsBuildItem settings ) {
7388 List <String > resources = new ArrayList <>();
74- var sqlLoadScript = settings .getSettings ().sqlLoadScript ;
75- if ( sqlLoadScript != null ) {
76- resources . add ( sqlLoadScript );
77- }
89+ settings .getSettings ().dataSources . stream ()
90+ . map ( it -> it . sqlLoadScript )
91+ . filter ( Objects :: nonNull )
92+ . forEach ( resources :: add );
7893 var scanner = new DomaResourceScanner ();
7994 var scannedResources = scanner .scan ();
8095 resources .addAll (scannedResources );
@@ -94,9 +109,67 @@ ReflectiveClassBuildItem reflectiveClasses(BeanArchiveIndexBuildItem beanArchive
94109
95110 @ BuildStep
96111 @ Record (STATIC_INIT )
97- BeanContainerListenerBuildItem beanContainerListener (
98- DomaRecorder recorder , DomaSettingsBuildItem settings , LaunchModeBuildItem launchMode ) {
99- return new BeanContainerListenerBuildItem (
100- recorder .configure (settings .getSettings (), launchMode .getLaunchMode ()));
112+ void registerBeans (
113+ DomaRecorder recorder ,
114+ LaunchModeBuildItem launchMode ,
115+ DomaSettingsBuildItem settings ,
116+ BuildProducer <BeanContainerListenerBuildItem > beanContainerListeners ,
117+ BuildProducer <SyntheticBeanBuildItem > syntheticBeans ) {
118+
119+ var domaSettings = settings .getSettings ();
120+
121+ beanContainerListeners .produce (
122+ new BeanContainerListenerBuildItem (
123+ recorder .configure (domaSettings , launchMode .getLaunchMode ())));
124+
125+ registerSyntheticBeans (
126+ domaSettings .dataSources ,
127+ syntheticBeans ,
128+ DomaConfig .class ,
129+ Config .class ,
130+ recorder ::configureConfig );
131+
132+ registerSyntheticBeans (
133+ domaSettings .dataSources ,
134+ syntheticBeans ,
135+ Entityql .class ,
136+ Entityql .class ,
137+ recorder ::configureEntityql );
138+
139+ registerSyntheticBeans (
140+ domaSettings .dataSources ,
141+ syntheticBeans ,
142+ NativeSql .class ,
143+ NativeSql .class ,
144+ recorder ::configureNativeSql );
145+ }
146+
147+ private <BEAN > void registerSyntheticBeans (
148+ List <DomaSettings .DataSourceSettings > dataSourceSettingsList ,
149+ BuildProducer <SyntheticBeanBuildItem > syntheticBeans ,
150+ Class <?> implClazz ,
151+ Class <BEAN > typeClazz ,
152+ Function <DomaSettings .DataSourceSettings , Supplier <BEAN >> supplierCreator ) {
153+ dataSourceSettingsList .stream ()
154+ .map (
155+ dataSourceSettings -> {
156+ var configurator =
157+ SyntheticBeanBuildItem .configure (implClazz )
158+ .addType (DotName .createSimple (typeClazz .getName ()))
159+ .scope (Dependent .class )
160+ .unremovable ()
161+ .supplier (supplierCreator .apply (dataSourceSettings ));
162+ if (dataSourceSettings .isDefault ) {
163+ configurator .addQualifier ().annotation (Default .class ).done ();
164+ } else {
165+ configurator
166+ .addQualifier ()
167+ .annotation (DataSource .class )
168+ .addValue ("value" , dataSourceSettings .name )
169+ .done ();
170+ }
171+ return configurator .done ();
172+ })
173+ .forEach (syntheticBeans ::produce );
101174 }
102175}
0 commit comments