/*
* Copyright (c) 2012, Codename One. All rights reserved.
*/
package com.codename1.designer;
import com.codename1.server.EchoServlet;
import com.codename1.server.LivePreviewServlet;
import java.io.IOException;
import java.net.ServerSocket;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
/**
* Local HTTP server currently based on Jetty providing proxy functionality for devices
* thus allowing faster connection without cloud round trip for devices residing within
* the same IP range.
*
* @author Shai Almog
*/
public class LocalServer {
private static int port = -1;
public static int getPort() {
if(port == -1) {
int currentPort = 9000;
while(true) {
ServerSocket ss = null;
try {
ss = new ServerSocket(currentPort);
ss.setReuseAddress(true);
} catch (Throwable e) {
currentPort++;
continue;
} finally {
try {
ss.close();
} catch (Throwable e) {
/* should not be thrown */
}
}
port = currentPort;
break;
}
}
return port;
}
private static boolean started;
public static void startServer(final JComponent root) {
if(started) {
return;
}
started = true;
new Thread() {
public void run() {
try {
Server server = new Server(getPort());
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
server.setHandler(context);
context.addServlet(new ServletHolder(new EchoServlet()),"/echo");
context.addServlet(new ServletHolder(new LivePreviewServlet()),"/preview");
server.start();
server.join();
} catch (Throwable ex) {
ex.printStackTrace();
JOptionPane.showMessageDialog(root, "Error in HTTP Local Server: " + ex, "Local HTTP Server Error", JOptionPane.ERROR_MESSAGE);
}
}
}.start();
}
}