ProcessExtensionsAutoConfiguration

Survive by day and develop by night.
talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive.
happy for hardess to solve denpendies.

目录

在这里插入图片描述

概述

ProcessExtensionsAutoConfiguration的是一个非常常见的需求。

需求:

设计思路

实现思路分析

ProcessExtensionsAutoConfiguration

@Configuration
@EnableCaching
    public class ProcessExtensionsAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public DeploymentResourceLoader<ProcessExtensionModel> deploymentResourceLoader() {
        return new DeploymentResourceLoader<>();
    }

    @Bean
    @ConditionalOnMissingBean
    public ProcessExtensionResourceReader processExtensionResourceReader(ObjectMapper objectMapper,
                                                            Map<String, VariableType> variableTypeMap) {
        return new ProcessExtensionResourceReader(objectMapper, variableTypeMap);
    }

    @Bean
    @ConditionalOnMissingBean
    public ProcessExtensionService processExtensionService(ProcessExtensionResourceReader processExtensionResourceReader,
                                                           DeploymentResourceLoader<ProcessExtensionModel> deploymentResourceLoader) {
        return new ProcessExtensionService(
                deploymentResourceLoader,
                processExtensionResourceReader);
    }

    @Bean
    InitializingBean initRepositoryServiceForProcessExtensionService(RepositoryService repositoryService,
                                                                     ProcessExtensionService processExtensionService) {
        return () -> processExtensionService.setRepositoryService(repositoryService);
    }

    @Bean
    InitializingBean initRepositoryServiceForDeploymentResourceLoader(RepositoryService repositoryService,
                                                                      DeploymentResourceLoader deploymentResourceLoader) {
        return () -> deploymentResourceLoader.setRepositoryService(repositoryService);
    }

    @Bean
    @ConditionalOnMissingBean(name = "variableTypeMap")
    public Map<String, VariableType> variableTypeMap(ObjectMapper objectMapper,
                                                     DateFormatterProvider dateFormatterProvider) {
        Map<String, VariableType> variableTypeMap = new HashMap<>();
        variableTypeMap.put("boolean", new JavaObjectVariableType(Boolean.class));
        variableTypeMap.put("string", new JavaObjectVariableType(String.class));
        variableTypeMap.put("integer", new JavaObjectVariableType(Integer.class));
        variableTypeMap.put("json", new JsonObjectVariableType(objectMapper));
        variableTypeMap.put("file", new JsonObjectVariableType(objectMapper));
        variableTypeMap.put("folder", new JsonObjectVariableType(objectMapper));
        variableTypeMap.put("date", new DateVariableType(Date.class, dateFormatterProvider));
        variableTypeMap.put("datetime", new DateVariableType(Date.class, dateFormatterProvider));
        variableTypeMap.put("array", new JsonObjectVariableType(objectMapper));
        return variableTypeMap;
    }

    @Bean
    public VariableValidationService variableValidationService(Map<String, VariableType> variableTypeMap) {
        return new VariableValidationService(variableTypeMap);
    }

    @Bean
    public VariableParsingService variableParsingService(Map<String, VariableType> variableTypeMap) {
        return new VariableParsingService(variableTypeMap);
    }

    @Bean
    @ConditionalOnMissingBean
    public CachingProcessExtensionService cachingProcessExtensionService(ProcessExtensionService processExtensionService) {
        return new CachingProcessExtensionService(processExtensionService);
    }

2.AssignmentDefinition

public class AssignmentDefinition {

    public enum AssignmentEnum {
        ASSIGNEE("assignee"),
        CANDIDATES("candidates");

        private String assignment;

        private AssignmentEnum(String assignment) {
            this.assignment = assignment;
        }
    }

    public enum AssignmentType {
        STATIC("static"),
        IDENTITY("identity"),
        EXPRESSION("expression");

        private String type;

        private AssignmentType(String type) {
            this.type = type;
        }

    }

    public enum AssignmentMode {
        SEQUENTIAL("sequential"),
        MANUAL("manual");

        private String mode;

        private AssignmentMode(String mode) {
            this.mode = mode;
        }

    }

3.ConstantDefinition

public class ConstantDefinition {

    private Object value;

    public Object getValue() {
        return value;
    }

    public void setValue(Object value) {
        this.value = value;
    }
}

4.Extension

public class Extension {

    private static final ProcessVariablesMapping EMPTY_PROCESS_VARIABLES_MAPPING = new ProcessVariablesMapping();
    private Map<String, VariableDefinition> properties = new HashMap<>();
    private Map<String, ProcessVariablesMapping> mappings = new HashMap<>();
    private Map<String, ProcessConstantsMapping> constants = new HashMap<>();
    private TemplatesDefinition templates = new TemplatesDefinition();
    private Map<String, AssignmentDefinition> assignments = new HashMap<>();

    public Map<String, VariableDefinition> getProperties() {
        return properties;
    }

    public void setProperties(Map<String, VariableDefinition> properties) {
        this.properties = properties;
    }

    public Map<String, ProcessVariablesMapping> getMappings() {
        return mappings;
    }

    public void setMappings(Map<String, ProcessVariablesMapping> mappings) {
        this.mappings = mappings;
    }

    public Map<String, ProcessConstantsMapping> getConstants() {
        return constants;
    }

    public void setConstants(Map<String, ProcessConstantsMapping> constants) {
        this.constants = constants;
    }


