package org.springblade.flow.engine.custom.deployer;

import org.flowable.engine.impl.bpmn.deployer.BpmnDeployer;
import org.springframework.stereotype.Component;

/**
 * @author LoveMyOrange
 * @create 2022-02-02 22:45
 * @desc 修复Activiti节点缓存不更新的bug
 */
@Component
public class CustomBpmnDeployer extends BpmnDeployer {
    private String redisKeyPrefix="processDefinitionInfo:f6:";
//    @Override
//    protected void createLocalizationValues(String processDefinitionId, Process process) {
//        if (process == null) return;
//        //获取命令上下文对象
//        CommandContext commandContext = Context.getCommandContext();
//        DynamicBpmnService dynamicBpmnService = commandContext.getProcessEngineConfiguration().getDynamicBpmnService();
//        //根据流程定义ID 从 ACT_PROCDEF_INFO 表中查询数据
//        ObjectNode infoNode = dynamicBpmnService.getProcessDefinitionInfo(processDefinitionId);
//
//        boolean localizationValuesChanged = false;//记录节点信息是否发生变化
//        // 直解析localization 元素     其他的元素 引擎不会处理
//        List<ExtensionElement> localizationElements = process.getExtensionElements().get("localization");
//        if (localizationElements != null) {
//            //如果 扩展元素中 有localization 子元素 则开始获取
//            for (ExtensionElement localizationElement : localizationElements) { //循环遍历元素
//                //通过下面的操作 可以看出命名空间必须是activiti 才可以
//                if (BpmnXMLConstants.ACTIVITI_EXTENSIONS_PREFIX.equals(localizationElement.getNamespacePrefix())) {
//                    //获取locale
//                    String locale = localizationElement.getAttributeValue(null, "locale");
//                    //获取name值
//                    String name = localizationElement.getAttributeValue(null, "name");
//                    String documentation = null; //获取documentation值
//                    //
//                    List<ExtensionElement> documentationElements = localizationElement.getChildElements().get("documentation");
//                    if (documentationElements != null) {  //如果查找到就 break
//                        for (ExtensionElement documentationElement : documentationElements) {
//                            documentation = StringUtils.trimToNull(documentationElement.getElementText());
//                            break; //如果配置了 多个 documentation 元素 只会执行一次
//                        }
//                    }
//
//                    String processId = process.getId(); //流程id
//                    //如果查询到的数据与缓存中的数据不一致 则需要修改
//                    if (isEqualToCurrentLocalizationValue(locale, processId, "name", name, infoNode) == false) {
//                        //更新infoNode对象 (将两者数据 合并 )
//                        dynamicBpmnService.changeLocalizationName(locale, processId, name, infoNode);
//                        localizationValuesChanged = true;
//                    }
//
//                    if (documentation != null && isEqualToCurrentLocalizationValue(locale, processId, "description", documentation, infoNode) == false) {
//                        //需要修改描述信息 description     //更新infoNode对象 (将两者数据 合并 )
//                        dynamicBpmnService.changeLocalizationDescription(locale, processId, documentation, infoNode);
//                        localizationValuesChanged = true;
//                    }
//
//                    break; // for循环执行一次之后 break ,说明如果存在多个兄弟localization 元素 只会执行一次  也即只会解析第一个localization元素
//                }
//            }
//        }
//        //比对UserTask SubProcess 元素中的数据是否发生变化
//        boolean isFlowElementLocalizationChanged = localizeFlowElements(process.getFlowElements(), infoNode);
//        //比如 dataObject 元素中的数据 是否发生变化
//        boolean isDataObjectLocalizationChanged = localizeDataObjectElements(process.getDataObjects(), infoNode);
//        if (isFlowElementLocalizationChanged || isDataObjectLocalizationChanged) {
//            localizationValuesChanged = true;
//        }
//        ProcessEngineConfigurationImpl processEngineConfiguration = Context.getProcessEngineConfiguration();
//        DeploymentManager deploymentManager = processEngineConfiguration.getDeploymentManager();
//        ProcessDefinitionInfoCacheObject definitionInfoCacheObject= new ProcessDefinitionInfoCacheObject();
//        definitionInfoCacheObject.setInfoNode(infoNode);
//        //
//        if (localizationValuesChanged) { //将infoNode更新到DB,并不会更新缓存,这是Activiti的一个bug
////            dynamicBpmnService.saveProcessDefinitionInfo(processDefinitionId, infoNode);
//            deploymentManager.getProcessDefinitionInfoCache().add(redisKeyPrefix+processDefinitionId,definitionInfoCacheObject);
//        }
//
//    }
}










