// Path: src/main/java/com/ace/cache/constants/CacheScope.java
// public enum CacheScope {
//     user, application
// }
// 
// 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.constants.CacheScope;
import com.ace.cache.parser.IKeyGenerator;
import com.ace.cache.parser.impl.DefaultKeyGenerator;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
package com.ace.cache.annotation;



/**
 * 全局锁（基于redis缓存）
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD, ElementType.TYPE})
public @interface CacheGlobalLock {

    public String key() default "";
    /**
     * 过期时间（单位分钟）
     */
    public int expire() default 60;

    /**
     * 重试加锁时间间隔（单位ms）
     * @return
     */
    public int retry() default 5000;

    /**
     * 是否一直等待全局锁？ 默认为否，获取不到锁则不执行程序。
     */
    public boolean waitLock() default false;

    /**
     * 作用域
     *
     * @return
     * @author Ace
     * @date 2017年5月3日
     */
// Path: src/main/java/com/ace/cache/constants/CacheScope.java
// public enum CacheScope {
//     user, application
// }
// 
// 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/annotation/CacheGlobalLock.java
import com.ace.cache.constants.CacheScope;
import com.ace.cache.parser.IKeyGenerator;
import com.ace.cache.parser.impl.DefaultKeyGenerator;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

package com.ace.cache.annotation;



/**
 * 全局锁（基于redis缓存）
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD, ElementType.TYPE})
public @interface CacheGlobalLock {

    public String key() default "";
    /**
     * 过期时间（单位分钟）
     */
    public int expire() default 60;

    /**
     * 重试加锁时间间隔（单位ms）
     * @return
     */
    public int retry() default 5000;

    /**
     * 是否一直等待全局锁？ 默认为否，获取不到锁则不执行程序。
     */
    public boolean waitLock() default false;

    /**
     * 作用域
     *
     * @return
     * @author Ace
     * @date 2017年5月3日
     */
    public CacheScope scope() default CacheScope.application;