1919import org .springframework .beans .BeansException ;
2020import org .springframework .context .ApplicationContext ;
2121import org .springframework .context .ApplicationContextAware ;
22+ import org .springframework .context .ConfigurableApplicationContext ;
2223import org .springframework .data .couchbase .CouchbaseClientFactory ;
2324import org .springframework .data .couchbase .core .convert .CouchbaseConverter ;
2425import org .springframework .data .couchbase .core .convert .translation .JacksonTranslationService ;
2526import org .springframework .data .couchbase .core .convert .translation .TranslationService ;
27+ import org .springframework .data .couchbase .core .index .CouchbasePersistentEntityIndexCreator ;
28+ import org .springframework .data .couchbase .core .mapping .CouchbaseMappingContext ;
29+ import org .springframework .data .couchbase .core .mapping .CouchbasePersistentEntity ;
30+ import org .springframework .data .couchbase .core .mapping .CouchbasePersistentProperty ;
31+ import org .springframework .data .mapping .context .MappingContext ;
32+ import org .springframework .lang .Nullable ;
2633
2734import com .couchbase .client .java .Collection ;
2835
@@ -40,7 +47,9 @@ public class CouchbaseTemplate implements CouchbaseOperations, ApplicationContex
4047 private final CouchbaseClientFactory clientFactory ;
4148 private final CouchbaseConverter converter ;
4249 private final CouchbaseTemplateSupport templateSupport ;
50+ private final MappingContext <? extends CouchbasePersistentEntity <?>, CouchbasePersistentProperty > mappingContext ;
4351 private final ReactiveCouchbaseTemplate reactiveCouchbaseTemplate ;
52+ private @ Nullable CouchbasePersistentEntityIndexCreator indexCreator ;
4453
4554 public CouchbaseTemplate (final CouchbaseClientFactory clientFactory , final CouchbaseConverter converter ) {
4655 this (clientFactory , converter , new JacksonTranslationService ());
@@ -52,6 +61,14 @@ public CouchbaseTemplate(final CouchbaseClientFactory clientFactory, final Couch
5261 this .converter = converter ;
5362 this .templateSupport = new CouchbaseTemplateSupport (converter , translationService );
5463 this .reactiveCouchbaseTemplate = new ReactiveCouchbaseTemplate (clientFactory , converter , translationService );
64+
65+ this .mappingContext = this .converter .getMappingContext ();
66+ if (mappingContext instanceof CouchbaseMappingContext ) {
67+ CouchbaseMappingContext cmc = (CouchbaseMappingContext ) mappingContext ;
68+ if (cmc .isAutoIndexCreation ()) {
69+ indexCreator = new CouchbasePersistentEntityIndexCreator (cmc , this );
70+ }
71+ }
5572 }
5673
5774 @ Override
@@ -140,7 +157,28 @@ public ReactiveCouchbaseTemplate reactive() {
140157
141158 @ Override
142159 public void setApplicationContext (final ApplicationContext applicationContext ) throws BeansException {
160+ prepareIndexCreator (applicationContext );
143161 templateSupport .setApplicationContext (applicationContext );
144162 reactiveCouchbaseTemplate .setApplicationContext (applicationContext );
145163 }
164+
165+ private void prepareIndexCreator (final ApplicationContext context ) {
166+ String [] indexCreators = context .getBeanNamesForType (CouchbasePersistentEntityIndexCreator .class );
167+
168+ for (String creator : indexCreators ) {
169+ CouchbasePersistentEntityIndexCreator creatorBean = context .getBean (creator ,
170+ CouchbasePersistentEntityIndexCreator .class );
171+ if (creatorBean .isIndexCreatorFor (mappingContext )) {
172+ return ;
173+ }
174+ }
175+
176+ if (context instanceof ConfigurableApplicationContext && indexCreator != null ) {
177+ ((ConfigurableApplicationContext ) context ).addApplicationListener (indexCreator );
178+ if (mappingContext instanceof CouchbaseMappingContext ) {
179+ CouchbaseMappingContext cmc = (CouchbaseMappingContext ) mappingContext ;
180+ cmc .setIndexCreator (indexCreator );
181+ }
182+ }
183+ }
146184}
0 commit comments