package com.coveo.blitz.main;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import org.apache.thrift.protocol.TJSONProtocol;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TServlet;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TServerTransport;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.coveo.blitz.reference.ReferenceServer;
import com.coveo.blitz.thrift.AwesomeService;
import com.thetransactioncompany.cors.CORSFilter;
public class ReferenceMain
{
private static final Logger logger = LoggerFactory.getLogger(ReferenceMain.class);
private static class ServerRunner implements Runnable
{
private TServer server;
public ServerRunner(TServer server)
{
this.server = server;
}
@Override
public void run()
{
server.serve();
}
}
private List<Runnable> joinMethods = new ArrayList<>();
public static void main(String[] args) throws Exception
{
ReferenceMain main = new ReferenceMain();
main.startServer1();
main.startServer2();
main.join();
}
private ReferenceServer referenceServer;
public ReferenceMain() throws IOException
{
referenceServer = new ReferenceServer();
if (System.getProperty("listen") == null) {
String filePath = System.getProperty("file");
if (filePath == null) {
throw new RuntimeException("Parameter 'file' is missing. Use -Dfile=path/to/file.json, -Dfile=path/to/folder/ or use -Dlisten if you want to wait for files from the server.");
}
if (filePath.endsWith("json")) {
referenceServer.loadDataFromJson(Paths.get(filePath));
} else if (filePath.endsWith("/")) {
Files.list(Paths.get(filePath)).forEach(referenceServer::loadDataFromJson);
}
}
}
public void join()
{
joinMethods.forEach(Runnable::run);
}
public void startServer1() throws Exception
{
Server server = new Server(9091);
ServletHandler handler = new ServletHandler();
AwesomeService.Processor<AwesomeService.Iface> processor = new AwesomeService.Processor<>(referenceServer);
ServletHolder holder = new ServletHolder(new TServlet(processor, new TJSONProtocol.Factory()));
handler.addFilterWithMapping(CORSFilter.class, "/*", 0);
handler.addServletWithMapping(holder, "/*");
server.setHandler(handler);
server.start();
logger.info("Started JSON interface.");
joinMethods.add(() -> {
try {
server.join();
} catch (InterruptedException ignored) {
}
});
}
public void startServer2() throws Exception
{
AwesomeService.Processor<AwesomeService.Iface> processor = new AwesomeService.Processor<>(referenceServer);
TServerTransport serverTransport = new TServerSocket(9090);
TServer server = new TSimpleServer(new TSimpleServer.Args(serverTransport).processor(processor));
ServerRunner serverRunner = new ServerRunner(server);
Thread serverThread = new Thread(serverRunner);
serverThread.start();
logger.info("Started binary interface");
joinMethods.add(() -> {
try {
serverThread.join();
} catch (InterruptedException ignored) {
}
});
}
}