WappenLite バックエンド(コンテキスト)の実装

WappenLite の配布に含まれているサンプル実装 (言語処理系として Java, GHCi, NestedVM, Scala, tuProlog, SISC Schemeなど) をそのまま利用する場合は、ここはスキップしても構いません。

概要

コンテキストは util.IContext というインターフェイスを実装するクラスを作成します。

次のようなメソッドを実装する必要があります。

メソッド名短い説明
void configure(HashMap<String, String> config) コンテキストの設定を変更します。
String save(String path, String contents) ファイルをセーブします。
boolean waitForLoad() ソースファイルのファイル構成に変化があるまで、 ブロックします。
現在使用されていません。将来的に廃止の方向です。
void load(Appendable out) ソースファイルの内容を返します。
void load(String path, Appendable out) 指定されたパスのソースファイルの内容を返します。
boolean isAuthenticationNecessary() セッションの開始にパスワードが必要かどうかを示します。
boolean start(String account, String passwd) 指定されたアカウントとパスワードでセッションをスタートします。
boolean stop() セッションを終了します。
int run(String[] args) プログラムを指定された引数で実行します。
Process exec(String[] args) プログラムを指定された引数で実行します。
void write(String str) 実行中のプログラムの標準入力に文字列を渡します。
void eof() 実行中のプログラムの標準入力にEOFを渡します。
boolean waitForRead(int index) index文字目以降の出力があるまでブロックします。
ArrayList<HashMap<String, Object>> read(int index) index文字目以降の出力を返します。
void connect(util.Connection out) 実行中のプログラムに出力ストリームを接続します。
void view(String path, OutputStream out) 指定されたパスのファイルの内容を返します。
loadと似ていますが、 viewの場合はバイナリファイルでも構いません。
HashMap<String, Object> getStatus() 現在のステータスを返します。

通常、コンテキストは util.TrivialContext という抽象クラスを継承して実装します。

util.TrivialContext (または、そのスーパークラスの util.AbstractContext)には、 util.IContext のメソッドのデフォルト実装の他に、 次のような protected なメソッドとフィールドがあります。
フィールド名説明
File baseDir ソースファイルなどの置き場所のベースディレクトリです。
String baseURL ソースファイルなどをダウンロードしてくる場所のベースURLです。
String classpath JVMを実行するときの CLASSPATH変数です。
HashMap<String, String> content ソースファイルの内容のキャッシュです
String encoding テキストファイルのエンコーディングを指定します。
String[] hiddens sources, jars以外の隠しファイルの相対パスのリストです。
String[] jars CLASSPATHに入る JARファイルの相対パスのリストです
HashMap<String, String> origin sources, jars, hiddensのダウンロード元のURLのキャッシュです。
String output プログラムの出力を保存するファイルの相対パスです。
HashMap<String, String> properties configure()の引数のキャッシュです。
boolean running プログラムが実行中か否かを示します。
String[] sources エディターに表示するソースファイルの相対パスのリストです。
HashMap<String, Object> status ステータス情報です。
Process process 実行中のプログラムのプロセスです。
OutputStream out 上記のプロセスの標準入力に繋がっている出力ストリームです。
util.ContextBuffer buf プログラムの出力を保存するバッファーです。
メソッド名説明
void initialize(HashMap<String, String> config) フィールドの初期化を行ないます。
void loadContents() baseURLからbaseDirへ、 sources, jars, hiddensで指定されたファイルをダウンロードします。
java.io.File
saveContents(String path, String contents)
baseDirpathに、contentsの内容を持つファイルを作成します。
boolean contentChangeNotify() サーバー側の要因でcontentsの内容に変更があったとき、 クライアント側のエディターに変更を促すために呼びます。
void
uploadFile(String path, String upload)
baseDirpathに存在するファイルを、 baseURL, uploadで指定されるURLにアップロードします。

各メソッドの説明

通常、コンテキストの各メソッドは util.TrivialContextを継承して、次のように実装して下さい。
(オーバーライドが必要と思われるもののみ列挙しています。)

void configure(HashMap<String, String> config)

コンテキストの設定を変更します。バックエンド設定ファイルのパラメーターについては、 バックエンドパラメーターの設定 をみて下さい。

最初に initialize(config)を呼び出して下さい。 sourcesなどのフィールドの初期化を行ないます。

また、 protectedメソッドの void loadContents()を呼んで下さい。 ソースファイルなどをダウンロードして配備します。

String save(String path, String contents)

ファイルをセーブします。

protectedメソッドの File saveContents(String path, String contents) を使用して、実際にファイル内容をファイルシステムに保存します。

その後、コンパイラー方式の処理系の場合は、 ここでコンパイルを行なって下さい。インタプリター方式の処理系の場合は、 リロードして下さい。

コンパイル時にエラーメッセージなどが出たときは、 戻り値として返して下さい。エラーがなければ nullを返して下さい。

boolean isAuthenticationNecessary()

セッションの開始にパスワードが必要かどうかを示します。 false以外を返す場合はオーバーライドする必要があります。

boolean start(String account, String passwd)

SSHなどを使用して、実行の前に認証が必要なコンテキストは、 このメソッドでログインします。 また、インタプリター方式の場合はrun()を呼び出して、 インタプリターを起動して下さい。

boolean stop()

SSHなどを使用して、実行の前に認証が必要なコンテキストは、 このメソッドでログアウトします。

int run(String[] args)

インタプリター方式の場合は、インタプリターを起動します。

コンパイラー方式の処理系はプログラムを指定された引数で実行します。

このメソッドは Session/Run サーブレットから使用されます。

通常、 Runtime.getRuntime.exec(String[] cmdarray, String[] envp, File dir)メソッドや ProcessBuilderクラスを使って、外部プロセスとして実行します。

Process exec(String[] args)

コンパイラー方式の処理系はプログラムを指定された引数で実行します。

インタプリター方式の場合は、通常使用しません。

このメソッドは Session/Exec サーブレットから使用されます。

HashMap<String, Object> getStatus()

現在のステータスを返します。どのようなステータスを返すかは、 コンテキストの作者の裁量に任されますが、 runningという現在プログラムが実行中かどうかを示すプロパティーは、 必ず含めて下さい。

テストの方法

テストの方法は、 「WappenLite バックエンドのテスト実行と配備」の「テストの方法」を見てください。


目次に戻る


Koji Kagawa (kagawa _at_ eng _dot_ kagawa-u _dot_ ac _dot_ jp)