// Path: src/main/java/com/ace/cache/parser/IKeyGenerator.java
// public abstract class IKeyGenerator {
//     public static final String LINK = "_";
// 
//     /**
//      * 获取动态key
//      *
//      * @param key
//      * @param scope
//      * @param parameterTypes
//      * @param arguments
//      * @return
//      */
//     public String getKey(String key, CacheScope scope,
//                          Class<?>[] parameterTypes, Object[] arguments) {
//         StringBuffer sb = new StringBuffer("");
//         key = buildKey(key, scope, parameterTypes, arguments);
//         sb.append(key);
//         if (CacheScope.user.equals(scope)) {
//             if (getUserKeyGenerator() != null)
//                 sb.append(LINK)
//                         .append(getUserKeyGenerator().getCurrentUserAccount());
//         }
//         return sb.toString();
//     }
// 
//     /**
//      * 当前登陆人key
//      *
//      * @param userKeyGenerator
//      */
//     public abstract IUserKeyGenerator getUserKeyGenerator();
// 
//     /**
//      * 生成动态key
//      *
//      * @param key
//      * @param scope
//      * @param parameterTypes
//      * @param arguments
//      * @return
//      */
//     public abstract String buildKey(String key, CacheScope scope,
//                                     Class<?>[] parameterTypes, Object[] arguments);
// }
// 
// Path: src/main/java/com/ace/cache/parser/impl/DefaultKeyGenerator.java
// @Service
// public class DefaultKeyGenerator extends IKeyGenerator {
//     @Autowired
//     RedisConfig redisConfig;
// 
//     @Autowired(required = false)
//     private IUserKeyGenerator userKeyGenerator;
// 
//     @Override
//     public String buildKey(String key, CacheScope scope, Class<?>[] parameterTypes, Object[] arguments) {
//         boolean isFirst = true;
//         if (key.indexOf("{") > 0) {
//             key = key.replace("{", ":{");
//             Pattern pattern = Pattern.compile("\\d+(\\.?[\\w]+)*");
//             Matcher matcher = pattern.matcher(key);
//             while (matcher.find()) {
//                 String tmp = matcher.group();
//                 String express[] = matcher.group().split("\\.");
//                 String i = express[0];
//                 int index = Integer.parseInt(i) - 1;
//                 Object value = arguments[index];
//                 if (parameterTypes[index].isAssignableFrom(List.class)) {
//                     List result = (List) arguments[index];
//                     value = result.get(0);
//                 }
//                 if (value == null || value.equals("null"))
//                     value = "";
//                 if (express.length > 1) {
//                     for (int idx = 1; idx < express.length; idx ++) {
//                         String field = express[idx];
//                         value = ReflectionUtils.getFieldValue(value, field);
//                     }
//                 }
//                 if (isFirst) {
//                     key = key.replace("{" + tmp + "}", value.toString());
//                 } else {
//                     key = key.replace("{" + tmp + "}", LINK + value.toString());
//                 }
//             }
//         }
//         if (CacheScope.user.equals(scope) && StringUtils.isNotBlank(redisConfig.getUserKey())){
//             ServletRequestAttributes servletContainer = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//             HttpServletRequest request = servletContainer.getRequest();
//             String accessToken = request.getHeader(redisConfig.getUserKey());
//             if(StringUtils.isBlank(accessToken)){
//                 accessToken = WebUtil.getCookieValue(request,redisConfig.getUserKey());
//             }
//             if (StringUtils.isNotBlank(accessToken)){
//                 key = key + accessToken;
//             }
//         }
//         return key;
//     }
// 
//     @Override
//     public IUserKeyGenerator getUserKeyGenerator() {
//         return userKeyGenerator;
//     }
// 
// }


