All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.anwen.mongo.config.Configuration Maven / Gradle / Ivy

There is a newer version: 2.1.6.1
Show newest version
package com.anwen.mongo.config;

import com.anwen.mongo.cache.global.HandlerCache;
import com.anwen.mongo.cache.global.InterceptorCache;
import com.anwen.mongo.cache.global.ListenerCache;
import com.anwen.mongo.cache.global.MongoPlusClientCache;
import com.anwen.mongo.conn.CollectionManager;
import com.anwen.mongo.convert.CollectionNameConvert;
import com.anwen.mongo.domain.InitMongoPlusException;
import com.anwen.mongo.enums.CollectionNameConvertEnum;
import com.anwen.mongo.handlers.DocumentHandler;
import com.anwen.mongo.handlers.MetaObjectHandler;
import com.anwen.mongo.interceptor.Interceptor;
import com.anwen.mongo.listener.BaseListener;
import com.anwen.mongo.listener.Listener;
import com.anwen.mongo.listener.business.BlockAttackInnerListener;
import com.anwen.mongo.listener.business.LogListener;
import com.anwen.mongo.manager.MongoPlusClient;
import com.anwen.mongo.mapper.BaseMapper;
import com.anwen.mongo.mapper.DefaultBaseMapperImpl;
import com.anwen.mongo.mapper.MongoPlusMapMapper;
import com.anwen.mongo.model.BaseProperty;
import com.anwen.mongo.strategy.convert.ConversionService;
import com.anwen.mongo.strategy.convert.ConversionStrategy;
import com.anwen.mongo.toolkit.MongoCollectionUtils;
import com.anwen.mongo.toolkit.StringUtils;
import com.anwen.mongo.toolkit.UrlJoint;
import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.*;
import java.util.stream.Collectors;

/**
 * MongoPlus配置
 *
 * @author JiaChaoYang
 **/
public class Configuration {

    /**
     * MongoDB连接URL
     * @author JiaChaoYang
     * @date 2024/3/19 18:25
    */
    private String url;

    /**
     * 属性配置文件,url和baseProperty存在一个即可
     * @author JiaChaoYang
     * @date 2024/3/19 18:25
    */
    private BaseProperty baseProperty = new BaseProperty();

    /**
     * 集合名称获取策略
     * @author JiaChaoYang
     * @date 2024/3/19 18:25
    */
    private CollectionNameConvert collectionNameConvert = MongoCollectionUtils.build(CollectionNameConvertEnum.ALL_CHAR_LOWERCASE);

    /**
     * 获取一个空的Configuration
     * @author JiaChaoYang
     * @date 2024/3/19 18:26
    */
    public static Configuration builder(){
        return new Configuration();
    }

    /**
     * 设置url
     * @author JiaChaoYang
     * @date 2024/3/19 18:26
    */
    public Configuration connection(String url){
        this.url = url;
        return this;
    }

    /**
     * 设置属性配置文件
     * @author JiaChaoYang
     * @date 2024/3/19 18:26
    */
    public Configuration connection(BaseProperty baseProperty){
        this.baseProperty = baseProperty;
        UrlJoint urlJoint = new UrlJoint(baseProperty);
        return connection(urlJoint.jointMongoUrl());
    }

    /**
     * 配置数据库
     * @param database 数据库 多个库使用逗号隔开
     * @return com.anwen.mongo.config.Configuration
     * @author JiaChaoYang
     * @date 2024/3/19 19:08
    */
    public Configuration database(String database){
        this.baseProperty.setDatabase(database);
        return this;
    }

    /**
     * 设置集合名称获取策略
     * @author JiaChaoYang
     * @date 2024/3/19 18:27
    */
    public Configuration collectionNameConvert(CollectionNameConvertEnum collectionNameConvertEnum){
        this.collectionNameConvert = MongoCollectionUtils.build(collectionNameConvertEnum);
        return this;
    }

    /**
     * 设置转换器
     * @param clazzConversions 转换器类
     * @return com.anwen.mongo.config.Configuration
     * @author JiaChaoYang
     * @date 2024/3/19 18:29
    */
    @SafeVarargs
    public final Configuration convert(Class>... clazzConversions){
        for (Class> clazzConversion : clazzConversions) {
            Type[] genericInterfaces = clazzConversion.getGenericInterfaces();
            for (Type anInterface : genericInterfaces) {
                ParameterizedType parameterizedType = (ParameterizedType) anInterface;
                if (parameterizedType.getRawType().equals(ConversionStrategy.class)){
                    Class clazz = (Class) parameterizedType.getActualTypeArguments()[0];
                    try {
                        ConversionService.appendConversion(clazz,clazzConversion.getDeclaredConstructor().newInstance());
                    } catch (InstantiationException | IllegalAccessException | InvocationTargetException |
                             NoSuchMethodException e) {
                        throw new RuntimeException(e);
                    }
                    break;
                }
            }
        }
        return this;
    }

    /**
     * 设置自动填充
     * @param metaObjectHandler 元数据填充
     * @return com.anwen.mongo.config.Configuration
     * @author JiaChaoYang
     * @date 2024/3/19 18:29
    */
    public Configuration metaObjectHandler(MetaObjectHandler metaObjectHandler){
        HandlerCache.metaObjectHandler = metaObjectHandler;
        return this;
    }

