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 instanceObjectClass; private Class 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) clazz; } else if (SingletonHandler.class.isAssignableFrom(clazz)) { //1.2. 如果是只能单例的HttpObject singletonObjectClass = (Class) 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; } }