package cloudone.cumulonimbus;
import cloudone.ApplicationInfo;
import cloudone.C1Services;
import cloudone.LifecycleService;
import cloudone.RuntimeInfo;
import cloudone.internal.ApplicationInfoImpl;
import cloudone.internal.LifecycleServiceImpl;
import cloudone.internal.RuntimeInfoImpl;
import org.apache.commons.cli.HelpFormatter;
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.net.URI;
/**
* Main class for Cumulonimbus application.
*
* @author Martin Mares (martin.mares at oracle.com)
*/
public final class Main {
private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
private static final int DEFAULT_PORT = 4242;
private final CumulonimbusApp cumulonimbusApp;
private final ApplicationInfo applicationInfo;
private Main(CumulonimbusApp cumulonimbusApp) {
this.cumulonimbusApp = cumulonimbusApp;
ApplicationInfo ai = null;
for (ApplicationInfo applicationInfo : C1Services.getInstance().getRuntimeInfo().getApplicationInfos()) {
if (applicationInfo.getApplication() == cumulonimbusApp) {
ai = applicationInfo;
break;
}
}
if (ai == null) {
throw new RuntimeException("Cannot find application info for Cumulonimbus app!");
}
if (ai.getPort() < 0) {
((ApplicationInfoImpl) ai).setPort(DEFAULT_PORT);
}
this.applicationInfo = ai;
}
private void run() throws Exception {
RuntimeInfo runtimeInfo = C1Services.getInstance().getRuntimeInfo();
if (runtimeInfo.getCommandLine().hasOption('h')) {
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("CloudOne Cumulonimbus Application", runtimeInfo.getCmdlOptions());
return;
}
LifecycleServiceImpl lifecycleService = (LifecycleServiceImpl) C1Services.getInstance().getLifecycleService();
//Start Cumulonimbus
cumulonimbusApp.init();
LOGGER.info("STARTING: " + runtimeInfo.getServiceFullName() + ", Application " + applicationInfo.getName());
final ResourceConfig resourceConfig = ResourceConfig.forApplication(cumulonimbusApp);
final URI uri = URI.create("http://localhost:" + applicationInfo.getPort() + "/");
final HttpServer server = GrizzlyHttpServerFactory.createHttpServer(uri, resourceConfig);
final File portFile = new File(cumulonimbusApp.getCumulonimbusDir(), "port.txt");
try (Writer writer = new FileWriter(portFile)) {
writer.write(String.valueOf(applicationInfo.getPort()));
}
lifecycleService.registerListener(new LifecycleService.LifecycleListener() {
@Override
public void onStart() {
}
@Override
public void onShutdown() {
LOGGER.info("--------------- SHUTDOWN: " + applicationInfo.getName() + " ---------------");
portFile.delete();
server.shutdown();
applicationInfo.getApplication().shutDown();
}
});
cumulonimbusApp.started();
LOGGER.info("--------------- " + applicationInfo.getName() + " is RUNNING on port " + applicationInfo.getPort() + " ---------------");
lifecycleService.start();
//Wait for stop signal on the application
lifecycleService.awaitForShutdown();
}
public static void main(String[] args) {
try {
CumulonimbusApp app = new CumulonimbusApp();
(new RuntimeInfoImpl.Builder())
.addApplication(app)
.processCommandLineArgs(args)
.build();
Main instance = new Main(app);
instance.run();
} catch (Exception exc) {
LOGGER.error("General exception in main thread!", exc);
}
}
}