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

com.talanlabs.mybatis.rsql.configuration.RsqlConfigurationBuilder Maven / Gradle / Ivy

The newest version!
package com.talanlabs.mybatis.rsql.configuration;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.talanlabs.component.IComponent;
import com.talanlabs.mybatis.rsql.engine.EngineContext;
import com.talanlabs.mybatis.rsql.engine.ILikePolicy;
import com.talanlabs.mybatis.rsql.engine.INlsColumnRsqlHandler;
import com.talanlabs.mybatis.rsql.engine.IStringPolicy;
import com.talanlabs.mybatis.rsql.engine.orderby.ComponentSortVisitor;
import com.talanlabs.mybatis.rsql.engine.orderby.registry.DefaultSortDirectionManagerRegistry;
import com.talanlabs.mybatis.rsql.engine.orderby.registry.ISortDirectionManagerRegistry;
import com.talanlabs.mybatis.rsql.engine.policy.DefaultLikePolicy;
import com.talanlabs.mybatis.rsql.engine.policy.NothingStringPolicy;
import com.talanlabs.mybatis.rsql.engine.where.ComponentRsqlVisitor;
import com.talanlabs.mybatis.rsql.engine.where.registry.DefaultComparisonOperatorManagerRegistry;
import com.talanlabs.mybatis.rsql.engine.where.registry.IComparisonOperatorManagerRegistry;
import com.talanlabs.mybatis.rsql.sort.SortParser;
import com.talanlabs.mybatis.rsql.statement.IPageStatementFactory;
import com.talanlabs.rtext.Rtext;
import com.talanlabs.rtext.configuration.RtextConfigurationBuilder;
import cz.jirutka.rsql.parser.RSQLParser;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.util.concurrent.ExecutionException;

public class RsqlConfigurationBuilder {

    private RsqlConfigurationImpl rsqlConfiguration;

    private RsqlConfigurationBuilder() {
        super();

        this.rsqlConfiguration = new RsqlConfigurationImpl();
    }

    public static RsqlConfigurationBuilder newBuilder() {
        return new RsqlConfigurationBuilder();
    }

    /**
     * Rtext
     *
     * @param rtext Rtext
     */
    public RsqlConfigurationBuilder rtext(Rtext rtext) {
        this.rsqlConfiguration.rtext = rtext;
        return this;
    }

    public RsqlConfigurationBuilder nlsColumnRsqlHandler(INlsColumnRsqlHandler nlsColumnRsqlHandler) {
        this.rsqlConfiguration.nlsColumnRsqlHandler = nlsColumnRsqlHandler;
        return this;
    }

    /**
     * Rsql parser
     *
     * @param rsqlParser a parser
     */
    public RsqlConfigurationBuilder rsqlParser(RSQLParser rsqlParser) {
        this.rsqlConfiguration.rsqlParser = rsqlParser;
        return this;
    }

    /**
     * Sort parser
     *
     * @param sortParser a parser
     */
    public RsqlConfigurationBuilder sortParser(SortParser sortParser) {
        this.rsqlConfiguration.sortParser = sortParser;
        return this;
    }

    /**
     * A comparison operator manager registry
     *
     * @param comparisonOperatorManagerRegistry a comparison operator registry
     */
    public RsqlConfigurationBuilder comparisonOperatorManagerRegistry(IComparisonOperatorManagerRegistry comparisonOperatorManagerRegistry) {
        this.rsqlConfiguration.comparisonOperatorManagerRegistry = comparisonOperatorManagerRegistry;
        return this;
    }

    /**
     * A sort direction manager registry
     *
     * @param sortDirectionManagerRegistry a sort direction registry
     */
    public RsqlConfigurationBuilder sortDirectionManagerRegistry(ISortDirectionManagerRegistry sortDirectionManagerRegistry) {
        this.rsqlConfiguration.sortDirectionManagerRegistry = sortDirectionManagerRegistry;
        return this;
    }

    /**
     * @param defaultTableName a table name
     */
    public RsqlConfigurationBuilder defaultTableName(String defaultTableName) {
        this.rsqlConfiguration.defaultTableName = defaultTableName;
        return this;
    }

    /**
     * @param defaultJoinPrefix a join prefix name
     */
    public RsqlConfigurationBuilder defaultJoinPrefix(String defaultJoinPrefix) {
        this.rsqlConfiguration.defaultJoinPrefix = defaultJoinPrefix;
        return this;
    }