import com.ace.cache.annotation.Cache;
import com.ace.cache.annotation.CacheGlobalLock;
import com.ace.cache.parser.IKeyGenerator;
import com.ace.cache.parser.impl.DefaultKeyGenerator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.concurrent.ConcurrentHashMap;
     * @throws InstantiationException
     * @throws IllegalAccessException
     */
    public String getKey(Cache anno, Class<?>[] parameterTypes,
                          Object[] arguments) throws InstantiationException,
            IllegalAccessException {
        String key;
        String generatorClsName = anno.generator().getName();
        IKeyGenerator keyGenerator = null;
        if (anno.generator().equals(DefaultKeyGenerator.class)) {
            keyGenerator = keyParser;
        } else {
            if (generatorMap.containsKey(generatorClsName)) {
                keyGenerator = generatorMap.get(generatorClsName);
            } else {
                keyGenerator = anno.generator().newInstance();
                generatorMap.put(generatorClsName, keyGenerator);
            }
        }

        key = keyGenerator.getKey(anno.key(), anno.scope(), parameterTypes,
                arguments);
        return key;
    }

    public String getKey(CacheGlobalLock anno, Class<?>[] parameterTypes,
                         Object[] arguments) throws InstantiationException,
            IllegalAccessException {
        String key;
        String generatorClsName = anno.generator().getName();
// Path: src/main/java/com/ace/cache/parser/IKeyGenerator.java
// public abstract class IKeyGenerator {
//     public static final String LINK = "_";
// 
//     /**
//      * 获取动态key
//      *
//      * @param key
//      * @param scope
//      * @param parameterTypes
//      * @param arguments
//      * @return
//      */
//     public String getKey(String key, CacheScope scope,
//                          Class<?>[] parameterTypes, Object[] arguments) {
//         StringBuffer sb = new StringBuffer("");
//         key = buildKey(key, scope, parameterTypes, arguments);
//         sb.append(key);
//         if (CacheScope.user.equals(scope)) {
//             if (getUserKeyGenerator() != null)
//                 sb.append(LINK)
//                         .append(getUserKeyGenerator().getCurrentUserAccount());
//         }
//         return sb.toString();
//     }
// 
//     /**
//      * 当前登陆人key
//      *
//      * @param userKeyGenerator
//      */
//     public abstract IUserKeyGenerator getUserKeyGenerator();
// 
//     /**
//      * 生成动态key
//      *
//      * @param key
//      * @param scope
//      * @param parameterTypes
//      * @param arguments
//      * @return
//      */
//     public abstract String buildKey(String key, CacheScope scope,
//                                     Class<?>[] parameterTypes, Object[] arguments);
// }
// 
// Path: src/main/java/com/ace/cache/parser/impl/DefaultKeyGenerator.java
// @Service
// public class DefaultKeyGenerator extends IKeyGenerator {
//     @Autowired
//     RedisConfig redisConfig;
// 
//     @Autowired(required = false)
//     private IUserKeyGenerator userKeyGenerator;
// 
//     @Override
//     public String buildKey(String key, CacheScope scope, Class<?>[] parameterTypes, Object[] arguments) {
//         boolean isFirst = true;
//         if (key.indexOf("{") > 0) {
//             key = key.replace("{", ":{");
//             Pattern pattern = Pattern.compile("\\d+(\\.?[\\w]+)*");
//             Matcher matcher = pattern.matcher(key);
//             while (matcher.find()) {
//                 String tmp = matcher.group();
//                 String express[] = matcher.group().split("\\.");
//                 String i = express[0];
//                 int index = Integer.parseInt(i) - 1;
//                 Object value = arguments[index];
//                 if (parameterTypes[index].isAssignableFrom(List.class)) {
//                     List result = (List) arguments[index];
//                     value = result.get(0);
//                 }
//                 if (value == null || value.equals("null"))
//                     value = "";
//                 if (express.length > 1) {
//                     for (int idx = 1; idx < express.length; idx ++) {
//                         String field = express[idx];
//                         value = ReflectionUtils.getFieldValue(value, field);
//                     }
//                 }
//                 if (isFirst) {
//                     key = key.replace("{" + tmp + "}", value.toString());
//                 } else {
//                     key = key.replace("{" + tmp + "}", LINK + value.toString());
//                 }
//             }
//         }
//         if (CacheScope.user.equals(scope) && StringUtils.isNotBlank(redisConfig.getUserKey())){
//             ServletRequestAttributes servletContainer = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//             HttpServletRequest request = servletContainer.getRequest();
//             String accessToken = request.getHeader(redisConfig.getUserKey());
//             if(StringUtils.isBlank(accessToken)){
//                 accessToken = WebUtil.getCookieValue(request,redisConfig.getUserKey());
//             }
//             if (StringUtils.isNotBlank(accessToken)){
//                 key = key + accessToken;
//             }
//         }
//         return key;
//     }
// 
//     @Override
//     public IUserKeyGenerator getUserKeyGenerator() {
//         return userKeyGenerator;
//     }
// 
// }


// Path: src/main/java/com/ace/cache/aspect/KeyGenerateService.java
import com.ace.cache.annotation.Cache;
import com.ace.cache.annotation.CacheGlobalLock;
import com.ace.cache.parser.IKeyGenerator;
import com.ace.cache.parser.impl.DefaultKeyGenerator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.concurrent.ConcurrentHashMap;

     * @throws InstantiationException
     * @throws IllegalAccessException
     */
    public String getKey(Cache anno, Class<?>[] parameterTypes,
                          Object[] arguments) throws InstantiationException,
            IllegalAccessException {
        String key;
        String generatorClsName = anno.generator().getName();
        IKeyGenerator keyGenerator = null;
        if (anno.generator().equals(DefaultKeyGenerator.class)) {
            keyGenerator = keyParser;
        } else {
            if (generatorMap.containsKey(generatorClsName)) {
                keyGenerator = generatorMap.get(generatorClsName);
            } else {
                keyGenerator = anno.generator().newInstance();
                generatorMap.put(generatorClsName, keyGenerator);
            }
        }

        key = keyGenerator.getKey(anno.key(), anno.scope(), parameterTypes,
                arguments);
        return key;
    }

    public String getKey(CacheGlobalLock anno, Class<?>[] parameterTypes,
                         Object[] arguments) throws InstantiationException,
            IllegalAccessException {
        String key;
        String generatorClsName = anno.generator().getName();
        IKeyGenerator keyGenerator = null;