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

cool.lazy.cat.orm.api.manager.ApiPojoManagerImpl Maven / Gradle / Ivy

package cool.lazy.cat.orm.api.manager;

import cool.lazy.cat.orm.api.base.anno.ApiPojo;
import cool.lazy.cat.orm.api.base.anno.ApiQueryFilter;
import cool.lazy.cat.orm.api.base.constant.HttpMethod;
import cool.lazy.cat.orm.api.exception.ExistNameSpaceException;
import cool.lazy.cat.orm.api.exception.SamePathApiException;
import cool.lazy.cat.orm.api.manager.subject.ApiPojoSubject;
import cool.lazy.cat.orm.api.manager.subject.ApiQueryFilterInfo;
import cool.lazy.cat.orm.api.web.EntryInfo;
import cool.lazy.cat.orm.core.jdbc.mapping.field.attr.PojoField;
import cool.lazy.cat.orm.core.manager.PojoManager;
import cool.lazy.cat.orm.core.manager.PojoTableManager;
import cool.lazy.cat.orm.core.manager.exception.UnKnowPojoException;
import cool.lazy.cat.orm.core.manager.subject.PojoSubject;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @author: mahao
 * @date: 2021/3/6 08:57
 */
public class ApiPojoManagerImpl implements ApiPojoManager {

    protected Map, ApiPojoSubject> apiPojoSubjectMap;
    protected Map nameSpaceMap;

    @Autowired
    public void initSubject(PojoManager pojoManager, PojoTableManager pojoTableManager) {
        List subjectList = pojoManager.getPojoSubjectList().stream().filter(p -> p.getPojoType().getAnnotation(ApiPojo.class) != null).collect(Collectors.toList());
        apiPojoSubjectMap = new HashMap<>(subjectList.size());
        nameSpaceMap = new HashMap<>(subjectList.size());
        for (PojoSubject subject : subjectList) {
            ApiPojoSubject apiPojoSubject = new ApiPojoSubject(subject.getPojoType());
            //初始化命名空间、api方法
            apiPojoSubject.init(subject.getPojoType().getAnnotation(ApiPojo.class));
            if (nameSpaceMap.containsKey(apiPojoSubject.getNameSpace())) {
                throw new ExistNameSpaceException("已存在的nameSpace:代理类" + apiPojoSubject.getPojoType().getName() + "[value:" + apiPojoSubject.getNameSpace()+ "]");
            }
            // 初始化字段查询条件
            this.initQueryFilter(apiPojoSubject, pojoTableManager.getByPojoType(subject.getPojoType()).getTableInfo().getFieldInfoMap());
            apiPojoSubjectMap.put(apiPojoSubject.getPojoType(), apiPojoSubject);
            nameSpaceMap.put(apiPojoSubject.getNameSpace(), apiPojoSubject);
        }
        this.checkRepeatedCombination();
    }

    /**
     * 检查pojo api路径是否冲突
     */
    private void checkRepeatedCombination() {
        // 以请求路径分组
        Map> allApiFullPathGroup = apiPojoSubjectMap.values().stream().flatMap(s -> s.getEntryInfoList().stream())
                .collect(Collectors.groupingBy(EntryInfo::getFullPath, Collectors.toList()));
        for (Map.Entry> entry : allApiFullPathGroup.entrySet()) {
            // 请求路径下只有一个api 则跳过
            if (entry.getValue().size() == 1) {
                continue;
            }
            ApiPojoSubject tempSubject = null;
            Set methods = new HashSet<>(entry.getValue().size());
            for (EntryInfo entryInfo : entry.getValue()) {
                ApiPojoSubject subject = nameSpaceMap.get(entryInfo.getNameSpace());
                if (null == tempSubject) {
                    tempSubject = subject;
                } else if (tempSubject != subject) {
                    // entryInfo的nameSpace不相等则代表不属于同一个pojo
                    throw new SamePathApiException("重复的api映射:代理类" + subject.getPojoType().getName() + "\t-->\t" + entryInfo.getFullPath() + Arrays.toString(entryInfo.getMethods()));
                }
                for (HttpMethod method : entryInfo.getMethods()) {
                    if (methods.contains(method)) {
                        throw new SamePathApiException("重复的api映射:代理类" + subject.getPojoType().getName() + "\t-->\t" + entryInfo.getFullPath() + Arrays.toString(entryInfo.getMethods()));
                    } else {
                        // 收集所有method
                        methods.add(method);
                    }
                }
            }
        }
    }

    /**
     * 初始字段化查询条件
     * @param apiPojoSubject apiPojo主体
     * @param fieldInfoMap pojo字段映射
     */
    protected void initQueryFilter(ApiPojoSubject apiPojoSubject, Map fieldInfoMap) {
        Map apiQueryFilterInfoMap = new HashMap<>(fieldInfoMap.size());
        for (Map.Entry entry : fieldInfoMap.entrySet()) {
            String key = entry.getKey();
            ApiQueryFilter apiQueryFilter = entry.getValue().getGetter().getAnnotation(ApiQueryFilter.class);
            if (null == apiQueryFilter) {
                continue;
            }
            apiQueryFilterInfoMap.put(key, new ApiQueryFilterInfo(apiQueryFilter));
        }
        if (!apiQueryFilterInfoMap.isEmpty()) {
            apiPojoSubject.setQueryFilterInfoMap(apiQueryFilterInfoMap);
        }
    }

    @Override
    public List getApiPojoSubjectList() {
        return Collections.unmodifiableList(new ArrayList<>(apiPojoSubjectMap.values()));
    }

    @Override
    public ApiPojoSubject getByPojoType(Class pojoType) {
        ApiPojoSubject subject = apiPojoSubjectMap.get(pojoType);
        if (null == subject) {
            throw new UnKnowPojoException("未定义的apiPojo类型:" + pojoType.getName());
        }
        return subject;
    }

    @Override
    public ApiPojoSubject getByNameSpace(String nameSpace) {
        ApiPojoSubject subject = nameSpaceMap.get(nameSpace);
        if (null == subject) {
            throw new UnKnowPojoException("未知的nameSpace:" + nameSpace);
        }
        return subject;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy