package net.varkhan.serv.http; import net.varkhan.base.management.logging.compat.log4j.Log; import net.varkhan.base.management.logging.compat.log4j.LogManager; import net.varkhan.base.management.state.SimpleStateCheck; import net.varkhan.base.management.state.health.HealthLevel; import net.varkhan.base.management.state.health.HealthState; import net.varkhan.base.management.state.lifecycle.LifeLevel; import net.varkhan.base.management.state.lifecycle.LifeState; import net.varkhan.serv.BaseServer; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import javax.servlet.http.HttpServlet; /** * <b></b>. * <p/> * * @author varkhan * @date 11/15/14 * @time 6:10 PM */ public abstract class WebServer extends BaseServer { private static final Log log=LogManager.getLogger(HttpServer.class); protected final ServletContextHandler context; protected Server server = null; public WebServer() { server=new Server(); context=new ServletContextHandler(ServletContextHandler.SESSIONS); server.setHandler(context); } public void addServlet(String path, HttpServlet serv) { context.addServlet(new ServletHolder(serv), path); } public void configure() throws Exception { if(configured) return; health.add(new SimpleStateCheck<HealthLevel,HealthState>("ServerThread", "If the main server thread is running", HealthLevel.MAJOR) { @Override public HealthState state() { if(server==null) return HealthState.FAILED; if(!server.isRunning()) return HealthState.FAILED; if(server.isFailed()) return HealthState.FAILED; return HealthState.HEALTHY; } @Override public String reason() { if(server==null) return name+" is not defined"; if(!server.isRunning()) return name+" is not running"; if(server.isFailed()) return name+" is failed"; return name+" is running"; } @Override public void update() { } }); status.add(new SimpleStateCheck<LifeLevel,LifeState>("ServerThread","If the main server thread is running",LifeLevel.SYSTEM) { @Override public LifeState state() { if(server==null) return LifeState.STOPPED; if(server.isStarting()) return LifeState.STARTING; if(server.isStarted()) return LifeState.RUNNING; if(server.isStopping() || "STOPPING".equalsIgnoreCase(server.getState())) return LifeState.STOPPING; if(server.isStopped() || "STOPPED".equalsIgnoreCase(server.getState())) return LifeState.STOPPED; if(!server.isRunning()) return LifeState.STOPPED; return LifeState.RUNNING; } @Override public String reason() { if(server==null) return name+" is not defined"; if(server.isStarting()) return name+" is starting"; if(server.isStarted()) return name+" is started"; if(server.isStopping()) return name+" is stopping"; if(server.isStopped()) return name+" is stopped"; if(!server.isRunning()) return name+" is not running"; if(server.isFailed()) return name+" is failed"; return name+" is in an unknown state"; } @Override public void update() { } }); super.configure(); } public void start() throws Exception { log.info(this.getClass().getSimpleName()+" starting"); synchronized(this) { configure(); server.start(); health.start(); status.start(); status.update(); health.update(); } log.info(this.getClass().getSimpleName()+" started"); } public void stop() throws Exception { log.info(this.getClass().getSimpleName()+" stopping"); synchronized(this) { server.stop(); health.stop(); status.stop(); status.update(); health.update(); } } public void join() throws Exception { Server sv; synchronized(this) { sv=server; } if(sv!=null) sv.join(); } }