summaryrefslogtreecommitdiff
path: root/test/files/detach-run/actor/ServerConsole.scala
blob: f68274e927529b4f3a080928109a7c911585ad4e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import java.io._

import scala.compat.Platform.currentTime
import scala.remoting.Debug, Debug._

trait ServerConsole extends Thread {
  private val startTime = currentTime
  actors.Debug.level = // e.g. 3 // info+warning+error
    try { System.getProperty("scala.actors.logLevel", "0").toInt }
    catch { case e => 0 }

  start()

  val serverClassLoader = {
    import java.rmi.server.RMIClassLoader
    val codebase = System.getProperty("java.rmi.server.codebase")
    info("[ServerConsole] codebase="+codebase)
    RMIClassLoader.getClassLoader(codebase)
  }

  private var isTerminated = false

  def terminate() { isTerminated = false }

  def isRunning = !isTerminated

  override def run() {
    val in = new BufferedReader(new InputStreamReader(System.in))
    var quit = false
    while (!quit) {
      val args = getArgs(in)
      if (args contains "quit")
        quit = true
      if (args contains "cls") {
        println(ERASE_SCREEN)
        println(CURSOR_HOME)
      }
      if (args contains "warning")
        Debug.level = Level.WARNING
      if (args contains "info")
        Debug.level = Level.INFO
      if (args contains "silent")
        Debug.level = Level.SILENT
    }
    terminate()
    println("Server exited ("+mkTimeString(currentTime - startTime)+")")
    exit(0)
  }

  protected def trace(msg: String) {
    Debug.info("[ServerConsole.trace] "+msg)
  }

  private def getArgs(in: BufferedReader): List[String] = {
    val input = try { in.readLine() } catch { case _ => null }
    if (input != null) (input.trim split "\\s+").toList else Nil
  }

  private def mkTimeString(time: Long): String = {
    def twoDigits(i: Long) = (if (i < 10) "0" else "")+i
    val sec = time / 1000
    val min = sec / 60
    val h = min / 60
    twoDigits(h) +":"+
    twoDigits(min - h * 60)+":"+
    twoDigits(sec - min * 60)
  }

  private val ERASE_SCREEN = "\033[2J"
  private val CURSOR_HOME  = "\033[H"
}