|
|
|
@ -3,16 +3,21 @@ package com.taobao.arthas.core.command.view;
|
|
|
|
|
import com.alibaba.arthas.deps.org.slf4j.Logger;
|
|
|
|
|
import com.alibaba.arthas.deps.org.slf4j.LoggerFactory;
|
|
|
|
|
import com.taobao.arthas.core.command.model.*;
|
|
|
|
|
import com.taobao.arthas.core.shell.command.CommandProcess;
|
|
|
|
|
|
|
|
|
|
import java.lang.reflect.Method;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Result view resolver for term
|
|
|
|
|
*
|
|
|
|
|
* @author gongdewei 2020/3/27
|
|
|
|
|
*/
|
|
|
|
|
public class ResultViewResolver {
|
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(ResultViewResolver.class);
|
|
|
|
|
|
|
|
|
|
// modelClass -> view
|
|
|
|
|
private Map<String, ResultView> resultViewMap = new ConcurrentHashMap<String, ResultView>();
|
|
|
|
|
|
|
|
|
|
private static ResultViewResolver viewResolver;
|
|
|
|
@ -32,13 +37,13 @@ public class ResultViewResolver {
|
|
|
|
|
|
|
|
|
|
private void registerResultViews() {
|
|
|
|
|
try {
|
|
|
|
|
registerView(new StatusModel(), new StatusView());
|
|
|
|
|
registerView(new VersionModel(), new VersionView());
|
|
|
|
|
registerView(new MessageModel(), new MessageView());
|
|
|
|
|
registerView(new HelpModel(), new HelpView());
|
|
|
|
|
//registerView(new HistoryModel(), new HistoryView());
|
|
|
|
|
registerView(new EchoModel(), new EchoView());
|
|
|
|
|
registerView(new CatModel(), new CatView());
|
|
|
|
|
registerView(StatusView.class);
|
|
|
|
|
registerView(VersionView.class);
|
|
|
|
|
registerView(MessageView.class);
|
|
|
|
|
registerView(HelpView.class);
|
|
|
|
|
//registerView(HistoryView.class);
|
|
|
|
|
registerView(EchoView.class);
|
|
|
|
|
registerView(CatView.class);
|
|
|
|
|
} catch (Throwable e) {
|
|
|
|
|
logger.error("register result view failed", e);
|
|
|
|
|
}
|
|
|
|
@ -47,20 +52,55 @@ public class ResultViewResolver {
|
|
|
|
|
private ResultViewResolver() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// public void registerView(Class<? extends ExecResult> resultClass, ResultView view) throws IllegalAccessException, InstantiationException {
|
|
|
|
|
// ExecResult instance = resultClass.newInstance();
|
|
|
|
|
// this.registerView(instance.getType(), view);
|
|
|
|
|
// }
|
|
|
|
|
public void registerView(Class modelClass, ResultView view) {
|
|
|
|
|
//TODO 检查model的type是否重复,减少复制代码带来的bug
|
|
|
|
|
this.resultViewMap.put(modelClass.getName(), view);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public <T extends ResultModel> void registerView(T resultObject, ResultView view) {
|
|
|
|
|
this.registerView(resultObject.getType(), view);
|
|
|
|
|
public void registerView(ResultView view) {
|
|
|
|
|
Class modelClass = getModelClass(view);
|
|
|
|
|
if (modelClass == null) {
|
|
|
|
|
throw new NullPointerException("model class is null");
|
|
|
|
|
}
|
|
|
|
|
this.registerView(modelClass, view);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void registerView(Class<? extends ResultView> viewClass) {
|
|
|
|
|
ResultView view = null;
|
|
|
|
|
try {
|
|
|
|
|
view = viewClass.newInstance();
|
|
|
|
|
} catch (Throwable e) {
|
|
|
|
|
throw new RuntimeException("create view instance failure, viewClass:" + viewClass, e);
|
|
|
|
|
}
|
|
|
|
|
this.registerView(view);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void registerView(String resultType, ResultView view) {
|
|
|
|
|
resultViewMap.put(resultType, view);
|
|
|
|
|
public ResultView getResultView(ResultModel model) {
|
|
|
|
|
return resultViewMap.get(model.getClass().getName());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public ResultView getResultView(String resultType) {
|
|
|
|
|
return resultViewMap.get(resultType);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get model class of result view
|
|
|
|
|
*
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static <V extends ResultView> Class getModelClass(V view) {
|
|
|
|
|
//类反射获取子类的draw方法第二个参数的ResultModel具体类型
|
|
|
|
|
Class<? extends ResultView> viewClass = view.getClass();
|
|
|
|
|
Method[] declaredMethods = viewClass.getDeclaredMethods();
|
|
|
|
|
for (int i = 0; i < declaredMethods.length; i++) {
|
|
|
|
|
Method method = declaredMethods[i];
|
|
|
|
|
if (method.getName().equals("draw")) {
|
|
|
|
|
Class<?>[] parameterTypes = method.getParameterTypes();
|
|
|
|
|
if (parameterTypes.length == 2
|
|
|
|
|
&& parameterTypes[0] == CommandProcess.class
|
|
|
|
|
&& parameterTypes[1] != ResultModel.class
|
|
|
|
|
&& ResultModel.class.isAssignableFrom(parameterTypes[1])) {
|
|
|
|
|
return parameterTypes[1];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|