33
44import com .fasterxml .jackson .databind .ObjectMapper ;
55import com .fasterxml .jackson .databind .node .ObjectNode ;
6- import com .kapeta .spring .cluster .KapetaClusterService ;
7- import com .mongodb .*;
8- import com .mongodb .client .MongoClient ;
9- import com .mongodb .client .MongoClients ;
10- import com .mongodb .client .MongoDatabase ;
6+ import com .kapeta .spring .config .providers .KapetaConfigurationProvider ;
7+ import com .mongodb .ConnectionString ;
8+ import com .mongodb .MongoClientSettings ;
9+ import com .mongodb .MongoCredential ;
1110import lombok .extern .slf4j .Slf4j ;
1211import org .bson .Document ;
1312import org .springframework .beans .factory .annotation .Autowired ;
1413import org .springframework .beans .factory .annotation .Value ;
14+ import org .springframework .boot .autoconfigure .condition .ConditionalOnMissingBean ;
15+ import org .springframework .boot .autoconfigure .mongo .MongoClientSettingsBuilderCustomizer ;
16+ import org .springframework .boot .autoconfigure .mongo .MongoConnectionDetails ;
17+ import org .springframework .boot .autoconfigure .mongo .MongoProperties ;
18+ import org .springframework .boot .autoconfigure .mongo .PropertiesMongoConnectionDetails ;
1519import org .springframework .context .annotation .Bean ;
1620import org .springframework .core .convert .converter .Converter ;
1721import org .springframework .data .convert .ReadingConverter ;
1822import org .springframework .data .convert .WritingConverter ;
1923import org .springframework .data .mongodb .MongoDatabaseFactory ;
20- import org .springframework .data .mongodb .core .MongoTemplate ;
21- import org .springframework .data .mongodb .core .SimpleMongoClientDatabaseFactory ;
22- import org .springframework .data .mongodb .core .convert .*;
23- import org .springframework .data .mongodb .core .mapping .MongoMappingContext ;
24+ import org .springframework .data .mongodb .MongoTransactionManager ;
25+ import org .springframework .data .mongodb .core .convert .MongoCustomConversions ;
2426
2527import java .util .Arrays ;
26- import java .util .Collections ;
2728import java .util .Optional ;
2829
2930/**
@@ -37,7 +38,7 @@ abstract public class AbstractMongoDBConfig {
3738 private static final String PORT_TYPE = "mongodb" ;
3839
3940 @ Autowired
40- private KapetaClusterService kapetaConfigSource ;
41+ private KapetaConfigurationProvider configurationProvider ;
4142
4243 @ Autowired
4344 private ObjectMapper objectMapper ;
@@ -47,120 +48,55 @@ abstract public class AbstractMongoDBConfig {
4748
4849 private final String resourceName ;
4950
50- private String databaseName ;
51-
52- private String dbAuthDB ;
53-
5451 protected AbstractMongoDBConfig (String resourceName ) {
5552 this .resourceName = resourceName ;
5653 }
5754
55+ @ Bean ("mongoInfo" )
56+ public KapetaConfigurationProvider .ResourceInfo mongoInfo () {
57+ return configurationProvider .getResourceInfo (RESOURCE_TYPE , PORT_TYPE , resourceName );
58+ }
5859 @ Bean
59- public MongoClient createClient () {
60- final KapetaClusterService .ResourceInfo mongoInfo = kapetaConfigSource .getResourceInfo (RESOURCE_TYPE , PORT_TYPE , resourceName );
61- Optional <String > dbUsername = Optional .ofNullable (mongoInfo .getCredentials ().get ("username" ));
62- Optional <String > dbPassword = Optional .ofNullable (mongoInfo .getCredentials ().get ("password" ));
63-
64- dbAuthDB = String .valueOf (mongoInfo .getOptions ().getOrDefault ("authdb" , "admin" ));
65- databaseName = String .valueOf (mongoInfo .getOptions ().getOrDefault ("dbName" , resourceName ));
66-
67- ServerAddress serverAddress = new ServerAddress (mongoInfo .getHost (), Integer .parseInt (mongoInfo .getPort ()));
68-
69- log .info ("Connecting to mongodb server: {}:{} for db: {}" , mongoInfo .getHost (), mongoInfo .getPort (), databaseName );
70-
71- MongoClientSettings .Builder options = MongoClientSettings .builder ()
72- .writeConcern (WriteConcern .JOURNALED )
73- .applicationName (applicationName )
74- .applyToClusterSettings (cluster -> {
75- cluster .hosts (Collections .singletonList (serverAddress ));
76- });
77-
78- if (dbUsername .isPresent () &&
79- !dbUsername .get ().trim ().isEmpty ()) {
80- options .credential (
81- MongoCredential .createCredential (
82- dbUsername .get (),
83- dbAuthDB ,
84- dbPassword .orElse ("" ).toCharArray ()
85- )
86- );
87- }
88-
89- return MongoClients .create (options .build ());
60+ public PropertiesMongoConnectionDetails mongoConnectionDetails (KapetaConfigurationProvider .ResourceInfo mongoInfo ) {
61+ String databaseName = String .valueOf (mongoInfo .getOptions ().getOrDefault ("dbName" , resourceName ));
62+ String dbAuthDB = String .valueOf (mongoInfo .getOptions ().getOrDefault ("authdb" , "admin" ));
63+ MongoProperties properties = new MongoProperties ();
64+ properties .setDatabase (databaseName );
65+ properties .setHost (mongoInfo .getHost ());
66+ properties .setPort (Integer .valueOf (mongoInfo .getPort ()));
67+ properties .setUsername (mongoInfo .getCredentials ().get ("username" ));
68+ properties .setPassword (mongoInfo .getCredentials ().getOrDefault ("password" ,"" ).toCharArray ());
69+ properties .setAuthenticationDatabase (dbAuthDB );
70+ properties .setAutoIndexCreation (true );
71+ return new PropertiesMongoConnectionDetails (properties );
9072 }
9173
9274 @ Bean
93- public MongoDatabaseFactory mongoDbFactory (MongoClient mongoClient ) {
94- final SimpleMongoClientDatabaseFactory simpleMongoDbFactory = new SimpleMongoClientDatabaseFactory (mongoClient , databaseName );
95-
96- log .info ("Using mongodb database: {}" , databaseName );
97-
98- return simpleMongoDbFactory ;
75+ public MongoClientSettingsBuilderCustomizer customizer () {
76+ return settings -> settings .applicationName (applicationName );
9977 }
10078
10179 @ Bean
102- public MongoConverter mongoConverter (MongoDatabaseFactory factory ) {
80+ public MongoTransactionManager transactionManager (MongoDatabaseFactory dbFactory ) {
81+ return new MongoTransactionManager (dbFactory );
82+ }
10383
104- DbRefResolver dbRefResolver = new DefaultDbRefResolver (factory );
84+ @ Bean
85+ public MongoCustomConversions objectNodeConverters () {
10586
106- MongoCustomConversions conversions = new MongoCustomConversions (Arrays .asList (
87+ return new MongoCustomConversions (Arrays .asList (
10788 new MongoToJackson (),
10889 new JacksonToMongo ()
10990 ));
110-
111- MongoMappingContext mappingContext = new MongoMappingContext ();
112- mappingContext .setSimpleTypeHolder (conversions .getSimpleTypeHolder ());
113- mappingContext .afterPropertiesSet ();
114-
115- MappingMongoConverter converter = new MappingMongoConverter (dbRefResolver , mappingContext );
116-
117- converter .setCustomConversions (conversions );
118- converter .afterPropertiesSet ();
119-
120- return converter ;
121- }
122-
123- @ Bean
124- public MongoTemplate mongoTemplate (MongoDatabaseFactory factory , MongoConverter mongoConverter ) {
125- return new MongoTemplate (factory , mongoConverter );
12691 }
12792
128- @ Bean ("adminDb" )
129- public MongoDatabase adminDb (MongoTemplate template ) {
130- final MongoDatabase adminDb = template .getMongoDatabaseFactory ().getMongoDatabase (dbAuthDB );
131-
132- enableSharding (adminDb , template );
133-
134- return adminDb ;
135- }
13693
13794 @ Bean ("mongoAuditor" )
13895 public MongoAuditor mongoAuditor () {
13996 return new MongoAuditor ();
14097 }
14198
14299
143- private void enableSharding (MongoDatabase adminDb , MongoTemplate mongoTemplate ) {
144-
145- try {
146-
147- BasicDBObject enableShardingCmd = new BasicDBObject ("enableSharding" , mongoTemplate .getDb ().getName ());
148- adminDb .runCommand (enableShardingCmd );
149- } catch (MongoCommandException ex ) {
150- if (ex .getErrorCode () == -1 ) {
151- log .info ("Sharding already enabled for db: {}" , mongoTemplate .getDb ().getName ());
152- return ;
153- }
154-
155- if (ex .getErrorCode () == 59 ) {
156- log .warn ("Command not found - not connected to cluster (mongos)? [Error: {}] Continuing..." , ex .getErrorMessage ());
157- return ;
158- }
159-
160- throw ex ;
161- }
162- }
163-
164100 @ ReadingConverter
165101 private class MongoToJackson implements Converter <Document , ObjectNode > {
166102
0 commit comments