package io.cattle.platform.launcher.jetty;
import static io.cattle.platform.server.context.ServerContext.*;
import java.io.File;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.TimeZone;
import org.apache.commons.lang.StringUtils;
import org.eclipse.jetty.jmx.MBeanContainer;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.webapp.WebAppClassLoader;
import org.eclipse.jetty.webapp.WebAppContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
public static final String WEB_XML = "WEB-INF/web.xml";
public static final String OVERRIDE_WEB_XML = "WEB-INF/override-web.xml";
public static final String STATIC_WEB_XML = "WEB-INF/static-override-web.xml";
public static final String DEFAULT_WEB_XML = "WEB-INF/default-web.xml";
// private static final Logger log = LoggerFactory.getLogger(Main.class);
private static final Logger CONSOLE_LOG = LoggerFactory.getLogger("ConsoleStatus");
public static final String[] PREFIXES = new String[] { "code/packaging/app/src/main/webapp/", "src/main/webapp/", "" };
protected static URL findUrl(String suffix) throws IOException {
File file = findFile(suffix);
if (file != null) {
return file.toURI().toURL();
}
return Main.class.getResource("/" + suffix);
}
protected static File findFile(String suffix) {
for (String prefix : PREFIXES) {
File file = new File(prefix + suffix);
if (file.exists())
return new File(file.getAbsolutePath());
}
URL url = Main.class.getResource("/" + suffix);
if (url != null && "file".equals(url.getProtocol())) {
return new File(url.getPath());
}
return null;
}
protected static URL getContextRoot(URL webXml) throws IOException {
if (webXml != null) {
URLConnection connection = webXml.openConnection();
if (connection instanceof JarURLConnection) {
URL war = ((JarURLConnection) connection).getJarFileURL();
return new URL("jar", "", war.toExternalForm() + "!/WEB-INF/content");
}
}
return Main.class.getResource("");
}
protected static String getHttpPort() {
boolean proxyEmbedded = StringUtils.equals(HOST_API_PROXY_MODE_EMBEDDED, getHostApiProxyMode());
if(proxyEmbedded) {
String port = System.getenv("CATTLE_HTTP_PROXIED_PORT");
return port == null ? System.getProperty("cattle.http.proxied.port", "8081") : port;
} else {
String port = System.getenv("CATTLE_HTTP_PORT");
return port == null ? System.getProperty("cattle.http.port", "8080") : port;
}
}
public static void main(String... args) {
/*
* The world is better place without time zones. Well, at least for
* computers
*/
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
long start = System.currentTimeMillis();
try {
Server s = new Server();
HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.setRequestHeaderSize(16 * 1024);
httpConfig.setOutputBufferSize(512);
ServerConnector http = new ServerConnector(s, new HttpConnectionFactory(httpConfig));
http.setPort(Integer.parseInt(getHttpPort()));
s.setConnectors(new Connector[] {http});
MBeanContainer mbContainer = new MBeanContainer(ManagementFactory.getPlatformMBeanServer());
s.addEventListener(mbContainer);
s.addBean(mbContainer);
s.addBean(Log.getRootLogger());
WebAppContext context = new WebAppContext();
context.setThrowUnavailableOnStartupException(true);
File webXmlFile = findFile(WEB_XML);
URL webXml = findUrl(WEB_XML);
URL contextRoot = webXmlFile == null ? getContextRoot(webXml) : webXmlFile.getParentFile().getParentFile().toURI().toURL();
URL override = findUrl(OVERRIDE_WEB_XML);
if (override != null) {
context.setOverrideDescriptors(Arrays.asList(override.toExternalForm()));
}
URL defaultWebXml = findUrl(DEFAULT_WEB_XML);
if (defaultWebXml != null) {
context.setDefaultsDescriptor(defaultWebXml.toExternalForm());
}
URL staticOverideXml = findUrl(STATIC_WEB_XML);
if (staticOverideXml != null && new File("./content").exists()) {
List<String> overrides = new ArrayList<String>(context.getOverrideDescriptors());
overrides.add(staticOverideXml.toExternalForm());
context.setOverrideDescriptors(overrides);
}
if (contextRoot != null) {
context.setWar(contextRoot.toExternalForm());
}
context.setParentLoaderPriority(true);
context.setClassLoader(new WebAppClassLoader(Main.class.getClassLoader(), context));
context.setContextPath("/");
s.setHandler(context);
s.start();
CONSOLE_LOG.info("[DONE ] [{}ms] Startup Succeeded, Listening on port {}", (System.currentTimeMillis() - start), getHttpPort());
for (int i = 0; i < args.length; i++) {
String arg = args[i];
if ("--exit".equals(arg)) {
System.exit(0);
}
if ("--notify".equals(arg)) {
CONSOLE_LOG.info("[POST ] [{}ms] Calling notify [{}]", (System.currentTimeMillis() - start), args[i + 1]);
Runtime.getRuntime().exec(args[i + 1]).waitFor();
}
}
s.join();
} catch (Exception e) {
e.printStackTrace();
CONSOLE_LOG.error("Startup Failed [{}ms]", (System.currentTimeMillis() - start), e);
System.err.println("STARTUP FAILED [" + (System.currentTimeMillis() - start) + "] ms");
for (int i = 0; i < args.length; i++) {
String arg = args[i];
if ("--notify-error".equals(arg)) {
CONSOLE_LOG.error("[ERROR] [{}ms] Calling notify [{}]", (System.currentTimeMillis() - start), args[i + 1]);
try {
Runtime.getRuntime().exec(args[i + 1]).waitFor();
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
System.exit(1);
}
}
}