package com.oreilly.demo.android.pa.clientserver.server;
import java.util.Set;
import java.util.HashSet;
import javax.servlet.Servlet;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import com.oreilly.demo.android.pa.clientserver.server.servlet.ISHttpServletType;
public final class ServletUtil {
public static final String DEFCONTEXTPATH = "/";
private Server server;
private String contextpath = DEFCONTEXTPATH;
private boolean loaded = false;
private Set<String> servscache = null;
public ServletUtil() { }
public void setServer(Server s) throws Exception {
if(server != null) throw new Exception("Server Already Set. This is a One Time Deal");
server = s;
ServerStatic.debug("Server set");
if(!loaded && servscache != null) {
loadServlets(servscache);
}
}
public void setContextPath(String s) {
if(s == null) contextpath = DEFCONTEXTPATH;
else contextpath = s;
ServerStatic.debug("Contextpath set : "+contextpath);
}
public boolean isLoaded() { return loaded; }
public boolean loadServlets(Set<String> servs) {
if(loaded || servs == null || servs.isEmpty()) return false;
if(server == null) {
servscache = servs;
return false;
}
servscache = null;
int numloaded = 0;
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath(contextpath);
HashSet<String> paths = new HashSet<String>();
// load servlets
for(String s: servs) {
try {
Servlet servlet = (Servlet) Class.forName(s).newInstance();
String path = servlet.getClass().getName();
if(servlet instanceof ISHttpServletType) path = ((ISHttpServletType) servlet).getPath();
if(paths.contains(path)) throw new Exception(path+" already exists");
paths.add(path);
context.addServlet(new ServletHolder(servlet),path);
numloaded++;
ServerStatic.info("Added to "+path+" :: "+s);
} catch (Throwable e) {
ServerStatic.error("Failed to load "+s, e);
}
}
server.setHandler(context);
ServerStatic.info("Set ServletContextHandler : Load Complete ["+numloaded+"/"+servs.size()+"]");
loaded = true;
return true;
}
}