package org.zstack.test.aop; import org.aspectj.lang.ProceedingJoinPoint; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.header.message.Message; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; import java.util.HashMap; import java.util.List; import java.util.Map; public class CloudBusAopProxy { private static final CLogger logger = Utils.getLogger(CloudBusAopProxy.class); public static enum Behavior { FAIL, TIMEOUT, } public static final String MESSAGE_ORIGINAL_SERVICE_ID = "OriginalServiceId"; public static final String MESSAGE_BEHAVIOR = "behavior"; private Map<Class<? extends Message>, Behavior> messages = new HashMap<Class<? extends Message>, Behavior>(); public void addMessage(Class<? extends Message> clazz, Behavior bh) { messages.put(clazz, bh); } public void removeMessage(Class<? extends Message> clazz) { messages.remove(clazz); } @SuppressWarnings("unused") private Object singleMessageAdvice(ProceedingJoinPoint pjp, Message msg) throws Throwable { Behavior bh = messages.get(msg.getClass()); if (bh == null) { return pjp.proceed(new Object[]{msg}); } msg.putHeaderEntry(MESSAGE_ORIGINAL_SERVICE_ID, msg.getServiceId()); msg.putHeaderEntry(MESSAGE_BEHAVIOR, bh.toString()); msg.setServiceId(ManInTheMiddleService.SERVICE_ID); return pjp.proceed(new Object[]{msg}); } @SuppressWarnings("unused") private Object singleCallbackMessageAdvice(ProceedingJoinPoint pjp, Message msg, CloudBusCallBack callback) throws Throwable { Behavior bh = messages.get(msg.getClass()); if (bh == null) { return pjp.proceed(new Object[]{msg, callback}); } msg.putHeaderEntry(MESSAGE_ORIGINAL_SERVICE_ID, msg.getServiceId()); msg.putHeaderEntry(MESSAGE_BEHAVIOR, bh.toString()); msg.setServiceId(ManInTheMiddleService.SERVICE_ID); return pjp.proceed(new Object[]{msg, callback}); } @SuppressWarnings("unused") private <T extends Message> Object listMessageAdvice(ProceedingJoinPoint pjp, List<T> msgs) throws Throwable { for (Message msg : msgs) { Behavior bh = messages.get(msg.getClass()); if (bh == null) { logger.warn(String.format("Cannot find behavior for message[%s], however, it's in a message list sent out all in one call, that means you may forget specifying behavior of this message", msg.getMessageName())); continue; } msg.putHeaderEntry(MESSAGE_ORIGINAL_SERVICE_ID, msg.getServiceId()); msg.putHeaderEntry(MESSAGE_BEHAVIOR, bh.toString()); msg.setServiceId(ManInTheMiddleService.SERVICE_ID); } return pjp.proceed(new Object[]{msgs}); } }