package codeine;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import codeine.configuration.Links;
import codeine.configuration.PathHelper;
import codeine.db.mysql.MysqlHostSelector;
import codeine.db.mysql.NearestMysqlHostSelectorPeer;
import codeine.executer.PeriodicExecuter;
import codeine.executer.Task;
import codeine.jsons.info.CodeineRuntimeInfo;
import codeine.model.Constants;
import codeine.servlets.CodeinePeerServletModule;
import codeine.utils.FilesUtils;
import codeine.utils.TextFileUtils;
import codeine.utils.ThreadUtils;
import codeine.utils.network.InetUtils;
import com.google.common.collect.Lists;
import com.google.inject.Module;
public class CodeinePeerBootstrap extends AbstractCodeineBootstrap
{
private final Logger log = Logger.getLogger(CodeinePeerBootstrap.class);
private String hostname = InetUtils.getLocalHost().getHostName();
public static void main(String[] args)
{
boot(Component.PEER, CodeinePeerBootstrap.class);
}
@Override
protected void execute() throws Exception
{
CodeineRuntimeInfo peerRuntimeInfo = injector().getInstance(CodeineRuntimeInfo.class);
PathHelper pathHelper = injector().getInstance(PathHelper.class);
startMysqlSelectorThread();
log.info("creating local workarea: " + Constants.getHostWorkareaDir());
FilesUtils.mkdirs(Constants.getHostWorkareaDir());
log.info("writing pid " + peerRuntimeInfo.pid() + " to file " + pathHelper.getPidFile());
TextFileUtils.setContents(pathHelper.getPidFile(), String.valueOf(peerRuntimeInfo.pid()));
int port = peerRuntimeInfo.port();
log.info("writing port " + port + " to file " + pathHelper.getPortFile());
TextFileUtils.setContents(pathHelper.getPortFile(), String.valueOf(port));
log.info("Hostname " + hostname);
injector().getInstance(SnoozeKeeper.class).snoozeAll();
PeriodicExecuter configurationGetterExecuter = new PeriodicExecuter(ConfigurationGetter.INTERVAL, injector().getInstance(ConfigurationGetter.class));
configurationGetterExecuter.runInThread();
configurationGetterExecuter.waitForFirstExecution(60000);
log.info("starting PeerStatusChangedUpdater");
ThreadUtils.createThread(injector().getInstance(PeerStatusChangedUpdater.class)).start();
}
private void startMysqlSelectorThread() {
new PeriodicExecuter(NearestMysqlHostSelectorPeer.INTERVAL, (Task) injector().getInstance(MysqlHostSelector.class)).runInThread();
}
@Override
protected void specificCreateFileServer(ContextHandlerCollection contexts)
{
PathHelper pathHelper = injector().getInstance(PathHelper.class);
Links links = injector().getInstance(Links.class);
addHandler(links.getNodeMonitorOutputContextPathAllProjects(), pathHelper.getMonitorOutputDirAllProjects(), contexts);
}
@Override
protected List<Module> getGuiceModules() {
return Lists.<Module>newArrayList(new CodeinePeerModule(), new CodeinePeerServletModule());
}
@Override
public int getHttpPort() {
String portString = System.getProperty("codeinePeerPort");
int port = null == portString ? 0 : Integer.valueOf(portString);
return port;
}
@Override
protected int startServer(ContextHandlerCollection contexts) throws Exception {
if (0 != getHttpPort()) {
return super.startServer(contexts);
}
Server server = new Server(Constants.DEFAULT_PEER_PORT);
try {
return startServer(contexts, server);
} catch (Exception e) {
log.warn("could not bind to default port " + Constants.DEFAULT_PEER_PORT + " will fallback to random port", e);
server.stop();
}
server = new Server(0);
return startServer(contexts, server);
}
}