aboutsummaryrefslogtreecommitdiffstats
path: root/trunk/infrastructure/net.appjet.oui/main.scala
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/infrastructure/net.appjet.oui/main.scala')
-rw-r--r--trunk/infrastructure/net.appjet.oui/main.scala386
1 files changed, 0 insertions, 386 deletions
diff --git a/trunk/infrastructure/net.appjet.oui/main.scala b/trunk/infrastructure/net.appjet.oui/main.scala
deleted file mode 100644
index 42cd268..0000000
--- a/trunk/infrastructure/net.appjet.oui/main.scala
+++ /dev/null
@@ -1,386 +0,0 @@
-/**
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS-IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.appjet.oui;
-
-import net.appjet.bodylock.{BodyLock, Executable};
-
-import java.io.File;
-import java.util.{Properties, Date};
-import java.lang.annotation.Annotation;
-import java.text.SimpleDateFormat;
-
-import scala.collection.mutable.{HashMap, SynchronizedMap, HashSet};
-import scala.collection.jcl.{IterableWrapper, Conversions};
-
-import org.mortbay.thread.QueuedThreadPool;
-import org.mortbay.jetty.servlet.{Context, HashSessionIdManager, FilterHolder, ServletHolder};
-import org.mortbay.jetty.handler.{HandlerCollection, RequestLogHandler, HandlerList};
-import org.mortbay.jetty.{Server, NCSARequestLog, Request, Response};
-import org.mortbay.servlet.GzipFilter;
-
-// removed due to license restrictions
-// import com.oreilly.servlet.MultipartFilter;
-
-import net.appjet.common.util.{BetterFile, HttpServletRequestFactory};
-import net.appjet.common.cli._;
-import net.appjet.bodylock.JSCompileException;
-
-import Util.enumerationToRichEnumeration;
-
-object main {
- val startTime = new java.util.Date();
-
- def quit(status: Int) {
- java.lang.Runtime.getRuntime().halt(status);
- }
-
- def setupFilesystem() {
- val logdir = new File(config.logDir+"/backend/access");
- if (! logdir.isDirectory())
- if (! logdir.mkdirs())
- quit(1);
- }
-
- val options =
- for (m <- config.allProperties if (m.getAnnotation(classOf[ConfigParam]) != null)) yield {
- val cp = m.getAnnotation(classOf[ConfigParam])
- new CliOption(m.getName(), cp.value(), if (cp.argName().length > 0) Some(cp.argName()) else None);
- }
-
- def printUsage() {
- println("\n--------------------------------------------------------------------------------");
- println("usage:");
- println((new CliParser(options)).usage);
- println("--------------------------------------------------------------------------------\n");
- }
-
- def extractOptions(args: Array[String]) {
- val parser = new CliParser(options);
- val opts =
- try {
- parser.parseOptions(args)._1;
- } catch {
- case e: ParseException => {
- println("error: "+e.getMessage());
- printUsage();
- System.exit(1);
- null;
- }
- }
- if (opts.contains("configFile")) {
- val p = new Properties();
- p.load(new java.io.FileInputStream(opts("configFile")));
- extractOptions(p);
- }
- for ((k, v) <- opts) {
- config.values(k) = v;
- }
- }
-
- def extractOptions(props: Properties) {
- for (k <- for (o <- props.propertyNames()) yield o.asInstanceOf[String]) {
- config.values(k) = props.getProperty(k);
- }
- }
-
- val startupExecutable = (new FixedDiskLibrary(new SpecialJarOrNotFile(config.ajstdlibHome, "onstartup.js"))).executable;
- def runOnStartup() {
- execution.runOutOfBand(startupExecutable, "Startup", None, { error =>
- error match {
- case e: JSCompileException => { }
- case e: Throwable => { e.printStackTrace(); }
- case (sc: Int, msg: String) => { println(msg); }
- case x => println(x);
- }
- System.exit(1);
- });
- }
-
- lazy val shutdownExecutable = (new FixedDiskLibrary(new SpecialJarOrNotFile(config.ajstdlibHome, "onshutdown.js"))).executable;
- def runOnShutdown() {
- execution.runOutOfBand(shutdownExecutable, "Shutdown", None, { error =>
- error match {
- case e: JSCompileException => { }
- case e: Throwable => { }
- case (sc: Int, msg: String) => { println(msg); }
- case x => println(x);
- }
- });
- }
-
- def runOnSars(q: String) = {
- val ec = execution.runOutOfBand(execution.sarsExecutable, "SARS", Some(Map("sarsRequest" -> q)), { error =>
- error match {
- case e: JSCompileException => { throw e; }
- case e: Throwable => { exceptionlog(e); throw e; }
- case (sc: Int, msg: String) => { println(msg); throw new RuntimeException(""+sc+": "+msg) }
- case x => { println(x); throw new RuntimeException(x.toString()) }
- }
- });
- ec.attributes.get("sarsResponse").map(_.toString());
- }
-
- def stfu() {
- System.setProperty("org.mortbay.log.class", "net.appjet.oui.STFULogger");
- System.setProperty("com.mchange.v2.log.MLog", "com.mchange.v2.log.FallbackMLog");
- System.setProperty("com.mchange.v2.log.FallbackMLog.DEFAULT_CUTOFF_LEVEL", "OFF");
- }
- var server: Server = null;
- var sarsServer: net.appjet.common.sars.SarsServer = null;
-
- var loggers = new HashSet[GenericLogger];
- def main(args: Array[String]) {
- val etherpadProperties = getClass.getResource("/etherpad.properties");
- if (etherpadProperties != null) {
- val p = new Properties();
- p.load(etherpadProperties.openStream);
- extractOptions(p);
- }
- extractOptions(args);
-
- if (! config.verbose)
- stfu();
- setupFilesystem();
- if (config.devMode)
- config.print;
- if (config.profile)
- profiler.start();
- if (config.listenMonitoring != "0:0")
- monitoring.startMonitoringServer();
-
- // this needs a better place.
- if (config.devMode)
- BodyLock.map = Some(new HashMap[String, String] with SynchronizedMap[String, String]);
-
- server = new Server();
- if (config.maxThreads > 0)
- server.setThreadPool(new QueuedThreadPool(config.maxThreads));
- else
- server.setThreadPool(new QueuedThreadPool());
- // set up socket connectors
- val nioconnector = new CometSelectChannelConnector;
- var sslconnector: CometSslSelectChannelConnector = null;
- nioconnector.setPort(config.listenPort);
- if (config.listenHost.length > 0)
- nioconnector.setHost(config.listenHost);
- if (config.listenSecurePort == 0) {
- server.setConnectors(Array(nioconnector));
- } else {
- sslconnector = new CometSslSelectChannelConnector;
- sslconnector.setPort(config.listenSecurePort);
- if (config.listenSecureHost.length > 0)
- sslconnector.setHost(config.listenSecureHost);
- if (! config.sslKeyStore_isSet) {
- val url = getClass.getResource("/mirror/snakeoil-ssl-cert");
- if (url != null)
- sslconnector.setKeystore(url.toString());
- else
- sslconnector.setKeystore(config.sslKeyStore);
- } else {
- sslconnector.setKeystore(config.sslKeyStore);
- }
- sslconnector.setPassword(config.sslStorePassword);
- sslconnector.setKeyPassword(config.sslKeyPassword);
- sslconnector.setTrustPassword(config.sslStorePassword);
- sslconnector.setExcludeCipherSuites(Array[String](
- "SSL_RSA_WITH_3DES_EDE_CBC_SHA",
- "SSL_DHE_RSA_WITH_DES_CBC_SHA",
- "SSL_DHE_DSS_WITH_DES_CBC_SHA",
- "SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA",
- "SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA",
- "SSL_RSA_WITH_DES_CBC_SHA",
- "SSL_RSA_EXPORT_WITH_RC4_40_MD5",
- "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
- "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
- "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA",
- "SSL_RSA_WITH_NULL_MD5",
- "SSL_RSA_WITH_NULL_SHA",
- "SSL_DH_anon_WITH_3DES_EDE_CBC_SHA",
- "SSL_DH_anon_WITH_DES_CBC_SHA",
- "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5",
- "SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA"));
- server.setConnectors(Array(nioconnector, sslconnector));
- }
-
- // set up Context and Servlet
- val handler = new Context(server, "/", Context.NO_SESSIONS | Context.NO_SECURITY);
- handler.addServlet(new ServletHolder(new OuiServlet), "/");
-
-// val filterHolder = new FilterHolder(new MultipartFilter());
-// filterHolder.setInitParameter("uploadDir", System.getProperty("java.io.tmpdir"));
-// handler.addFilter(filterHolder, "/*", 1);
-
- global.context = handler;
-
- // set up apache-style logging
- val requestLogHandler = new RequestLogHandler();
- val requestLog = new NCSARequestLog(config.logDir+"/backend/access/access-yyyy_mm_dd.request.log") {
- override def log(req: Request, res: Response) {
- try {
- if (config.devMode || config.specialDebug)
- super.log(req, res);
- else if (res.getStatus() != 200 || config.transportPrefix == null || ! req.getRequestURI().startsWith(config.transportPrefix))
- super.log(req, res);
- val d = new Date();
- appstats.stati.foreach(_(if (res.getStatus() < 0) 404 else res.getStatus()).hit(d));
- } catch {
- case e => { exceptionlog("Error writing to log?"); exceptionlog(e); }
- }
- }
- };
- requestLog.setRetainDays(365);
- requestLog.setAppend(true);
- requestLog.setExtended(true);
- requestLog.setLogServer(true);
- requestLog.setLogLatency(true);
- requestLog.setLogTimeZone("PST");
- requestLogHandler.setRequestLog(requestLog);
-
- // set handlers with server
- val businessHandlers = new HandlerList();
- businessHandlers.setHandlers(Array(handler));
- val allHandlers = new HandlerCollection();
- allHandlers.setHandlers(Array(businessHandlers, requestLogHandler));
- server.setHandler(allHandlers);
-
- // fix slow startup bug
- server.setSessionIdManager(new HashSessionIdManager(new java.util.Random()));
-
- // run the onStartup script.
- runOnStartup();
-
- // preload some runners, if necessary.
- if (config.preloadRunners > 0) {
- val b = new java.util.concurrent.CountDownLatch(config.preloadRunners);
- for (i <- 0 until config.preloadRunners)
- (new Thread {
- ScopeReuseManager.freeRunner(ScopeReuseManager.newRunner);
- b.countDown();
- }).start();
- while (b.getCount() > 0) {
- b.await();
- }
- println("Preloaded "+config.preloadRunners+" runners.");
- }
-
- // start SARS server.
- if (config.listenSarsPort > 0) {
- try {
- import net.appjet.common.sars._;
- sarsServer = new SarsServer(config.sarsAuthKey,
- new SarsMessageHandler { override def handle(q: String) = runOnSars(q) },
- if (config.listenSarsHost.length > 0) Some(config.listenSarsHost) else None,
- config.listenSarsPort);
- sarsServer.daemon = true;
- sarsServer.start();
- } catch {
- case e: java.net.SocketException => {
- println("SARS: A socket exception occurred: "+e.getMessage()+" on SARS server at "+config.listenSarsHost+":"+config.listenSarsPort);
- java.lang.Runtime.getRuntime().halt(1);
- }
- }
- }
-
- // start server
- java.lang.Runtime.getRuntime().addShutdownHook(new Thread() {
- override def run() {
- val df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSZ");
- def printts(str: String) {
- println("["+df.format(new Date())+"]: "+str);
- }
- printts("Shutting down...");
- handler.setShutdown(true);
- Thread.sleep(if (config.devMode) 500 else 3000);
- printts("...done, running onshutdown.");
- runOnShutdown();
- printts("...done, stopping server.");
- server.stop();
- server.join();
- printts("...done, flushing logs.");
- for (l <- loggers) { l.flush(); l.close(); }
- printts("...done.");
- }
- });
-
- def socketError(c: org.mortbay.jetty.Connector, e: java.net.SocketException) {
- var msg = e.getMessage();
- println("SOCKET ERROR: "+msg+" - "+(c match {
- case null => "(unknown socket)";
- case x => {
- (x.getHost() match {
- case null => "localhost";
- case y => y;
- })+":"+x.getPort();
- }
- }));
- if (msg.contains("Address already in use")) {
- println("Did you make sure that ports "+config.listenPort+" and "+config.listenSecurePort+" are not in use?");
- }
- if (msg.contains("Permission denied")) {
- println("Perhaps you need to run as the root user or as an Administrator?");
- }
- }
-
- var c: org.mortbay.jetty.Connector = null;
-
- try {
- c = nioconnector;
- c.open();
- if (sslconnector != null) {
- c = sslconnector;
- c.open();
- }
- c = null;
- allHandlers.start();
- server.start();
- } catch {
- case e: java.net.SocketException => {
- socketError(c, e);
- java.lang.Runtime.getRuntime().halt(1);
- }
- case e: org.mortbay.util.MultiException => {
- println("SERVER ERROR: Couldn't start server; multiple errors.");
- for (i <- new IterableWrapper[Throwable] { override val underlying = e.getThrowables.asInstanceOf[java.util.List[Throwable]] }) {
- i match {
- case se: java.net.SocketException => {
- socketError(c, se);
- }
- case e =>
- println("SERVER ERROR: Couldn't start server: "+i.getMessage());
- }
- }
- java.lang.Runtime.getRuntime().halt(1);
- }
- case e => {
- println("SERVER ERROR: Couldn't start server: "+e.getMessage());
- java.lang.Runtime.getRuntime().halt(1);
- }
- }
-
- println("HTTP server listening on http://"+
- (if (config.listenHost.length > 0) config.listenHost else "localhost")+
- ":"+config.listenPort+"/");
- if (config.listenSecurePort > 0)
- println("HTTPS server listening on https://"+
- (if (config.listenSecureHost.length > 0) config.listenSecureHost else "localhost")+
- ":"+config.listenSecurePort+"/");
- if (config.listenSarsPort > 0)
- println("SARS server listening on "+
- (if (config.listenSarsHost.length > 0) config.listenSarsHost else "localhost")+
- ":"+config.listenSarsPort);
- }
-}