com.ace.erp.extra.aop.UserCacheAspect.java Source code

Java tutorial

Introduction

Here is the source code for com.ace.erp.extra.aop.UserCacheAspect.java

Source

/**
 * Copyright (c) 2009-2015 http://demi-panda.com
 *
 * Licensed 
 */
package com.ace.erp.extra.aop;

import com.ace.erp.common.cache.BaseCacheAspect;
import com.ace.erp.entity.sys.User;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * ?
 * 
 * 1?username/email/mobilePhoneNumber------>id
 * 2?id------->Model
 *
 * Created with ace.
 * User: denghp
 * Date: 10/20/13
 * Time: 10:16 PM
 */
@Component
@Aspect
public class UserCacheAspect extends BaseCacheAspect {

    public UserCacheAspect() {
        setCacheName("sys-userCache");
    }

    private String idKeyPrefix = "id-";
    private String usernameKeyPrefix = "username-";
    private String emailKeyPrefix = "email-";
    private String mobilePhoneNumberKeyPrefix = "mobilePhoneNumber-";

    ////////////////////////////////////////////////////////////////////////////////
    ////
    ////////////////////////////////////////////////////////////////////////////////

    /**
     * ?Service
     */
    @Pointcut(value = "target(com.ace.erp.service.sys.UserService)")
    private void userServicePointcut() {
    }

    /**
     * only put
     *      ?  ????
     */
    @Pointcut(value = "execution(* save(..)) " + "|| execution(* saveAndFlush(..)) " + "|| execution(* update(..)) "
            + "|| execution(* login(..)) " + "|| execution(* changePassword(..)) "
            + "|| execution(* changeStatus(..))")
    private void cachePutPointcut() {
    }

    /**
     * evict 
     */
    @Pointcut(value = "(execution(* delete(*))) && args(arg)", argNames = "arg")
    private void cacheEvictPointcut(Object arg) {
    }

    /**
     * put  get
     * 
     */
    @Pointcut(value = "(execution(* getUserByName(*)) " + "|| execution(* findByEmail(*)) "
            + "|| execution(* findByMobilePhoneNumber(*)) " + "|| execution(* findOne(*)))")
    private void cacheablePointcut() {
    }

    ////////////////////////////////////////////////////////////////////////////////
    ////
    ////////////////////////////////////////////////////////////////////////////////
    @AfterReturning(value = "userServicePointcut() && cachePutPointcut()", returning = "user")
    public void cachePutAdvice(Object user) {
        //put cache
        put((User) user);
    }

    @After(value = "userServicePointcut() && cacheEvictPointcut(arg)", argNames = "arg")
    public void cacheEvictAdvice(Object arg) {
        if (arg == null) {
            return;
        }
        if (arg instanceof Long) {
            //only evict id
            evictId(String.valueOf(arg));
        }
        if (arg instanceof Long[]) {
            for (Long id : (Long[]) arg) {
                //only evict id
                evictId(String.valueOf(id));
            }
        }

        if (arg instanceof String) {
            //only evict id
            evictId((String) arg);
        }
        if (arg instanceof String[]) {
            for (String id : (String[]) arg) {
                //only evict id
                evictId(String.valueOf(id));
            }
        }
        if (arg instanceof User) {
            //evict user
            evict((User) arg);
        }
    }

    @Around(value = "userServicePointcut() && cacheablePointcut()")
    public Object cacheableAdvice(ProceedingJoinPoint pjp) throws Throwable {

        String methodName = pjp.getSignature().getName();
        Object arg = pjp.getArgs().length >= 1 ? pjp.getArgs()[0] : null;

        String key = "";
        boolean isIdKey = false;
        if ("getUserById".equals(methodName)) {
            key = idKey(String.valueOf(arg));
            isIdKey = true;
        } else if ("getUserByName".equals(methodName)) {
            key = usernameKey((String) arg);
        } else if ("getUserByEmail".equals(methodName)) {
            key = emailKey((String) arg);
        } else if ("getUserByMobilePhoneNumber".equals(methodName)) {
            key = mobilePhoneNumberKey((String) arg);
        }

        User user = null;
        if (isIdKey == true) {
            user = get(key);
        } else {
            Integer id = get(key);
            if (id != null) {
                key = idKey(String.valueOf(id));
                user = get(key);
            }
        }
        //cache hit
        if (user != null) {
            log.debug("cacheName:{}, hit key:{}", cacheName, key);
            return user;
        }
        log.debug("cacheName:{}, miss key:{}", cacheName, key);

        //cache miss
        user = (User) pjp.proceed();

        //put cache
        put(user);
        return user;

    }

    private String idKey(String id) {
        return idKeyPrefix + id;
    }

    private String usernameKey(String username) {
        return usernameKeyPrefix + username;
    }

    private String emailKey(String email) {
        return emailKeyPrefix + email;
    }

    private String mobilePhoneNumberKey(String mobilePhoneNumber) {
        return mobilePhoneNumberKeyPrefix + mobilePhoneNumber;
    }

    ////////////////////////////////////////////////////////////////////////////////
    ////cache 
    ////////////////////////////////////////////////////////////////////////////////
    public void put(User user) {
        if (user == null) {
            return;
        }
        int id = user.getId();
        //username email mobilePhoneNumber ---> id
        put(usernameKey(user.getUsername()), id);
        put(emailKey(user.getEmail()), id);
        put(mobilePhoneNumberKey(user.getMobilePhoneNumber()), id);
        // id ---> user
        put(idKey(String.valueOf(id)), user);
    }

    public void evictId(String id) {
        evict(idKey(id));
    }

    public void evict(User user) {
        if (user == null) {
            return;
        }
        int id = user.getId();
        evict(idKey(String.valueOf(id)));
        evict(usernameKey(user.getUsername()));
        evict(emailKey(user.getEmail()));
        evict(mobilePhoneNumberKey(user.getMobilePhoneNumber()));
    }

}