package org.zstack.core;
import org.zstack.header.exception.CloudRuntimeException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* Created by xing5 on 2016/6/23.
*/
public class MessageCommandRecorder {
private static Class starter;
private static boolean enabled;
private static List<Class> followers = new ArrayList<>();
static boolean needRun() {
return CoreGlobalProperty.UNIT_TEST_ON && enabled;
}
public static void start(Class s) {
if (!CoreGlobalProperty.UNIT_TEST_ON) {
return;
}
enabled = true;
if (starter != null) {
throw new RuntimeException(String.format("already a starter[%s] here", starter));
}
starter = s;
}
public static synchronized void record(String c) {
if (!needRun()) {
return;
}
try {
followers.add(Class.forName(c));
} catch (ClassNotFoundException e) {
throw new CloudRuntimeException(e);
}
}
public static synchronized void record(Class c) {
if (!needRun()) {
return;
}
followers.add(c);
}
public static synchronized List<Class> end() {
if (!needRun()) {
return null;
}
List<Class> ret = followers.stream().collect(Collectors.toList());
reset();
return ret;
}
public static synchronized void reset() {
if (!needRun()) {
return;
}
enabled = false;
starter = null;
followers = new ArrayList<>();
}
public static synchronized String endAndToString() {
if (!needRun()) {
return null;
}
StringBuilder sb = new StringBuilder(String.format("\n\nCALLING CHAIN FOR: %s", starter));
for (Class c : followers) {
sb.append(String.format("\n ---> %s", c));
}
reset();
return sb.toString();
}
}