package foundation.route;
|
|
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.Method;
|
|
import foundation.handler.BaseHandler;
|
import foundation.handler.IHandler;
|
import foundation.handler.SingletonHandler;
|
import foundation.json.IJSONWriter;
|
|
|
public class ControllerRoute extends Route {
|
|
private Class<? extends IHandler> toClass;
|
private Class<? extends BaseHandler> instanceObjectClass;
|
private Class<? extends SingletonHandler> singletonObjectClass;
|
private Method getSingletonInstanceMethod;
|
|
|
public ControllerRoute(String from, String className) throws Exception {
|
super(RouteBrowseCode.Handler, from);
|
|
routeType = RouteType.Controller;
|
remark = from + " --> " + className;
|
|
setCallableClassName(className);
|
}
|
|
@SuppressWarnings({ "rawtypes", "unchecked" })
|
public void setCallableClassName(String classname) throws Exception {
|
//1.
|
Class clazz = Class.forName(classname);
|
|
if (SingletonHandler.class.isAssignableFrom(clazz)) {
|
//1.2. 如果是只能单例的HttpObject
|
singletonObjectClass = (Class<? extends SingletonHandler>) clazz;
|
getSingletonInstanceMethod = clazz.getDeclaredMethod("getInstance");
|
}
|
else if (BaseHandler.class.isAssignableFrom(clazz)) {
|
//1.1. 如果是可以多实例化的HttpObject
|
instanceObjectClass = (Class<? extends BaseHandler>) clazz;
|
}
|
else {
|
throw new Exception("error callable class: " + clazz);
|
}
|
}
|
|
public IHandler getToObject() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
if (instanceObjectClass != null) {
|
return instanceObjectClass.newInstance();
|
}
|
|
if (singletonObjectClass != null) {
|
return (IHandler) getSingletonInstanceMethod.invoke(null);
|
}
|
|
return null;
|
}
|
|
public Class<? extends IHandler> getToClass() {
|
return toClass;
|
}
|
|
@Override
|
public void onWriteJSON(IJSONWriter writer) {
|
//1. write from
|
writer.write("from", from);
|
|
// write to
|
Class<?> clazz = toClass;
|
|
if (clazz == null) {
|
clazz = instanceObjectClass;
|
}
|
|
if (clazz == null) {
|
clazz = singletonObjectClass;
|
}
|
|
if (clazz == null) {
|
writer.writeNull("to");
|
return;
|
}
|
|
writer.write("to", clazz.getName());
|
}
|
|
@Override
|
protected String formateFrom(String from) {
|
from = from.toLowerCase();
|
return from;
|
}
|
|
@Override
|
public String toString() {
|
return remark;
|
}
|
}
|