package org.aksw.sparqlify.admin.web.main;
import java.net.URL;
import java.net.URLClassLoader;
import java.security.ProtectionDomain;
import javax.servlet.ServletException;
import javax.sql.DataSource;
import org.aksw.jena_sparql_api.web.server.ServerUtils;
import org.aksw.sparqlify.validation.LoggerCount;
import org.aksw.sparqlify.web.SparqlifyCliHelper;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.Options;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.component.AbstractLifeCycle.AbstractLifeCycleListener;
import org.eclipse.jetty.util.component.LifeCycle;
import org.eclipse.jetty.webapp.WebAppContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
*
* http://stackoverflow.com/questions/10738816/deploying-a-servlet-
* programmatically-with-jetty
* http://stackoverflow.com/questions/3718221/add-resources
* -to-jetty-programmatically
*
* @author raven
*
*
*/
public class MainSparqlifyWebManager {
private static final Logger logger = LoggerFactory.getLogger(MainSparqlifyWebManager.class);
private static final Options cliOptions = new Options();
static {
SparqlifyCliHelper.addDatabaseOptions(cliOptions);
cliOptions.addOption("P", "port", true, "");
//SparqlifyCliHelper.addPortOption(cliOptions);
}
public static void printClassPath() {
ClassLoader cl = ClassLoader.getSystemClassLoader();
URL[] urls = ((URLClassLoader)cl).getURLs();
for(URL url: urls){
System.out.println(url.getFile());
}
}
// Source:
// http://eclipsesource.com/blogs/2009/10/02/executable-wars-with-jetty/
public static void main(String[] args) throws Exception {
LoggerCount loggerCount = new LoggerCount(logger);
Class.forName("org.postgresql.Driver");
CommandLineParser cliParser = new GnuParser();
CommandLine commandLine = cliParser.parse(cliOptions, args);
DataSource dataSource = SparqlifyCliHelper.parseDataSource(commandLine, logger);
AppConfig.cliDataSource = dataSource;
//SparqlifyCliHelper.parseDataSource(commandLine, loggerCount);
Integer port = SparqlifyCliHelper.parseInt(commandLine, "P", false, loggerCount);
port = (port == null) ? 7531 : port;
WebAppInitializer initializer = new WebAppInitializer();
ServerUtils.startServer(MainSparqlifyWebManager.class, port, initializer);
//startServer(port);
}
public static void startServer(int port) {
Server server = new Server(port);
// SocketConnector connector = new SocketConnector();
//
// // Set some timeout options to make debugging easier.
// connector.setMaxIdleTime(1000 * 60 * 60);
// connector.setSoLingerTime(-1);
// connector.setPort(port);
// server.setConnectors(new Connector[] { connector });
final WebAppContext webAppContext = new WebAppContext();
//Context servletContext = webAppContext.getServletContext();
webAppContext.addLifeCycleListener(new AbstractLifeCycleListener() {
@Override
public void lifeCycleStarting(LifeCycle arg0) {
WebAppInitializer initializer = new WebAppInitializer();
try {
initializer.onStartup(webAppContext.getServletContext());
} catch (ServletException e) {
throw new RuntimeException(e);
}
}
});
webAppContext.setServer(server);
webAppContext.setContextPath("/");
ProtectionDomain protectionDomain = MainSparqlifyWebManager.class.getProtectionDomain();
URL location = protectionDomain.getCodeSource().getLocation();
String externalForm = location.toExternalForm();
logger.debug("External form: " + externalForm);
// Try to detect whether we are being run from an
// archive (uber jar / war) or just from compiled classes
if(externalForm.endsWith("/classes/")) {
externalForm = "src/main/webapp";
//externalForm = "target/sparqlify-web-admin-server";
}
logger.debug("Loading webAppContext from " + externalForm);
//context.setDescriptor(externalForm + "/WEB-INF/web.xml");
webAppContext.setWar(externalForm);
server.setHandler(webAppContext);
try {
server.start();
System.in.read();
server.stop();
server.join();
} catch (Exception e) {
e.printStackTrace();
//System.exit(1);
}
}
}