Package org.mule.module.db.internal.config.domain.query

Source Code of org.mule.module.db.internal.config.domain.query.ParameterizedQueryTemplateFactoryBean

/*
* Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/

package org.mule.module.db.internal.config.domain.query;

import static org.apache.commons.collections.CollectionUtils.find;
import org.mule.module.db.internal.domain.param.DefaultInOutQueryParam;
import org.mule.module.db.internal.domain.param.DefaultInputQueryParam;
import org.mule.module.db.internal.domain.param.DefaultOutputQueryParam;
import org.mule.module.db.internal.domain.param.InOutQueryParam;
import org.mule.module.db.internal.domain.param.InputQueryParam;
import org.mule.module.db.internal.domain.param.QueryParam;
import org.mule.module.db.internal.domain.query.QueryTemplate;
import org.mule.module.db.internal.domain.type.DbType;
import org.mule.module.db.internal.domain.type.UnknownDbType;
import org.mule.module.db.internal.parser.QueryTemplateParser;

import java.util.LinkedList;
import java.util.List;

import org.apache.commons.collections.Predicate;
import org.springframework.beans.factory.FactoryBean;

/**
* Creates {@link QueryTemplate} for parameterized queries
*/
public class ParameterizedQueryTemplateFactoryBean implements FactoryBean<QueryTemplate>
{

    private final String sqlText;
    private final List<QueryParam> queryParams;
    private final QueryTemplateParser queryParser;

    public ParameterizedQueryTemplateFactoryBean(String sqlText, List<QueryParam> queryParams, QueryTemplateParser queryParser)
    {
        this.sqlText = sqlText;
        this.queryParams = queryParams;
        this.queryParser = queryParser;
    }

    @Override
    public QueryTemplate getObject() throws Exception
    {
        QueryTemplate queryTemplate = queryParser.parse(sqlText);

        List<QueryParam> resolvedParams = new LinkedList<QueryParam>();

        for (QueryParam templateParam : queryTemplate.getParams())
        {
            QueryParam param = findOverriddenParam(templateParam.getName(), queryParams);

            if (param == null)
            {
                resolvedParams.add(templateParam);
            }
            else
            {
                resolvedParams.add(overrideParam(templateParam, param));
            }
        }

        return new QueryTemplate(queryTemplate.getSqlText(), queryTemplate.getType(), resolvedParams);
    }

    private QueryParam overrideParam(QueryParam templateParam, QueryParam queryParam)
    {
        QueryParam overriddenParam;
        DbType paramType = templateParam.getType();
        if (!(queryParam.getType() instanceof UnknownDbType))
        {
           paramType = queryParam.getType();
        }

        if (queryParam instanceof InOutQueryParam)
        {
            overriddenParam = new DefaultInOutQueryParam(templateParam.getIndex(), paramType, templateParam.getName(), ((InOutQueryParam) queryParam).getValue());
        }
        else if (queryParam instanceof InputQueryParam)
        {
            overriddenParam = new DefaultInputQueryParam(templateParam.getIndex(), paramType, ((InputQueryParam) queryParam).getValue(), templateParam.getName());
        }
        else
        {
            overriddenParam = new DefaultOutputQueryParam(templateParam.getIndex(), paramType, templateParam.getName());
        }

        return overriddenParam;
    }

    private QueryParam findOverriddenParam(final String name, List<QueryParam> queryParams)
    {
        if (name != null)
        {
            return (QueryParam) find(queryParams, new Predicate()
            {
                @Override
                public boolean evaluate(Object object)
                {
                    return name.equals(((QueryParam) object).getName());
                }
            });
        }

        return null;
    }

    @Override
    public Class<?> getObjectType()
    {
        return QueryTemplate.class;
    }

    @Override
    public boolean isSingleton()
    {
        return false;
    }
}
TOP

Related Classes of org.mule.module.db.internal.config.domain.query.ParameterizedQueryTemplateFactoryBean

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.