package org.springblade.flow.engine.custom.cache;
//package jnpf.engine.custom.cache;
//
//import com.fasterxml.jackson.databind.ObjectMapper;
//import com.fasterxml.jackson.databind.node.ObjectNode;
//import jnpf.base.util.ObjectUtils;
//import jnpf.base.util.SpringContextHolder;
//import jnpf.util.RedisUtil;
//import org.flowable.common.engine.impl.interceptor.CommandExecutor;
//import org.flowable.engine.impl.persistence.deploy.ProcessDefinitionInfoCache;
//import org.flowable.engine.impl.persistence.deploy.ProcessDefinitionInfoCacheObject;
//
//import javax.annotation.Resource;
//import java.io.IOException;
//import java.io.Serializable;
//
///**
// * @author LoveMyOrange
// * @create 2022-02-02 22:15
// */
//public class CustomProcessDefinitionInfoCache extends ProcessDefinitionInfoCache {
//    public static class ProcessDefinitionInfoCacheObjectVo   implements Serializable {
//        protected String id;	//id
//        protected int revision;//版本
//        // 因为需要序列化，ProcessDefinitionInfoCacheObjec类中的infoNode类型为ObjectNode,而ObjectNode没有实现序列化接口，所以需要对象与String
//        //之间相互进行转换
//        protected String infoNode;
//
//        public String getId() {
//            return id;
//        }
//
//        public void setId(String id) {
//            this.id = id;
//        }
//
//        public int getRevision() {
//            return revision;
//        }
//
//        public void setRevision(int revision) {
//            this.revision = revision;
//        }
//
//        public String getInfoNode() {
//            return infoNode;
//        }
//
//        public void setInfoNode(String infoNode) {
//            this.infoNode = infoNode;
//        }
//
//        @Override
//        public String toString() {
//            return "ProcessDefinitionInfoCacheObjectVo [id=" + id
//                    + ", revision=" + revision + ", infoNode=" + infoNode + "]";
//        }
//
//    }
//    protected CommandExecutor commandExecutor;
//    private String redisKeyPrefix="processDefinitionInfo:a6:";
//
//
//    public void setCommandExecutor(CommandExecutor commandExecutor) {
//        super.commandExecutor = commandExecutor;
//        this.commandExecutor = commandExecutor;
//    }
//
//
//
//    public CustomProcessDefinitionInfoCache(CommandExecutor commandExecutor) {
//        super(commandExecutor);
//    }
//
//    public CustomProcessDefinitionInfoCache(CommandExecutor commandExecutor, int limit) {
//        super(commandExecutor, limit);
//    }
//
//    @Override
//    public ProcessDefinitionInfoCacheObject get(String processDefinitionId) {
//        RedisUtil redisUtils = getRedisUtils();
//        byte[] bytes = redisUtils.nativeGetBytes(redisKeyPrefix + processDefinitionId);
//        if (bytes == null)
//            return null;
//        // 将二进制数据转换为object对象防止为空
//        Object object = ObjectUtils.toObject(bytes);
//        if (object == null)
//            return null;
//        ProcessDefinitionInfoCacheObjectVo pdf = (ProcessDefinitionInfoCacheObjectVo) object;
//        // 将从缓存中获取到的对象进行转换并返回
//        ProcessDefinitionInfoCacheObject v = new ProcessDefinitionInfoCacheObject();
//        v.setId(pdf.getId());
//        ObjectMapper objectMapper = new ObjectMapper();
//        ObjectNode infoNode = null;
//        try {
//            if (objectMapper.readTree(pdf.getInfoNode()) != null) {
//                infoNode = (ObjectNode) objectMapper
//                        .readTree(pdf.getInfoNode());
//            }
//            v.setInfoNode(infoNode);
//            v.setRevision(pdf.getRevision());
//            return v;
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        return null;
//    }
//
//    @Override
//    public void add(String id, ProcessDefinitionInfoCacheObject obj) {
//        RedisUtil redisUtil = getRedisUtils();
//        byte[] bytes = redisUtil.nativeGetBytes(redisKeyPrefix + id);
//        Object object = null;
//        // 实例化自定义的类并完成与ProcessDefinitionInfoCacheObject类进行相互转化
//        ProcessDefinitionInfoCacheObjectVo v = new ProcessDefinitionInfoCacheObjectVo();
//        ObjectMapper objectMapper = new ObjectMapper();
//        ObjectNode dataBaseInfoNode = obj.getInfoNode();// 获取节点定义信息的数据
//        try {
//            ObjectNode redisObjectNode = objectMapper.createObjectNode();// 如果不存在则实例化
//            String redisStr = null;
//            if (bytes != null) {
//                // 将二进制流转化为对象
//                object = ObjectUtils.toObject(bytes);
//                // 对象转化，因为添加的时候了类型为ProcessDefinitionInfoCacheObjectVo，因此如果存在值转化不会报错
//                ProcessDefinitionInfoCacheObjectVo pdf = (ProcessDefinitionInfoCacheObjectVo) object;
//                redisStr = pdf.getInfoNode();// 获取缓存中的数据并转化为ObjectNode类型的对象
//                redisObjectNode = (ObjectNode) objectMapper.readTree(redisStr);
//            }
//            v.setId(obj.getId());// 设置id
//            // 如果添加数据的时候，发现redis有值则将新的值与已经存在的值进行合并，并填充对象的属性值
//            dataBaseInfoNode.putAll(redisObjectNode);
//            String finall = objectMapper.writeValueAsString(dataBaseInfoNode);
//            v.setInfoNode(finall);
//            v.setRevision(obj.getRevision());
//            // 将对象转化为byte[]存储到redis
//            System.out.println(v);
//            redisUtil.nativeInsert(redisKeyPrefix+id,v);
//        }catch (Exception e){
//            e.printStackTrace();
//        }
//    }
//
//    @Override
//    public void remove(String id) {
//        RedisUtil redisUtils = getRedisUtils();
//        redisUtils.remove(redisKeyPrefix+id);
//    }
//
//    @Override
//    public void clear() {
//    }
//
//    @Override
//    public int size() {
//     return 0;
//    }
//
//    public  RedisUtil getRedisUtils(){
//        return SpringContextHolder.getBean(RedisUtil.class);
//    }
//}
