AspectLogUrl.java 5.41 KB
package com.yanzuoguang.cloud.aop;

import com.yanzuoguang.cloud.helper.CookiesHelper;
import com.yanzuoguang.util.helper.ArrayHelper;
import com.yanzuoguang.util.helper.StringHelper;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.amqp.core.Message;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * 配置文件处理
 *
 * @author 颜佐光
 */
@Component
public class AspectLogUrl {
    /**
     * /**
     * 获取方法名称
     *
     * @return 方法路径
     */
    public String getWebMethodUrl(ProceedingJoinPoint joinPoint) {
        String url = StringHelper.EMPTY;
        Signature signature = joinPoint.getSignature();
        Class<?> declaringType = signature.getDeclaringType();
        String name = signature.getName();

        FeignClient feignClient = declaringType.getAnnotation(FeignClient.class);
        // 类路径
        RequestMapping[] classRequests = declaringType.getAnnotationsByType(RequestMapping.class);
        PostMapping[] classPosts = declaringType.getAnnotationsByType(PostMapping.class);
        GetMapping[] classGets = declaringType.getAnnotationsByType(GetMapping.class);

        List<Annotation> annotation = new ArrayList<>();
        ArrayHelper.addList(annotation, classRequests, classPosts, classGets);

        String baseUrl = String.format("%s:%s", declaringType.getSimpleName(), name);
        if (!annotation.isEmpty() && signature instanceof MethodSignature) {
            MethodSignature methodSignature = (MethodSignature) signature;
            Method targetMethod = methodSignature.getMethod();
            // 方法路径
            RequestMapping[] requests = targetMethod.getAnnotationsByType(RequestMapping.class);
            PostMapping[] posts = targetMethod.getAnnotationsByType(PostMapping.class);
            GetMapping[] gets = targetMethod.getAnnotationsByType(GetMapping.class);

            url = getFeignOrRequestUrl(feignClient, classRequests, classPosts, classGets, requests, posts, gets);
        }
        if (StringHelper.isEmpty(url)) {
            return baseUrl;
        }
        return String.format("%s:%s", baseUrl, url);
    }

    /**
     * 获取feign请求地址
     *
     * @param feignClient
     * @param classRequests
     * @param classPosts
     * @param classGets
     * @param requests
     * @param posts
     * @param gets
     * @return
     */
    private String getFeignOrRequestUrl(FeignClient feignClient, RequestMapping[] classRequests, PostMapping[] classPosts, GetMapping[] classGets, RequestMapping[] requests, PostMapping[] posts, GetMapping[] gets) {
        StringBuilder sb = new StringBuilder();
        if (feignClient != null) {
            sb.append(feignClient.value());
            sb.append(":");

            List<RequestMapping> reqList = ArrayHelper.mergeList(classRequests, requests);
            List<PostMapping> postList = ArrayHelper.mergeList(classPosts, posts);
            List<GetMapping> getList = ArrayHelper.mergeList(classGets, gets);
            for (RequestMapping item : reqList) {
                if (item.value().length > 0) {
                    sb.append(item.value()[0]);
                }
            }
            for (PostMapping item : postList) {
                if (item.value().length > 0) {
                    sb.append(item.value()[0]);
                }
            }
            for (GetMapping item : getList) {
                if (item.value().length > 0) {
                    sb.append(item.value()[0]);
                }
            }
        } else {
            HttpServletRequest request = CookiesHelper.getRequest();
            sb.append(request.getRequestURI());
            if (!StringHelper.isEmpty(request.getQueryString())) {
                sb.append("?");
                sb.append(request.getQueryString());
            }
        }
        return sb.toString();
    }

    /**
     * 根据类型获取对象
     *
     * @param joinPoint 参数
     * @return 消息实体
     */
    public Message getMessage(ProceedingJoinPoint joinPoint) {
        for (Object item : joinPoint.getArgs()) {
            if (item instanceof Message) {
                return (Message) item;
            }
        }
        return null;
    }

    /**
     * 获取消息路径
     *
     * @param joinPoint 函数
     * @param message   消息内容
     * @return 消息路径
     */
    public String getMessageUrl(ProceedingJoinPoint joinPoint, Message message) {
        Signature signature = joinPoint.getSignature();
        Class<?> declaringType = signature.getDeclaringType();
        String name = signature.getName();

        String baseUrl = String.format("%s:%s", declaringType.getSimpleName(), name);
        String url;
        if (message != null) {
            url = message.getMessageProperties().getConsumerQueue();
        } else {
            url = StringHelper.EMPTY;
        }
        if (StringHelper.isEmpty(url)) {
            return baseUrl;
        }
        return String.format("%s:%s", baseUrl, url);
    }

}