    /**
     * @param defaultParamPrefix a param name prefix
     */
    public RsqlConfigurationBuilder defaultParamPrefix(String defaultParamPrefix) {
        this.rsqlConfiguration.defaultParamPrefix = defaultParamPrefix;
        return this;
    }

    /**
     * @param stringPolicy a string policy
     */
    public RsqlConfigurationBuilder stringPolicy(IStringPolicy stringPolicy) {
        this.rsqlConfiguration.stringPolicy = stringPolicy;
        return this;
    }

    /**
     * @param likePolicy a like policy (default %)
     */
    public RsqlConfigurationBuilder likePolicy(ILikePolicy likePolicy) {
        this.rsqlConfiguration.likePolicy = likePolicy;
        return this;
    }

    public RsqlConfigurationBuilder pageStatementFactory(IPageStatementFactory pageStatementFactory) {
        this.rsqlConfiguration.pageStatementFactory = pageStatementFactory;
        return this;
    }

    public IRsqlConfiguration build() {
        if (rsqlConfiguration.comparisonOperatorManagerRegistry == null) {
            rsqlConfiguration.comparisonOperatorManagerRegistry = new DefaultComparisonOperatorManagerRegistry(rsqlConfiguration);
        }
        if (rsqlConfiguration.sortDirectionManagerRegistry == null) {
            rsqlConfiguration.sortDirectionManagerRegistry = new DefaultSortDirectionManagerRegistry(rsqlConfiguration);
        }
        return rsqlConfiguration;
    }

    private static class RsqlConfigurationImpl implements IRsqlConfiguration {

        private static final Logger LOG = LogManager.getLogger(RsqlConfigurationImpl.class);

        private Rtext rtext;
        private INlsColumnRsqlHandler nlsColumnRsqlHandler;
        private RSQLParser rsqlParser;
        private SortParser sortParser;
        private IComparisonOperatorManagerRegistry comparisonOperatorManagerRegistry;
        private ISortDirectionManagerRegistry sortDirectionManagerRegistry;
        private String defaultTableName = "t";
        private String defaultJoinPrefix = "j";
        private String defaultParamPrefix = "";
        private IStringPolicy stringPolicy;
        private ILikePolicy likePolicy;
        private IPageStatementFactory pageStatementFactory;

        private Cache, ComponentRsqlVisitor> rsqlCache = CacheBuilder.newBuilder().build();
        private Cache, ComponentSortVisitor> sortCache = CacheBuilder.newBuilder().build();

        private RsqlConfigurationImpl() {
            super();

            this.rtext = new Rtext(RtextConfigurationBuilder.newBuilder().build());
            this.rsqlParser = new RSQLParser();
            this.sortParser = new SortParser();
            this.stringPolicy = new NothingStringPolicy();
            this.likePolicy = new DefaultLikePolicy();
        }

        @Override
        public Rtext getRtext() {
            return rtext;
        }

        @Override
        public INlsColumnRsqlHandler getNlsColumnRsqlHandler() {
            return this.nlsColumnRsqlHandler;
        }

        @Override
        public  ComponentRsqlVisitor getComponentRsqlVisitor(Class componentClass) {
            try {
                //noinspection unchecked
                return (ComponentRsqlVisitor) rsqlCache.get(componentClass, () -> new ComponentRsqlVisitor<>(componentClass, comparisonOperatorManagerRegistry));
            } catch (ExecutionException e) {
                LOG.error("Failed to get visitor", e);
            }
            return null;
        }

        @Override
        public  ComponentSortVisitor getComponentSortVisitor(Class componentClass) {
            try {
                //noinspection unchecked
                return (ComponentSortVisitor) sortCache.get(componentClass, () -> new ComponentSortVisitor<>(componentClass, sortDirectionManagerRegistry));
            } catch (ExecutionException e) {
                LOG.error("Failed to get visitor", e);
            }
            return null;
        }

        @Override
        public RSQLParser getRsqlParser() {
            return rsqlParser;
        }

        @Override
        public SortParser getSortParser() {
            return sortParser;
        }

        @Override
        public EngineContext newEngineContext() {
            return EngineContext.newBulder().defaultTablePrefix(defaultTableName).defaultJoinPrefix(defaultJoinPrefix).defaultParamPrefix(defaultParamPrefix).build();
        }

        @Override
        public IStringPolicy getStringPolicy() {
            return stringPolicy;
        }

        @Override
        public ILikePolicy getLikePolicy() {
            return likePolicy;
        }

        @Override
        public IPageStatementFactory getPageStatementFactory() {
            return pageStatementFactory;
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy