package br.com.caelum.calopsita.tasks; import java.io.FileWriter; import java.io.ObjectInputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; import org.mortbay.jetty.Handler; import org.mortbay.jetty.Server; import org.mortbay.jetty.handler.DefaultHandler; import org.mortbay.jetty.handler.HandlerCollection; import org.mortbay.jetty.webapp.WebAppContext; public class JettyStartTask extends Task { static final int SHUTDOWN = 1; private final List<Context> contexts = new ArrayList<Context>(); public void setWaitForShutdown(boolean waitForShutdown) { this.waitForShutdown = waitForShutdown; } private boolean waitForShutdown; private int port; private String databasePort; private Server server; public void setPort(int port) { this.port = port; } public static void main(String[] args) throws Exception { final JettyStartTask task = new JettyStartTask(); task.setPort(Integer.parseInt(args[0])); FileWriter fw = new FileWriter("log_jetty_" + task.port); PrintWriter pw = new PrintWriter(fw, true); task.setDatabasePort(args[1]); task.setWaitForShutdown(false); Context ctx = new Context(); ctx.setContext("/calopsita"); ctx.setWar(args[2]); task.addContext(ctx); Thread t = new Thread() { @Override public void run() { task.execute(); } }; t.start(); ServerSocket ss = new ServerSocket(task.port + 100); pw.println("Started and waiting for socket shutdown"); while (true) { Socket s = ss.accept(); pw.println("Accepted a new socket"); ObjectInputStream ois = new ObjectInputStream(s.getInputStream()); int val = ois.readInt(); pw.println("Read " + val); s.close(); if (val == SHUTDOWN) { break; } } pw.println("Stopping server at port " + task.port); task.server.stop(); pw.println("Stopped server at port " + task.port); pw.close(); fw.close(); } @Override public void execute() throws BuildException { this.server = new Server(port); try { Thread.currentThread().setContextClassLoader( this.getClass().getClassLoader()); List<Handler> lista = new ArrayList<Handler>(); for (Context ctx : this.contexts) { WebAppContext wac = new WebAppContext(); wac.setAttribute("databasePort", this.databasePort); wac.setParentLoaderPriority(true); wac.setContextPath(ctx.getContext()); wac.setWar(ctx.getWar()); lista.add(wac); } lista.add(new DefaultHandler()); HandlerCollection handlers = new HandlerCollection(); handlers.setHandlers(lista.toArray(new Handler[] {})); server.setHandler(handlers); server.setStopAtShutdown(true); server.start(); if (waitForShutdown) { server.join(); } } catch (Exception e) { e.printStackTrace(); throw new BuildException(e); } } public void addContext(Context ctx) { this.contexts.add(ctx); } public void setDatabasePort(String databasePort) { this.databasePort = databasePort; } }