package net.unit8.waitt.feature.admin;
import com.sun.net.httpserver.HttpServer;
import net.unit8.waitt.api.ConfigurableFeature;
import net.unit8.waitt.api.EmbeddedServer;
import net.unit8.waitt.api.ServerMonitor;
import net.unit8.waitt.api.configuration.Feature;
import net.unit8.waitt.api.configuration.WebappConfiguration;
import net.unit8.waitt.feature.admin.routes.AppAction;
import net.unit8.waitt.feature.admin.routes.ReloadAction;
import net.unit8.waitt.feature.admin.routes.ServerAction;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author kawasima
*/
public class AdminServer implements ServerMonitor, ConfigurableFeature {
private static final Logger LOG = Logger.getLogger(AdminServer.class.getName());
final ExecutorService executorService = Executors.newSingleThreadExecutor();
HttpServer adminServer;
String rrdPath;
final AdminApplication app = new AdminApplication();
int adminPort = 1192;
private long startedAt;
@Override
public void config(WebappConfiguration config) {
app.addRoutes(new AppAction(config));
for (Feature feature : config.getFeatures()) {
if ("waitt-admin".equals(feature.getArtifactId()) && "net.unit8.waitt.feature".equals(feature.getGroupId())) {
Map<String, String> featureConfig = feature.getConfiguration();
if (featureConfig != null) {
String portStr = featureConfig.get("admin.port");
if (portStr != null) {
adminPort = Integer.parseInt(portStr);
}
}
}
}
rrdPath = "target/rrd/" + config.getApplicationName() + ".rrd";
}
@Override
public void init(EmbeddedServer server) {
executorService.execute(new MonitoringPost(rrdPath));
}
@Override
public void start(EmbeddedServer server) {
startedAt = System.currentTimeMillis();
app.addRoutes(new ServerAction(server, rrdPath));
app.addRoutes(new ReloadAction(server));
try {
adminServer = HttpServer.create(new InetSocketAddress(adminPort), 0);
adminServer.createContext("/", app);
adminServer.start();
} catch (IOException ex) {
LOG.log(Level.SEVERE, "Failed to start an admin server.", ex);
}
}
@Override
public void stop() {
}
}