    /**
     * 设置Document处理器
     * @param documentHandler document处理器
     * @return com.anwen.mongo.config.Configuration
     * @author JiaChaoYang
     * @date 2024/3/19 18:30
    */
    public Configuration documentHandler(DocumentHandler documentHandler){
        HandlerCache.documentHandler = documentHandler;
        return this;
    }

    /**
     * 开启日志打印
     * @author JiaChaoYang
     * @date 2024/3/19 18:31
    */
    public Configuration log(){
        ListenerCache.listeners.add(new LogListener());
        return this;
    }

    /**
     * 开启防攻击
     * @author JiaChaoYang
     * @date 2024/3/19 18:31
    */
    public Configuration blockAttackInner(){
        ListenerCache.listeners.add(new BlockAttackInnerListener());
        return this;
    }

    /**
     * 设置监听器
     * @param listeners 监听器
     * @return com.anwen.mongo.config.Configuration
     * @author JiaChaoYang
     * @date 2024/3/19 18:38
    */
    @SafeVarargs
    public final Configuration listener(Class... listeners){
        for (Class listener : listeners) {
            try {
                ListenerCache.listeners.add(listener.getDeclaredConstructor().newInstance());
            } catch (InstantiationException | IllegalAccessException | InvocationTargetException |
                     NoSuchMethodException e) {
                throw new RuntimeException(e);
            }
        }
        return this;
    }

    /**
     * 设置拦截器
     * @param interceptors 拦截器
     * @return com.anwen.mongo.config.Configuration
     * @author JiaChaoYang
     * @date 2024/3/19 18:38
    */
    @SafeVarargs
    public final Configuration interceptor(Class... interceptors){
        for (Class interceptor : interceptors) {
            try {
                InterceptorCache.interceptors.add(interceptor.getDeclaredConstructor().newInstance());
            } catch (InstantiationException | IllegalAccessException | InvocationTargetException |
                     NoSuchMethodException e) {
                throw new RuntimeException(e);
            }
        }
        return this;
    }

    /**
     * 获取MongoPlusClient
     * @author JiaChaoYang
     * @date 2024/3/19 18:38
    */
    public MongoPlusClient getMongoPlusClient(){
        if (StringUtils.isBlank(url)){
            throw new InitMongoPlusException("Connection URL not configured");
        }
        if (StringUtils.isBlank(baseProperty.getDatabase())){
            throw new InitMongoPlusException("Connection database not configured");
        }
        return initMongoPlusClient();
    }

    public MongoPlusClient initMongoPlusClient(){
        return initMongoPlusClient(MongoClients.create(MongoClientSettings.builder()
                .applyConnectionString(new ConnectionString(this.url)).commandListenerList(Collections.singletonList(new BaseListener())).build()),collectionNameConvert,baseProperty);
    }

    public MongoPlusClient initMongoPlusClient(CollectionNameConvert collectionNameConvert){
        return initMongoPlusClient(MongoClients.create(MongoClientSettings.builder()
                .applyConnectionString(new ConnectionString(this.url)).commandListenerList(Collections.singletonList(new BaseListener())).build()),collectionNameConvert,baseProperty);
    }

    public MongoPlusClient initMongoPlusClient(CollectionNameConvert collectionNameConvert,BaseProperty baseProperty){
        return initMongoPlusClient(MongoClients.create(MongoClientSettings.builder()
                .applyConnectionString(new ConnectionString(this.url)).commandListenerList(Collections.singletonList(new BaseListener())).build()),collectionNameConvert,baseProperty);
    }

    public MongoPlusClient initMongoPlusClient(MongoClient mongoClient,CollectionNameConvert collectionNameConvert,BaseProperty baseProperty){
        if (StringUtils.isBlank(baseProperty.getDatabase())){
            throw new InitMongoPlusException("Connection database not configured");
        }
        MongoPlusClient mongoPlusClient = new MongoPlusClient();
        mongoPlusClient.setMongoClient(mongoClient);
        mongoPlusClient.setBaseProperty(baseProperty);
        mongoPlusClient.setCollectionNameConvert(collectionNameConvert);
        List mongoDatabaseList = new ArrayList<>();
        mongoPlusClient.setCollectionManager(new LinkedHashMap(){{
            String database = mongoPlusClient.getBaseProperty().getDatabase();
            Arrays.stream(database.split(",")).collect(Collectors.toList()).forEach(db -> {
                CollectionManager collectionManager = new CollectionManager(mongoPlusClient.getMongoClient(), collectionNameConvert, db);
                MongoDatabase mongoDatabase = mongoPlusClient.getMongoClient().getDatabase(db);
                mongoDatabaseList.add(mongoDatabase);
                put(db,collectionManager);
            });
        }});
        mongoPlusClient.setMongoDatabase(mongoDatabaseList);
        MongoPlusClientCache.mongoPlusClient = mongoPlusClient;
        return mongoPlusClient;
    }

    /**
     * 获取BaseMapper
     * @author JiaChaoYang
     * @date 2024/3/19 18:39
    */
    public BaseMapper getBaseMapper(){
        return new DefaultBaseMapperImpl(getMongoPlusClient());
    }

    public MongoPlusMapMapper getMongoPlusMapMapper(){
        return new MongoPlusMapMapper(getMongoPlusClient());
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy