/*
* @author Stephane Micheloud
*/
object Test {
val name = "actor"
val host = "127.0.0.1"
val port = 8889
def main(args: Array[String]) {
setenv()
println("Server.main "+port)
Server.main(Array(port.toString))
println("Client.main "+host+" "+port)
Client.main(Array(host, port.toString))
Server.terminate()
}
private def setenv() {
import Env._
// Java properties for server & client
System.setProperty("scala.actors.logLevel", actors_logLevel)
System.setProperty("scala.remoting.logLevel", logLevel)
System.setProperty("java.security.manager", "")
System.setProperty("java.security.policy", policyFile)
// Java properties for server only
System.setProperty("java.rmi.server.codebase", deployUrl)
System.setProperty("java.rmi.server.hostname", host)
System.setProperty("java.rmi.server.useCodebaseOnly", "true")
// application-specific classes to be deployed and accessed via URL
// (i.e. detached closure, proxy interfaces and proxy stubs)
val classNames = List(
"$anonfun$main$1$proxy",
"$anonfun$main$1$proxyImpl_Stub",
"Bar$proxy",
"Bar$proxyImpl_Stub",
"Client$$anonfun$main$1$$anonfun$apply$1$detach",
"Client$proxy",
"Client$proxyImpl_Stub",
"Foo$proxy",
"Foo$proxyImpl_Stub")
val proxyImplNames =
for (n <- classNames; i = n lastIndexOf "_Stub"; if i > 0)
yield n.substring(0, i)
generatePolicyFile()
generateRmiStubs(proxyImplNames)
generateJarFile(classNames)
}
}
object Env {
import java.io._, java.util.jar._
val actors_logLevel = "0"
// = "3" // info+warning+error
val logLevel = "silent"
// = "info" // debug user code only
// = "info,lib" // debug user & library code
// we assume an Apache server is running locally for deployment
private val sep = File.separator
val docPath = System.getProperty("user.home")+sep+"public_html"
val docRoot = "http://127.0.0.1/~"+System.getProperty("user.name")
private val policyTmpl =
System.getProperty("partest.cwd")+sep+Test.name+sep+"java.policy"
val outPath = System.getProperty("partest.output")
val libPath = System.getProperty("partest.lib")
val policyFile = outPath+sep+"java.policy"
val codebaseDir = outPath+sep+"-"
assert((new File(docPath)).isDirectory,
"Root directory \""+docPath+"\" not found")
val deployJar = docPath+sep+Test.name+"_deploy.jar"
val deployUrl = docRoot+"/"+Test.name+"_deploy.jar"
def generatePolicyFile() {
val in = new BufferedReader(new FileReader(policyTmpl))
val out = new PrintWriter(new BufferedWriter(new FileWriter(policyFile)))
var line = in.readLine()
while (line != null) {
val line1 = line.replaceAll("@PROJECT_LIB_BASE@", codebaseDir)
out.println(line1)
line = in.readLine()
}
in.close()
out.close()
}
def generateRmiStubs(classNames: List[String]) {
val options = List(
"-v1.2",
"-classpath "+libPath+File.pathSeparator+outPath,
"-d "+outPath)
rmic(options, classNames)
//ls(outPath)
}
def generateJarFile(classNames: List[String]) {
val out = new JarOutputStream(new FileOutputStream(deployJar))
classNames foreach (name => try {
val classFile = name+".class"
val in = new FileInputStream(outPath+sep+classFile)
out putNextEntry new JarEntry(classFile)
val buf = new Array[Byte](512)
var len = in read buf
while (len != -1) {
out.write(buf, 0, len)
len = in read buf
}
in.close()
} catch {
case e: FileNotFoundException => println(e)
})
out.close()
}
private def ls(path: String) { exec("ls -al "+path) }
private def rmic(options: List[String], classNames: List[String]) {
val javaHome = scala.util.Properties.javaHome
val jdkHome =
if (javaHome endsWith "jre") javaHome.substring(0, javaHome.length-4)
else javaHome
val rmicExt = if (scala.util.Properties.isWin) ".exe" else ""
val rmicCmd = jdkHome+sep+"bin"+sep+"rmic"+rmicExt
val cmdLine = rmicCmd+options.mkString(" ", " ", "")+
classNames.mkString(" "," ","")
// println(cmdLine)
exec(cmdLine)
}
private def exec(command: String) {
val proc = Runtime.getRuntime exec command
proc.waitFor()
val out = new BufferedReader(new InputStreamReader(proc.getInputStream))
var line = out.readLine()
while (line != null) {
println(line)
line = out.readLine()
}
out.close()
val err = new BufferedReader(new InputStreamReader(proc.getErrorStream))
line = err.readLine()
while (line != null) {
println(line)
line = err.readLine()
}
err.close()
}
}