All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.gdface.facelog.FacelogDecorator Maven / Gradle / Ivy

There is a newer version: 5.3.0
Show newest version
package net.gdface.facelog;

import java.lang.reflect.Method;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import net.gdface.utils.InterfaceDecorator;
import static com.google.common.base.Preconditions.*;

/**
 * {@link IFaceLog}接口实例代理
* 实现{@link IFaceLog}接口调用时对接口调用过程的状态侦听 * @author guyadong * */ public class FacelogDecorator extends InterfaceDecorator { private FacelogDecorator(IFaceLog delegate) { super(IFaceLog.class,delegate); registerListener(new ErrorProbe()); registerListener(new TokenProbe()); } public FacelogDecorator registerClientAddressProbe(BaseClientAddressProbe listener){ checkArgument(registerListener(listener),"FAILT TO register client address probe"); return this; } /** * 将{@link IFaceLog}实例封装为接口代理实例返回 * @param instance * @return facelog接口代理实例 */ public static FacelogDecorator wrap(IFaceLog instance){ return new FacelogDecorator(instance); } private class TokenProbe extends DefaultProbe{ @Override public void beforeInvoke(Object proxy, Method method, Object[] args) { // 服务方法调用开始前初始化上下文对象 TokenContext TokenContext.getCurrentTokenContext().setMethodName(method.getName()); if(args != null && args.length > 0){ // 捕获最后一个类型为Token的参数存入TLS Object last = args[args.length-1]; if( last instanceof Token){ TokenContext.getCurrentTokenContext().setToken(((Token)last)); } } } @Override public void onDone(Object proxy, Method method, Object[] args) { // 服务方法结束,清除上下文对象 TokenContext.getCurrentTokenContext().contextDone(); } } /** * 调用异常侦听器基类 * @author guyadong * */ private static class ErrorProbe extends DefaultProbe { protected static final Logger logger = LoggerFactory.getLogger(ErrorProbe.class); private ErrorProbe() { } @Override public void onError(Object proxy, Method method, Object[] args, Throwable error) { if(error instanceof ServiceSecurityException){ ServiceSecurityException securityException = (ServiceSecurityException)error; switch(securityException.getType()){ case TABLE_INSERT_DENIED: case TABLE_UPDATE_DENIED: case TABLE_DELETE_DENIED: logger.error("PORT:{} FROM:{} BY:{}: MESSAGE:{}", method.getName(), TokenContext.getCurrentTokenContext().getClientAddress(), TokenContext.getCurrentTokenContext().getToken().owner(), error.getMessage()); break; default: break; } } } } /** * 客户端地址侦听器基类,用于获取当前调用的客户端地址 * @author guyadong * */ public static abstract class BaseClientAddressProbe extends DefaultProbe{ protected BaseClientAddressProbe() { } @Override public final void beforeInvoke(Object proxy, Method method, Object[] args) { // 服务方法调用开始前初始化上下文对象 TokenContext,保存客户端地址到当前上下文 TokenContext.getCurrentTokenContext().setClientAddress(getClientAddress()); } /** * 返回当前调用的客户端地址 * @return 当前调用的客户端地址 */ protected abstract String getClientAddress(); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy