
smartrics.rest.test.fitnesse.fixture.HttpServer Maven / Gradle / Ivy
/* Copyright 2015 Fabrizio Cannizzo
*
* This file is part of RestFixture.
*
* RestFixture (http://code.google.com/p/rest-fixture/) is free software:
* you can redistribute it and/or modify it under the terms of the
* GNU Lesser General Public License as published by the Free Software Foundation,
* either version 3 of the License, or (at your option) any later version.
*
* RestFixture is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with RestFixture. If not, see .
*
* If you want to contact the author please leave a comment here
* http://smartrics.blogspot.com/2008/08/get-fitnesse-with-some-rest.html
*/
package smartrics.rest.test.fitnesse.fixture;
import javax.servlet.http.HttpServlet;
import org.mortbay.jetty.Connector;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.bio.SocketConnector;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.ServletHolder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Wrapper to jetty providing the sample application used by RestFixture CATs.
*
* @author smartrics
*
*/
public class HttpServer {
private static final Logger LOG = LoggerFactory.getLogger(HttpServer.class);
private Server server = null;
private int port;
/**
* @param port the server port where clients need to connec to.
*/
public HttpServer(int port) {
server = new Server();
server.setStopAtShutdown(true);
setPort(port);
}
protected Server getServer() {
return server;
}
/**
* stops the server.
* @return a stop message.
*/
public String stop() {
String ret = null;
LOG.debug("Stopping jetty in port " + getPort());
try {
getServer().stop();
// Wait for 3 seconds to stop
int watchdog = 30;
while (!getServer().isStopped() && watchdog > 0) {
Thread.sleep(100);
watchdog--;
}
ret = "OK";
} catch (Exception e) {
ret = "Failed stopping http server: " + e.getMessage();
}
if (!getServer().isStopped()) {
ret = "Failed stopping http server after 30 seconds wait";
}
return ret;
}
private void setPort(int port) {
LOG.debug("Adding socket connector to Jetty on port " + port);
Connector connector = createHttpConnector(port);
addConnector(port, connector);
this.port = port;
}
private void addConnector(int port, Connector connector) {
boolean found = false;
Connector[] cArray = getServer().getConnectors();
if (cArray != null) {
for (Connector c : cArray) {
if (c.getPort() == port) {
found = true;
break;
}
}
}
if (!found) {
// Configure port.
getServer().addConnector(connector);
}
}
private Connector createHttpConnector(int port) {
Connector connector = new SocketConnector();
connector.setPort(port);
return connector;
}
public int getPort() {
return port;
}
public String start() {
String ret = null;
LOG.debug("Starting jetty in port " + getPort());
try {
getServer().start();
// Wait for 3 seconds to start
int watchdog = 30;
while (!getServer().isRunning() && !getServer().isStarted() && watchdog > 0) {
Thread.sleep(100);
watchdog--;
}
ret = "OK";
} catch (Exception e) {
ret = "Failed starting http server: " + e.getMessage();
LOG.error(ret, e);
}
if (!getServer().isRunning()) {
ret = "Failed to start http server after waiting 30 seconds";
}
return ret;
}
public boolean isStarted() {
return server.isStarted();
}
public boolean isStopped() {
return server.isStopped();
}
public void join() {
try {
getServer().join();
} catch (InterruptedException e) {
throw new IllegalStateException("Interruption occurred!", e);
}
}
public void addServlet(HttpServlet servlet, String ctxRoot) {
Context ctx = new Context(server, ctxRoot, Context.SESSIONS);
ctx.addServlet(new ServletHolder(servlet), "/*");
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy