package org.qrone.r7.handler;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.qrone.r7.resolver.URIResolver;
public class PathFinderHandler implements URIHandler {
private URIHandler handler;
private URIResolver resolver;
public PathFinderHandler(URIHandler handler, URIResolver resolver) {
this.handler = handler;
this.resolver = resolver;
}
@Override
public boolean handle(HttpServletRequest request, HttpServletResponse response,
String uri, String path, String leftpath, List<String> arg) {
if(path.endsWith("/")){
if(handler.handle(request, response, uri + "index", path + "index", leftpath, arg))
return true;
}else{
if(handler.handle(request, response, uri, path, leftpath, arg))
return true;
}
return rhandle(request, response, "", path, uri, new ArrayList<String>());
}
public boolean rhandle(HttpServletRequest request, HttpServletResponse response,
String uri, String path, String leftpath, List<String> arg) {
// uri=/qrone/test1/test2 path=/qrone leftpath=/test1/test2/my
int index = leftpath.indexOf('/',1);
if(index > 0){
if(resolver.existPath(uri + "/_any")){
arg.add(leftpath.substring(1,index));
if(handler.handle(request, response, uri + "/_any", path, leftpath, arg))
return true;
// uri=/qrone/test1/test2 path=/qrone/_any leftpath=/test2
return rhandle(request, response, uri + "/_any", path, leftpath.substring(index), arg);
}else{
String left = uri + leftpath.substring(0,index);
if(handler.handle(request, response, left, path, leftpath, arg))
return true;
// uri=/qrone/test1/test2 path=/qrone/test1 leftpath=/test2
return rhandle(request, response, left, path, leftpath.substring(index), arg);
}
}else{
if(handler.handle(request, response, uri + leftpath, path, "", arg))
return true;
}
return false;
}
}