Skip to content

Commit

Permalink
Move server's output collector to ProgramThread in order to use it fr…
Browse files Browse the repository at this point in the history
…om Cient
  • Loading branch information
tomykaira committed Aug 4, 2012
1 parent c092302 commit dfb319e
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 21 deletions.
2 changes: 1 addition & 1 deletion app/models/Client.scala
Expand Up @@ -22,5 +22,5 @@ class Client(val path: File) {
process process
} }


def destroy(): Unit = if (process == null) process.destroy def destroy(): Unit = if (process != null) process.destroy
} }
35 changes: 35 additions & 0 deletions app/models/ProgramThread.scala
@@ -0,0 +1,35 @@
package models

import java.io.{InputStreamReader, BufferedReader}

class ProgramThread(builder: ProcessBuilder) extends Thread {
private var process: Process = null
private val stringBuilder = new StringBuilder()
private var callback: Option[String => Unit] = None

def setCallback(acb: String => Unit) = callback = Some(acb)

override def run() = {
process = builder.start
val streamReader = new InputStreamReader(process.getInputStream)
val bufferedReader = new BufferedReader(streamReader, 1)
var line:String = null

while({line = bufferedReader.readLine; line != null}){
stringBuilder.append(line)
stringBuilder.append("\n")
callback.map(_(line))
}
bufferedReader.close

process.waitFor
}

def waitFor: Unit = if (process != null) process.waitFor

def forceExit: Unit = if (process != null) process.destroy

def getOutput: String = stringBuilder.toString

def exitValue: Int = process.exitValue
}
33 changes: 13 additions & 20 deletions app/models/Server.scala
@@ -1,6 +1,6 @@
package models package models


import java.io.{File, InputStreamReader, BufferedReader} import java.io.{File}
import play.Logger import play.Logger


/** /**
Expand All @@ -20,40 +20,33 @@ extends Thread {
override def run() = { override def run() = {
val builder = new ProcessBuilder(SERVER_PROGRAM.toString, val builder = new ProcessBuilder(SERVER_PROGRAM.toString,
"-p", port.toString, "-t", ROUND_TIMEOUT.toString) "-p", port.toString, "-t", ROUND_TIMEOUT.toString)
val stringBuilder = new StringBuilder()
builder redirectErrorStream true builder redirectErrorStream true
builder directory SERVER_PROGRAM.getParentFile builder directory SERVER_PROGRAM.getParentFile


try { try {
val proc = builder.start val pt = new ProgramThread(builder)
val streamReader = new InputStreamReader(proc.getInputStream) pt.setCallback { line =>
val bufferedReader = new BufferedReader(streamReader, 1) if (line == "Waiting connections ... ") {
var line:String = null println("invoking")
var char: Int = 0 challenger.run(port)

Logger.info("challenger's client is started")
challenger.run(port) }

while({line = bufferedReader.readLine; line != null}){
stringBuilder.append(line)
stringBuilder.append("\n")
if (line == "One player is registered. Waiting for other player ...") { if (line == "One player is registered. Waiting for other player ...") {
opponent.run(port) opponent.run(port)
Logger.info("opponent's client is started") Logger.info("opponent's client is started")
} }
} }
bufferedReader.close

val result = stringBuilder.toString


proc.waitFor pt.start
pt.join


challenger.destroy() challenger.destroy()
opponent.destroy() opponent.destroy()


if (proc.exitValue == 0) { if (pt.exitValue == 0) {
BattleRecorder.report(NormalExit(battle, result)) BattleRecorder.report(NormalExit(battle, pt.getOutput))
} else { } else {
BattleRecorder.report(AbnormalExit(battle, result)) BattleRecorder.report(AbnormalExit(battle, pt.getOutput))
} }
} catch { } catch {
case e: Exception => case e: Exception =>
Expand Down

0 comments on commit dfb319e

Please sign in to comment.