package foundation.route;
|
|
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.Method;
|
|
import foundation.handler.Handler;
|
import foundation.handler.IHandler;
|
import foundation.handler.SingletonHandler;
|
import foundation.util.Util;
|
|
public class VirtualPath {
|
|
private RouteType type;
|
private String path;
|
private String resourceTarget;
|
private Class<? extends Handler> instanceObjectClass;
|
private Class<? extends SingletonHandler> singletonObjectClass;
|
private Method getSingletonInstanceMethod;
|
private String[] resourceSegments;
|
private String[] pathSegments;
|
|
|
public VirtualPath(String path, String target, String className) throws Exception {
|
this.path = path;
|
|
if (!Util.isEmpty(className)) {
|
this.type = RouteType.Controller;
|
this.resourceTarget = target;
|
setCallableClassName(className);
|
}
|
else {
|
this.type = RouteType.Resource;
|
this.resourceTarget = target.startsWith("/") ? target : "root/" + target;
|
}
|
|
resourceSegments = resourceTarget == null ? new String[0] : resourceTarget.split("/");
|
pathSegments = path == null ? new String[0] : path.split("/");
|
}
|
|
public IHandler getHttpObject() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
if (instanceObjectClass != null) {
|
return instanceObjectClass.newInstance();
|
}
|
|
if (singletonObjectClass != null) {
|
return (IHandler) getSingletonInstanceMethod.invoke(null);
|
}
|
|
return null;
|
}
|
|
@SuppressWarnings({ "rawtypes", "unchecked" })
|
public void setCallableClassName(String classname) throws Exception {
|
//1.
|
Class clazz = Class.forName(classname);
|
|
if (Handler.class.isAssignableFrom(clazz)) {
|
//1.1. 如果是可以多实例化的HttpObject
|
instanceObjectClass = (Class<? extends Handler>) clazz;
|
}
|
else if (SingletonHandler.class.isAssignableFrom(clazz)) {
|
//1.2. 如果是只能单例的HttpObject
|
singletonObjectClass = (Class<? extends SingletonHandler>) clazz;
|
getSingletonInstanceMethod = clazz.getDeclaredMethod("getInstance");
|
}
|
else {
|
throw new Exception("error callable class: " + clazz);
|
}
|
}
|
|
public RouteType getType() {
|
return type;
|
}
|
|
public String getResourceTarget() {
|
return resourceTarget;
|
}
|
|
@Override
|
public String toString() {
|
if (instanceObjectClass != null) {
|
return instanceObjectClass.getName();
|
}
|
|
if (singletonObjectClass != null) {
|
return singletonObjectClass.getName();
|
}
|
|
return resourceTarget;
|
}
|
|
public String getPath() {
|
return path;
|
}
|
|
public String[] getResourceSegments() {
|
return resourceSegments;
|
}
|
|
public String[] getPathSegments() {
|
return pathSegments;
|
}
|
|
}
|