package org.kantega.revoc.web;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.log.AbstractLogger;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.websocket.server.WebSocketServerFactory;
import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
import org.kantega.revoc.logging.JettyRevocLogger;
import org.kantega.revoc.source.CompondSourceSource;
import org.kantega.revoc.source.DirectorySourceSource;
import org.kantega.revoc.source.MavenProjectSourceSource;
import org.kantega.revoc.source.MavenSourceArtifactSourceSource;
import java.awt.*;
import java.io.File;
import java.net.NetworkInterface;
import java.net.URI;
import static java.util.Collections.list;
/**
*
*/
public class JettyStarter {
public void start(int port, String[] packages) throws Exception {
Log.setLog(new JettyRevocLogger());
Server server = new Server(port);
ServletContextHandler ctx = new ServletContextHandler();
ctx.setContextPath("/");
ctx.addServlet(RevocWebSocketServlet.class, "/ws").setInitOrder(1);
ctx.setInitParameter(WebSocketServletFactory.class.getName(), WebSocketServletFactory.class.getName());
ctx.setInitParameter(WebSocketServerFactory.class.getName(), WebSocketServerFactory.class.getName());
ctx.addServlet(new ServletHolder(new SourcesServlet(new CompondSourceSource(
new DirectorySourceSource(),
new MavenProjectSourceSource(),
new MavenSourceArtifactSourceSource()), packages)), "/sources/*");
ctx.addServlet(new ServletHolder(new JsonServlet()), "/json");
ResourceManager resourceManager = new ResourceManager();
ctx.addServlet(new ServletHolder(new ResourceServlet(resourceManager, "revoc.html")), "");
ctx.addServlet(new ServletHolder(new AssetsServlet(resourceManager)), "/assets/*");
ctx.addServlet(new ServletHolder(new WebjarsServlet()), "/webjars/*");
server.setHandler(ctx);
server.setStopAtShutdown(true);
server.start();
}
public void startSetup(File agentFile, int port) throws Exception {
Log.setLog(new NullLogger());
Server server = new Server(port);
ServletContextHandler ctx = new ServletContextHandler();
ResourceManager resourceManager = new ResourceManager();
ctx.addServlet(new ServletHolder(new ResourceServlet(resourceManager, "setup.html")), "");
ctx.addServlet(new ServletHolder(new AssetsServlet(resourceManager)), "/assets/*");
ctx.addServlet(new ServletHolder(new WebjarsServlet()), "/webjars/*");
ctx.addServlet(new ServletHolder(new AgentFileServlet(agentFile)), "/agent-file");
ctx.addServlet(new ServletHolder(new MavenRepoServlet()), "/maven-repo");
ctx.addServlet(new ServletHolder(new FinishedServlet(server)), "/finished");
server.setHandler(ctx);
server.start();
ServerConnector connector = (ServerConnector) server.getConnectors()[0];
URI uri = new URI("http://" + getAddress() +":" + connector.getLocalPort() +"/");
System.out.println();
System.out.println("Revoc is waiting for you here:");
System.out.println();
System.out.println(" " + uri);
System.out.println();
if(!GraphicsEnvironment.isHeadless()) {
Desktop desktop = Desktop.getDesktop();
if(desktop.isSupported(Desktop.Action.BROWSE)) {
desktop.browse(uri);
}
}
server.join();
}
private String getAddress() throws Exception {
for(NetworkInterface ni : list(NetworkInterface.getNetworkInterfaces())) {
if(!ni.isLoopback()) {
return ni.getInetAddresses().nextElement().getHostName();
}
}
for(NetworkInterface ni : list(NetworkInterface.getNetworkInterfaces())) {
if(ni.isLoopback()) {
return ni.getInetAddresses().nextElement().getHostName();
}
}
return "127.0.0.1";
}
private class NullLogger extends AbstractLogger {
@Override
protected Logger newLogger(String fullname) {
return new NullLogger();
}
@Override
public String getName() {
return null;
}
@Override
public void warn(String msg, Object... args) {
}
@Override
public void warn(Throwable thrown) {
}
@Override
public void warn(String msg, Throwable thrown) {
}
@Override
public void info(String msg, Object... args) {
}
@Override
public void info(Throwable thrown) {
}
@Override
public void info(String msg, Throwable thrown) {
}
@Override
public boolean isDebugEnabled() {
return false;
}
@Override
public void setDebugEnabled(boolean enabled) {
}
@Override
public void debug(String msg, Object... args) {
}
@Override
public void debug(String msg, long arg) {
}
@Override
public void debug(Throwable thrown) {
}
@Override
public void debug(String msg, Throwable thrown) {
}
@Override
public void ignore(Throwable ignored) {
}
}
}