    public ProcessConstantsMapping getConstantForFlowElement(String flowElementUUID) {
        ProcessConstantsMapping processConstantsMapping = constants.get(flowElementUUID);
        return processConstantsMapping != null ? processConstantsMapping : new ProcessConstantsMapping();
    }


    public ProcessVariablesMapping getMappingForFlowElement(String flowElementUUID) {
        ProcessVariablesMapping processVariablesMapping = mappings.get(flowElementUUID);
        return processVariablesMapping != null ? processVariablesMapping : EMPTY_PROCESS_VARIABLES_MAPPING;
    }

    public Optional<TemplateDefinition> findAssigneeTemplateForTask(String taskUUID) {
        return templates.findAssigneeTemplateForTask(taskUUID);
    }

    public Optional<TemplateDefinition> findCandidateTemplateForTask(String taskUUID) {
        return templates.findCandidateTemplateForTask(taskUUID);
    }

    public VariableDefinition getProperty(String propertyUUID) {
        return properties != null ? properties.get(propertyUUID) : null;
    }

    public VariableDefinition getPropertyByName(String name) {
        if (properties != null) {
            for (Map.Entry<String, VariableDefinition> variableDefinition : properties.entrySet()) {
                if (variableDefinition.getValue() != null) {
                    if (Objects.equals(variableDefinition.getValue().getName(), name)) {
                        return variableDefinition.getValue();
                    }
                }
            }
        }

        return null;
    }

    public boolean hasMapping(String taskId) {
        return mappings.get(taskId) != null;
    }

    public boolean shouldMapAllInputs(String elementId) {
        ProcessVariablesMapping processVariablesMapping = mappings.get(elementId);
        return processVariablesMapping.getMappingType() != null &&
            (processVariablesMapping.getMappingType().equals(MappingType.MAP_ALL_INPUTS) ||
            processVariablesMapping.getMappingType().equals(MappingType.MAP_ALL));
    }

    public boolean shouldMapAllOutputs(String elementId) {
        ProcessVariablesMapping processVariablesMapping = mappings.get(elementId);
        return processVariablesMapping.getMappingType() != null &&
            (processVariablesMapping.getMappingType().equals(MappingType.MAP_ALL_OUTPUTS) ||
            processVariablesMapping.getMappingType().equals(MappingType.MAP_ALL));
    }

    public TemplatesDefinition getTemplates() {
        return templates;
    }

    public void setTemplates(TemplatesDefinition templates) {
        this.templates = templates;
    }

    public Map<String, AssignmentDefinition> getAssignments() {
        return assignments;
    }

    public void setAssignments(Map<String, AssignmentDefinition> assignments) {
        this.assignments = assignments;
    }
}

5.VariableParsingService

public class VariableParsingService {

    private static final Logger logger = LoggerFactory.getLogger(VariableParsingService.class);

    public VariableParsingService(Map<String, VariableType> variableTypeMap) {
        this.variableTypeMap = variableTypeMap;
    }

    private Map<String, VariableType> variableTypeMap;

    public Object parse(VariableDefinition variableDefinition) throws ActivitiException{


        if(variableDefinition.getType()!=null) {
            VariableType type = variableTypeMap.get(variableDefinition.getType());

            return type.parseFromValue(variableDefinition.getValue());
        }

        return variableDefinition.getValue();
    }

}

VariableValidationService

 public VariableValidationService(Map<String, VariableType> variableTypeMap) {
        this.variableTypeMap = variableTypeMap;
    }

    private Map<String, VariableType> variableTypeMap;

    public boolean validate(Object var, VariableDefinition variableDefinition){
        return validateWithErrors(var,variableDefinition).isEmpty();
    }

    public List<ActivitiException> validateWithErrors(Object var, VariableDefinition variableDefinition){

        List<ActivitiException> errors = new ArrayList<>();

        if(variableDefinition.getType()!=null) {
            VariableType type = variableTypeMap.get(variableDefinition.getType());

            //if type is not in the map then assume to be json
            if(type==null){
                type = variableTypeMap.get("json");
            }

            type.validate(var,
                          errors);
        } else{
            errors.add(new ActivitiException(variableDefinition.getName()+" has no type"));
            logger.error(variableDefinition.getName()+" has no type");
        }

ProcessExtensionResourceFinderDescriptor

public class ProcessExtensionResourceFinderDescriptor implements ResourceFinderDescriptor {

    private boolean checkResources;
    private String locationPrefix;
    private List<String> locationSuffixes;

    public ProcessExtensionResourceFinderDescriptor(boolean checkResources,
                                                    String locationPrefix,
                                                    String locationSuffix) {

        this.checkResources = checkResources;
        this.locationPrefix = locationPrefix;
        locationSuffixes = new ArrayList<>();
        locationSuffixes.add(locationSuffix);
    }

    @Override
    public List<String> getLocationSuffixes() {
        return locationSuffixes;
    }

    @Override
    public String getLocationPrefix() {
        return locationPrefix;
    }

    @Override
    public boolean shouldLookUpResources() {
        return checkResources;
    }

    @Override
    public String getMsgForEmptyResources() {
        return "No process extensions were found for auto-deployment in the location '" + locationPrefix + "'";
    }

    @Override
    public String getMsgForResourcesFound(List<String> processExtensionFiles) {
        return "The following process extension files will be deployed: " + processExtensionFiles;
    }

    @Override
    public void validate(List<Resource> resources) {

    }

参考资料和推荐阅读

[1].暂无

欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!~

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迅捷的软件产品制作专家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值