From 02486b9d4c26aa8fac1180a6c71ae507b5cfc426 Mon Sep 17 00:00:00 2001 From: maverickstuder Date: Tue, 26 Mar 2024 17:18:15 +0100 Subject: [PATCH] added annotation EnableMongoLiquibase so that services using the dependency can enable the liquibase support by choice --- .../config/_MultiTenantMongoDBFactory.java | 103 ++++++++++++++++++ .../liquibase/EnableMongoLiquibase.java | 13 +++ .../EnableMongoLiquibaseCondition.java | 18 +++ .../liquibase/MongoLiquibaseConfig.java | 2 + .../liquibase/MongoTenantCreatedListener.java | 2 + 5 files changed, 138 insertions(+) create mode 100644 src/main/java/com/knecon/fforesight/mongo/database/commons/config/_MultiTenantMongoDBFactory.java create mode 100644 src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/EnableMongoLiquibase.java create mode 100644 src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/EnableMongoLiquibaseCondition.java diff --git a/src/main/java/com/knecon/fforesight/mongo/database/commons/config/_MultiTenantMongoDBFactory.java b/src/main/java/com/knecon/fforesight/mongo/database/commons/config/_MultiTenantMongoDBFactory.java new file mode 100644 index 0000000..c8e7c53 --- /dev/null +++ b/src/main/java/com/knecon/fforesight/mongo/database/commons/config/_MultiTenantMongoDBFactory.java @@ -0,0 +1,103 @@ +package com.knecon.fforesight.mongo.database.commons.config; + +import java.util.Optional; + +import org.bson.codecs.Codec; +import org.bson.codecs.configuration.CodecRegistry; +import org.springframework.context.annotation.Configuration; +import org.springframework.dao.DataAccessException; +import org.springframework.dao.support.PersistenceExceptionTranslator; +import org.springframework.data.mongodb.MongoDatabaseFactory; + +import com.knecon.fforesight.mongo.database.commons.service.MongoDataSources; +import com.mongodb.ClientSessionOptions; +import com.mongodb.client.ClientSession; +import com.mongodb.client.MongoDatabase; + +//@Configuration +public class _MultiTenantMongoDBFactory implements MongoDatabaseFactory { + + private final MongoDataSources mongoDataSources; + + + public _MultiTenantMongoDBFactory(MongoDataSources mongoDataSources) { + + + this.mongoDataSources = mongoDataSources; + } + + + @Override + public MongoDatabase getMongoDatabase() throws DataAccessException { + + return mongoDataSources.mongoDatabaseCurrentTenantResolver(); + } + + + @Override + public MongoDatabase getMongoDatabase(String dbName) throws DataAccessException { + + return mongoDataSources.mongoDatabaseCurrentTenantResolver(); + } + + + @Override + public PersistenceExceptionTranslator getExceptionTranslator() { + + return null; + } + + + @Override + public CodecRegistry getCodecRegistry() { + + return MongoDatabaseFactory.super.getCodecRegistry(); + } + + + @Override + public boolean hasCodecFor(Class type) { + + return MongoDatabaseFactory.super.hasCodecFor(type); + } + + + @Override + public Optional> getCodecFor(Class type) { + + return MongoDatabaseFactory.super.getCodecFor(type); + } + + + @Override + public ClientSession getSession(ClientSessionOptions options) { + + return null; + } + + + @Override + public MongoDatabaseFactory withSession(ClientSessionOptions options) { + + return MongoDatabaseFactory.super.withSession(options); + } + + + @Override + public MongoDatabaseFactory withSession(ClientSession session) { + + return null; + } + + + @Override + public boolean isTransactionActive() { + + return MongoDatabaseFactory.super.isTransactionActive(); + } + +} + + + + diff --git a/src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/EnableMongoLiquibase.java b/src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/EnableMongoLiquibase.java new file mode 100644 index 0000000..76762f0 --- /dev/null +++ b/src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/EnableMongoLiquibase.java @@ -0,0 +1,13 @@ +package com.knecon.fforesight.mongo.database.commons.liquibase; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface EnableMongoLiquibase { +} diff --git a/src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/EnableMongoLiquibaseCondition.java b/src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/EnableMongoLiquibaseCondition.java new file mode 100644 index 0000000..f4b9470 --- /dev/null +++ b/src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/EnableMongoLiquibaseCondition.java @@ -0,0 +1,18 @@ +package com.knecon.fforesight.mongo.database.commons.liquibase; + +import java.util.Objects; + +import org.jetbrains.annotations.NotNull; +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +public class EnableMongoLiquibaseCondition implements Condition { + + @Override + public boolean matches(@NotNull ConditionContext context, @NotNull AnnotatedTypeMetadata metadata) { + + return !Objects.requireNonNull(context.getBeanFactory()).getBeansWithAnnotation(EnableMongoLiquibase.class).isEmpty(); + } + +} diff --git a/src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/MongoLiquibaseConfig.java b/src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/MongoLiquibaseConfig.java index 2ff88bc..73edc59 100644 --- a/src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/MongoLiquibaseConfig.java +++ b/src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/MongoLiquibaseConfig.java @@ -4,12 +4,14 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import com.knecon.fforesight.tenantcommons.EncryptionDecryptionService; import com.knecon.fforesight.tenantcommons.TenantProvider; @Configuration +@Conditional(EnableMongoLiquibaseCondition.class) public class MongoLiquibaseConfig { @Bean(name = "tenantMongoLiquibaseProperties") diff --git a/src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/MongoTenantCreatedListener.java b/src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/MongoTenantCreatedListener.java index 46420af..657e499 100644 --- a/src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/MongoTenantCreatedListener.java +++ b/src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/MongoTenantCreatedListener.java @@ -2,6 +2,7 @@ package com.knecon.fforesight.mongo.database.commons.liquibase; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Conditional; import org.springframework.stereotype.Service; import jakarta.annotation.PostConstruct; @@ -12,6 +13,7 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @Service @RequiredArgsConstructor +@Conditional(EnableMongoLiquibaseCondition.class) public class MongoTenantCreatedListener { private final TenantMongoLiquibaseExecutor tenantMongoLiquibaseExecutor;