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

org.xson.tangyuan.aop.ServiceAopVo Maven / Gradle / Ivy

package org.xson.tangyuan.aop;

import java.util.List;

import org.xson.common.object.XCO;
import org.xson.logging.Log;
import org.xson.logging.LogFactory;
import org.xson.tangyuan.TangYuanContainer;
import org.xson.tangyuan.TangYuanException;
import org.xson.tangyuan.aop.AspectVo.PointCut;
import org.xson.tangyuan.executor.ServiceException;

/**
 * 切面和服务映射
 */
public class ServiceAopVo {

	private static Log		log				= LogFactory.getLog(ServiceAopVo.class);

	protected static String	aopArgKey		= "arg";
	protected static String	aopServiceKey	= "service";
	protected static String	aopResultKey	= "result";
	protected static String	aopExKey		= "ex";

	private String			service			= null;

	private List	beforeCheckList	= null;
	private List	beforeJoinList	= null;
	private List	afterJoinList	= null;
	private List	beforeAloneList	= null;
	private List	afterAloneList	= null;

	public ServiceAopVo(String service, List beforeCheckList, List beforeJoinList, List afterJoinList,
			List beforeAloneList, List afterAloneList) {
		this.service = service;
		this.beforeCheckList = beforeCheckList;
		this.beforeJoinList = beforeJoinList;
		this.afterJoinList = afterJoinList;
		this.beforeAloneList = beforeAloneList;
		this.afterAloneList = afterAloneList;
	}

	public String getService() {
		return service;
	}

	/** 组装AOP参数:before */
	private Object assembleAopArg(String service, Object arg) {
		if (arg instanceof XCO) {
			XCO pkgArg = new XCO();
			pkgArg.setStringValue(aopServiceKey, service);
			pkgArg.setXCOValue(aopArgKey, (XCO) arg);
			return pkgArg;
		}
		// if (arg instanceof Map) {
		// Map pkgArg = new HashMap();
		// pkgArg.put(aopServiceKey, service);
		// pkgArg.put(aopArgKey, arg);
		// return pkgArg;
		// }
		// return arg;

		// TODO
		throw new TangYuanException("AOP components do not support data types other than XCO.");
	}

	/** 组装AOP参数:after */
	private Object assembleAopArg(String service, Object arg, Object result, Throwable ex) {
		if (arg instanceof XCO) {
			XCO pkgArg = new XCO();
			pkgArg.setStringValue(aopServiceKey, service);
			pkgArg.setXCOValue(aopArgKey, (XCO) arg);

			int errorCode = TangYuanContainer.SUCCESS_CODE;
			String errorMessage = null;
			if (null != result) {
				pkgArg.setObjectValue(aopResultKey, result);
				if (result instanceof XCO) {
					XCO resultXCO = (XCO) result;
					Integer code = resultXCO.getCode();
					if (null != code && 0 != code.intValue()) {
						errorCode = code.intValue();
						errorMessage = resultXCO.getMessage();
					}
				}
			}
			if (null != ex) {
				pkgArg.setAttachObject(ex);
				if (ex instanceof ServiceException) {
					ServiceException e = (ServiceException) ex;
					errorCode = e.getErrorCode();
					errorMessage = e.getErrorMessage();
				} else {
					errorCode = TangYuanContainer.getInstance().getErrorCode();
					errorMessage = ex.getMessage();
				}
			}
			pkgArg.setIntegerValue(TangYuanContainer.XCO_CODE_KEY, errorCode);
			if (null != errorMessage) {
				pkgArg.setStringValue(TangYuanContainer.XCO_MESSAGE_KEY, errorMessage);
			}
			return pkgArg;
		}

		// TODO
		throw new TangYuanException("AOP components do not support data types other than XCO.");
	}

	public void execBefore(String service, Object arg, PointCut pointCut) {
		List beforeList = null;
		if (PointCut.BEFORE_CHECK == pointCut) {
			beforeList = beforeCheckList;
		} else if (PointCut.BEFORE_JOIN == pointCut) {
			beforeList = beforeJoinList;
		} else if (PointCut.BEFORE_ALONE == pointCut) {
			beforeList = beforeAloneList;
		}
		if (null == beforeList) {
			return;
		}

		Object pkgArg = assembleAopArg(service, arg);
		String exec = null;
		try {
			for (AspectVo aVo : beforeList) {
				exec = aVo.getExec();
				aVo.execBefore(service, pkgArg);
			}
		} catch (Throwable e) {
			if (PointCut.BEFORE_ALONE == pointCut) {
				log.error("service[" + service + "] execute before-alone error. for:" + exec, e);
			} else {
				if (e instanceof ServiceException) {
					throw (ServiceException) e;
				} else {
					throw new TangYuanException(e);
				}
			}
		}
	}

	public void execAfter(String service, Object arg, Object result, Throwable ex, PointCut pointCut) {
		List afterList = null;
		if (PointCut.AFTER_JOIN == pointCut) {
			afterList = afterJoinList;
		} else if (PointCut.AFTER_ALONE == pointCut) {
			afterList = afterAloneList;
		}
		if (null == afterList) {
			return;
		}

		Object pkgArg = assembleAopArg(service, arg, result, ex);
		String exec = null;
		try {
			for (AspectVo aVo : afterList) {
				exec = aVo.getExec();
				aVo.execAfter(service, pkgArg, result, ex);
			}
		} catch (Throwable e) {
			if (PointCut.AFTER_ALONE == pointCut) {
				log.error("service[" + service + "] execute after-alone error. for:" + exec, e);
			} else {
				if (e instanceof ServiceException) {
					throw (ServiceException) e;
				} else {
					throw new TangYuanException(e);
				}
			}
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy