pwdやcdを作っても、もともとの目的は達成されませんでした。その目的とは、loadやreadFileのデフォルトディレクトリを変えることです。Javaのレベルでuser.dirを変更しても、Rhinoが保持している(と思われる)デフォルトディレクトリに影響はないようです。残念。
readFile, loadを上書きしてしまえばいいようです。例外が起きたときのエラーメッセージとかが不格好なんですが、とりあえず動作します。
/* load.js */// このファイルが2度以上読まれたときへの対処
if (!("orig_load" in this)) {
this.orig_load = load;
}
if (!("orig_readFile" in this)) {
this.orig_readFile = readFile;
}// 相対パスを絶対パスに直す、絶対パスならそのまま
function completePath(file) {
var path;
if (file.match(/^[\\\/]/) || file.match(/^[A-Z]:[\\\/]/i)) {
// absolute path
path = file;
} else {
var sep = environment["file.separator"];
path = environment["user.dir"] + sep + file;
}
return path;
}// カレントディレクトリを考慮するreadFile
function my_readFile(file) {
var path = completePath(file);
return orig_readFile(path);
}// カレントディレクトリを考慮するload
function my_load(file) {
var path = completePath(file);
return orig_load(path);
}// load, readFileを、自前関数で上書きする
this.load = my_load;
this.readFile = my_readFile;
loadは、eval(my_readFile(file)) でいいかと思いましたが、オリジナルのloadとは挙動が変わってしまいますね。