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

cn.schoolwow.quickflow.service.flowContext.getData.FlowContextGetDataOperationImpl Maven / Gradle / Ivy

package cn.schoolwow.quickflow.service.flowContext.getData;

import cn.schoolwow.quickflow.domain.FlowConfig;
import cn.schoolwow.quickflow.domain.FlowContext;
import cn.schoolwow.quickflow.domain.FlowExecutorConfig;
import cn.schoolwow.quickflow.dto.FlowContextDataRange;
import cn.schoolwow.quickflow.service.flowContext.putData.FlowContextPutDataOperation;
import cn.schoolwow.quickflow.util.QuickFlowUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;

import java.lang.reflect.Array;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class FlowContextGetDataOperationImpl implements FlowContextGetDataOperation {
    private static final FlowContextDataRange[] ranges = new FlowContextDataRange[]{
            FlowContextDataRange.ThreadLocal,
            FlowContextDataRange.CurrentFlow,
            FlowContextDataRange.CurrentCompositeBusiness,
            FlowContextDataRange.Flow,
            FlowContextDataRange.ContextThreadLocal,
            FlowContextDataRange.Context
    };
    private FlowExecutorConfig flowExecutorConfig;
    private FlowContextPutDataOperation flowContextPutDataOperation;

    public FlowContextGetDataOperationImpl(FlowExecutorConfig flowExecutorConfig, FlowContextPutDataOperation flowContextPutDataOperation) {
        this.flowExecutorConfig = flowExecutorConfig;
        this.flowContextPutDataOperation = flowContextPutDataOperation;
    }

    @Override
    public FlowContext isDataNotExist(String key, String message) {
        if(!containKey(key)){
            throw new IllegalArgumentException(message);
        }
        return flowExecutorConfig.flowContext;
    }

    @Override
    public boolean containKey(String key) {
        Object value = getData(key);
        return null!=value;
    }

    @Override
    public boolean containInstanceKey(Class clazz) {
        Object value = getInstanceData(clazz);
        return null!=value;
    }

    @Override
    public Object checkData(String key) {
        Object value = getData(key);
        checkValueEmpty(key, value);
        return value;
    }

    @Override
    public  T checkData(String key, Class clazz) {
        T value = getData(key, clazz);
        checkValueEmpty(key, value);
        return value;
    }

    @Override
    public  T checkData(String key, TypeReference typeReference) {
        T value = getData(key, typeReference);
        checkValueEmpty(key, value);
        return value;
    }

    @Override
    public  T checkInstanceData(Class clazz) {
        String key = clazz.getName();
        T value = getData(key, clazz);
        checkValueEmpty(key, value);
        return value;
    }

    @Override
    public Object getData(String key) {
        for(FlowContextDataRange flowContextDataRange:ranges){
            Object value = getDataFromRange(key, flowContextDataRange);
            if(null!=value){
                return value;
            }
        }
        return null;
    }

    @Override
    public  T getData(String key, Class clazz) {
        Object value = getData(key);
        return QuickFlowUtil.convertToClassType(value, clazz);
    }

    @Override
    public  T getData(String key, TypeReference typeReference) {
        Object value = getData(key);
        if(value instanceof JSONObject){
            JSONObject object = (JSONObject) value;
            return object.toJavaObject(typeReference);
        }
        if(value instanceof JSONArray){
            JSONArray array = (JSONArray) value;
            return array.toJavaObject(typeReference);
        }
        return (T) value;
    }

    @Override
    public Object getData(String key, Object defaultValue) {
        Object value = getData(key);
        if(null==value){
            flowContextPutDataOperation.putTemporaryData(key, defaultValue);
            return defaultValue;
        }else{
            return value;
        }
    }

    @Override
    public  T getData(String key, Class clazz, T defaultValue) {
        T value = getData(key, clazz);
        if(null==value){
            flowContextPutDataOperation.putTemporaryData(key, defaultValue);
            return defaultValue;
        }else{
            return value;
        }
    }

    @Override
    public  T getInstanceData(Class clazz) {
        String key = clazz.getName();
        return getData(key, clazz);
    }

    @Override
    public  T getInstanceData(Class clazz, T defaultValue) {
        String key = clazz.getName();
        return getData(key, clazz, defaultValue);
    }

    @Override
    public Map getContextDataMap() {
        Map filterDataMap = new HashMap<>();

        FlowConfig flowConfig = flowExecutorConfig.flowExecutorRootConfig.flowConfig;
        Map dataMap = flowConfig.flowConfigDataContext.dataMap;
        filterDataMap.putAll(dataMap);
        removeEntryByKeySet(filterDataMap, flowConfig.flowConfigDataContext.flowContextDataKeySet.temporaryDataKeySet);
        return filterDataMap;
    }

    @Override
    public Map getFlowConfigDataMap() {
        Map filterDataMap = new HashMap<>();

        Map dataMap = flowExecutorConfig.flowExecutorRootConfig.dataMap;
        addEntryByKeySet(filterDataMap, dataMap, flowExecutorConfig.flowExecutorRootConfig.flowContextDataKeySet.flowConfigDataKeySet);
        return filterDataMap;
    }

    @Override
    public Map getFlowExecuteDataMap() {
        Map filterDataMap = new HashMap<>();

        Map dataMap = flowExecutorConfig.flowExecutorRootConfig.dataMap;
        filterDataMap.putAll(dataMap);
        Map threadLocalDataMap = flowExecutorConfig.flowExecutorRootConfig.threadLocalDataMap.get();
        if(null!=threadLocalDataMap){
            filterDataMap.putAll(threadLocalDataMap);
        }

        removeEntryByKeySet(filterDataMap, flowExecutorConfig.flowExecutorRootConfig.flowConfig.flowConfigDataContext.dataMap.keySet());
        removeEntryByKeySet(filterDataMap, flowExecutorConfig.flowExecutorRootConfig.flowConfig.flowConfigDataContext.flowContextDataKeySet.temporaryDataKeySet);
        removeEntryByKeySet(filterDataMap, flowExecutorConfig.flowExecutorRootConfig.flowContextDataKeySet.requestDataKeySet);
        removeEntryByKeySet(filterDataMap, flowExecutorConfig.flowExecutorRootConfig.flowContextDataKeySet.temporaryDataKeySet);
        removeEntryByKeySet(filterDataMap, flowExecutorConfig.flowExecutorRootConfig.flowContextDataKeySet.returnDataKeySet);
        return filterDataMap;
    }

    @Override
    public Map getRequestDataMap() {
        Map filterDataMap = new HashMap<>();
        {
            Map dataMap = flowExecutorConfig.flowExecutorRootConfig.dataMap;
            for(String key:flowExecutorConfig.flowExecutorRootConfig.flowContextDataKeySet.requestDataKeySet){
                if(dataMap.containsKey(key)){
                    if(flowExecutorConfig.flowExecutorRootConfig.flowContextDataKeySet.temporaryDataKeySet.contains(key)){
                        continue;
                    }
                    filterDataMap.put(key, dataMap.get(key));
                }
            }
        }
        //全局线程本地数据
        {
            Map threadLocalMap = flowExecutorConfig.flowExecutorRootConfig.flowConfig.flowConfigDataContext.threadLocalDataMap.get();
            if(null!=threadLocalMap){
                Set temporaryDataKeySet = flowExecutorConfig.flowExecutorRootConfig.flowConfig.flowConfigDataContext.flowContextDataKeySet.temporaryDataKeySet;
                for(String key:threadLocalMap.keySet()){
                    if(!temporaryDataKeySet.contains(key)){
                        filterDataMap.put(key, threadLocalMap.get(key));
                    }
                }
            }
        }
        return filterDataMap;
    }

    @Override
    public Map getThreadLocalDataMap() {
        Map threadLocalMap = flowExecutorConfig.flowExecutorRootConfig.threadLocalDataMap.get();
        return threadLocalMap;
    }

    @Override
    public Map getCurrentFlowDataMap() {
        Map currentFlowData = flowExecutorConfig.currentFlowDataMap;
        return currentFlowData;
    }

    @Override
    public Map getCurrentCompositeFlowDataMap() {
        return flowExecutorConfig.currentCompositeFlowDataMap;
    }

    @Override
    public FlowContextDataRange getFlowContextDataRangeByKey(String key) {
        //从当前线程上下文中获取
        {
            Map threadLocalMap = flowExecutorConfig.flowExecutorRootConfig.threadLocalDataMap.get();
            if(null!=threadLocalMap&&!threadLocalMap.isEmpty()&&threadLocalMap.containsKey(key)){
                return FlowContextDataRange.ThreadLocal;
            }
        }
        //从当前流程获取
        {
            Map currentFlowDataMap = flowExecutorConfig.currentFlowDataMap;
            if(!currentFlowDataMap.isEmpty()&¤tFlowDataMap.containsKey(key)){
                return FlowContextDataRange.CurrentFlow;
            }
        }
        //从当前复合流程获取
        {
            Map currentCompositeFlowDataMap = flowExecutorConfig.currentCompositeFlowDataMap;
            if(!currentCompositeFlowDataMap.isEmpty()&¤tCompositeFlowDataMap.containsKey(key)){
                return FlowContextDataRange.CurrentCompositeBusiness;
            }
        }
        //从流程上下文获取
        {
            if(!flowExecutorConfig.flowExecutorRootConfig.dataMap.isEmpty()&&flowExecutorConfig.flowExecutorRootConfig.dataMap.containsKey(key)){
                return FlowContextDataRange.Context;
            }
        }
        //从全局流程线程上下文获取
        {
            Map contextThreadLocalMap = flowExecutorConfig.flowExecutorRootConfig.flowConfig.flowConfigDataContext.threadLocalDataMap.get();
            if(null!=contextThreadLocalMap&&!contextThreadLocalMap.isEmpty()&&contextThreadLocalMap.containsKey(key)){
                return FlowContextDataRange.ContextThreadLocal;
            }
        }
        {
            //从全局流程上下文获取
            Map contextDataMap = flowExecutorConfig.flowExecutorRootConfig.flowConfig.flowConfigDataContext.dataMap;
            if(!contextDataMap.isEmpty()&&contextDataMap.containsKey(key)){
                return FlowContextDataRange.Context;
            }
        }
        return null;
    }

    @Override
    public FlowContextDataRange getFlowContextDataRangeByInstance(Class clazz) {
        return getFlowContextDataRangeByKey(clazz.getName());
    }

    @Override
    public void printFlowDataRange() {
        StringBuilder builder = new StringBuilder();

        //从当前线程上下文中获取
        {
            Map threadLocalMap = flowExecutorConfig.flowExecutorRootConfig.threadLocalDataMap.get();
            if(null!=threadLocalMap&&!threadLocalMap.isEmpty()){
                builder.append("当前线程上下文:"+threadLocalMap.keySet()+"\r\n");
            }
        }
        //从当前流程获取
        {
            Map currentFlowDataMap = flowExecutorConfig.currentFlowDataMap;
            if(!currentFlowDataMap.isEmpty()){
                builder.append("当前流程:"+currentFlowDataMap.keySet()+"\r\n");
            }
        }
        //从当前复合流程获取
        {
            Map currentCompositeFlowDataMap = flowExecutorConfig.currentCompositeFlowDataMap;
            if(!currentCompositeFlowDataMap.isEmpty()){
                builder.append("当前复合流程:"+currentCompositeFlowDataMap.keySet()+"\r\n");
            }
        }
        //从流程上下文获取
        {
            if(!flowExecutorConfig.flowExecutorRootConfig.dataMap.isEmpty()){
                builder.append("流程上下文:"+flowExecutorConfig.flowExecutorRootConfig.dataMap.keySet()+"\r\n");
            }
        }
        //从全局流程线程上下文获取
        {
            Map contextThreadLocalMap = flowExecutorConfig.flowExecutorRootConfig.flowConfig.flowConfigDataContext.threadLocalDataMap.get();
            if(null!=contextThreadLocalMap&&!contextThreadLocalMap.isEmpty()){
                builder.append("全局流程线程上下文:"+contextThreadLocalMap.keySet()+"\r\n");
            }
        }
        {
            //从全局流程上下文获取
            if(!flowExecutorConfig.flowExecutorRootConfig.flowConfig.flowConfigDataContext.dataMap.isEmpty()){
                builder.append("全局流程上下文:"+flowExecutorConfig.flowExecutorRootConfig.flowConfig.flowConfigDataContext.dataMap.keySet()+"\r\n");
            }
        }
        System.out.println(builder);
    }

    private void checkValueEmpty(String key, Object value){
        if(null==value){
            throw new IllegalArgumentException("上下文数据中key为"+key+"的值不能为空!");
        }
        if(value.getClass().isArray()){
            if(Array.getLength(value)==0){
                throw new IllegalArgumentException("上下文数据中key为"+key+"的数组不能为空!");
            }
        }
        if(value instanceof Collection){
            if(((Collection)value).isEmpty()){
                throw new IllegalArgumentException("上下文数据中key为"+key+"的列表不能为空!");
            }
        }
    }

    private void addEntryByKeySet(Map filterDataMap, Map dataMap, Set keySet){
        for(String key:keySet){
            filterDataMap.put(key, dataMap.get(key));
        }
    }

    private void removeEntryByKeySet(Map dataMap, Set keySet){
        for(String key:keySet){
            dataMap.remove(key);
        }
    }

    private Object getDataFromRange(String key, FlowContextDataRange flowContextDataRange){
        switch (flowContextDataRange){
            case ThreadLocal:{
                //从当前线程上下文中获取
                Map threadLocalMap = flowExecutorConfig.flowExecutorRootConfig.threadLocalDataMap.get();
                if(null!=threadLocalMap&&threadLocalMap.containsKey(key)){
                    Object value = threadLocalMap.get(key);
                    return value;
                }
            }break;
            case CurrentFlow:{
                //从当前流程获取
                Map currentFlowDataMap = flowExecutorConfig.currentFlowDataMap;
                if(null!=currentFlowDataMap&¤tFlowDataMap.containsKey(key)){
                    return currentFlowDataMap.get(key);
                }
            }break;
            case CurrentCompositeBusiness:{
                //从当前复合流程获取
                Map currentCompositeFlowDataMap = flowExecutorConfig.currentCompositeFlowDataMap;
                if(null!=currentCompositeFlowDataMap&¤tCompositeFlowDataMap.containsKey(key)){
                    return currentCompositeFlowDataMap.get(key);
                }
            }break;
            case Flow:{
                //从流程上下文获取
                if(flowExecutorConfig.flowExecutorRootConfig.dataMap.containsKey(key)){
                    Object value = flowExecutorConfig.flowExecutorRootConfig.dataMap.get(key);
                    if(flowExecutorConfig.flowExecutorRootConfig.flowContextDataKeySet.returnDataKeySet.contains(key)){
                        flowContextPutDataOperation.removeData(key);
                        flowExecutorConfig.flowExecutorRootConfig.flowContextDataKeySet.returnDataKeySet.remove(key);
                    }
                    return value;
                }
            }break;
            case ContextThreadLocal:{
                //从全局流程线程上下文获取
                Map contextThreadLocalMap = flowExecutorConfig.flowExecutorRootConfig.flowConfig.flowConfigDataContext.threadLocalDataMap.get();
                if(null!=contextThreadLocalMap&&contextThreadLocalMap.containsKey(key)){
                    return contextThreadLocalMap.get(key);
                }
            }break;
            case Context:{
                //从全局流程上下文获取
                if(flowExecutorConfig.flowExecutorRootConfig.flowConfig.flowConfigDataContext.dataMap.containsKey(key)){
                    return flowExecutorConfig.flowExecutorRootConfig.flowConfig.flowConfigDataContext.dataMap.get(key);
                }
            }break;
        }
        return null;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy