package org.kisst.gft.admin.rest;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.LinkedHashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.kisst.gft.GftContainer;
import org.kisst.gft.GftWrapper;
import org.kisst.gft.admin.BaseServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RestServlet extends BaseServlet {
private final Logger logger=LoggerFactory.getLogger(RestServlet.class);
private final String prefix;
private final LinkedHashMap<String, Resource> urls=new LinkedHashMap<String, Resource>();
public RestServlet(GftWrapper wrapper, String path) {
super(wrapper);
this.prefix=path;
}
public String getPrefix() { return prefix; }
public void map(String path, Resource res) { urls.put(path, res); }
public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException {
String url=request.getRequestURI();
String path=url.substring(this.prefix.length());
while (path.startsWith("/"))
path=path.substring(1);
int pos=path.indexOf('/');
String name=path;
String remainder=null;
if (pos>0) {
name=path.substring(0,pos);
remainder=path.substring(pos+1);
}
logger.info("searching for resource {}",name);
handle(urls.get(name), remainder,request, response);
}
public void handle(Resource res, String path, HttpServletRequest request, HttpServletResponse response) {
String method=request.getMethod();
if (request.getParameter("HTTP_METHOD_OVERRIDE")!=null)
method=request.getParameter("HTTP_METHOD_OVERRIDE");
if ("GET".equals(method))
doGet(res,path, request, response);
else if ("POST".equals(method))
doPost(res, path, request, response);
else if ("PUT".equals(method))
doPut(res, path, request, response);
else if ("DELETE".equals(method))
doDelete(res, path, request, response);
else
throw new RuntimeException("Unknown HTTP method "+method);
}
private PrintWriter getWriter(HttpServletResponse response) {
response.setContentType("text/html;charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK);
try {
return response.getWriter();
}
catch (IOException e) { throw new RuntimeException(e); }
}
protected void doGet(Resource res, String path, HttpServletRequest request, HttpServletResponse response) {
PrintWriter out = getWriter(response);
try {
Object obj=res;
if (path!=null && path.length()!=0)
obj=res.get(path);
out.write("<pre>\n");
if (obj instanceof Representable)
out.write( ((Representable)obj).getRepresentation());
else
out.write(""+obj);
out.write("</pre>\n");
}
finally { out.close(); }
}
protected void doPost(Resource res, String path, HttpServletRequest request, HttpServletResponse response) {
throw new RuntimeException("not implemented yet");
}
protected void doPut(Resource res, String path, HttpServletRequest request, HttpServletResponse response) {
throw new RuntimeException("not implemented yet");
}
protected void doDelete(Resource res, String path, HttpServletRequest request, HttpServletResponse response) {
throw new RuntimeException("not implemented yet");
}
}