2010/01/26

Java クラスのサンプルコードを SSJS へ応用する方法

Xpages の開発中、サーバーサイドの JavaScript をどのように記述するか調べたくても適当なサンプルスクリプトも非常に少ないのが現状です。
これは何も日本語に限ったことではなく英語でもまだ不十分のようです。
JavaScpirt のサンプルとして、既存のJava/CORBA クラスのサンプルを利用する方法が Lotus Notes and Domino Application Development wiki に掲載されていましたのでご紹介したいと思います。原作は同 wiki の「Converting Java sample code to JavaScript code」です。

ここで取り上げられている例では ColorObject クラスの getBlue プロパティを題材にしていますが、おおよそ他のメソッドやプロパティの例でも使用できると思います。
では見ていきましょう。

import lotus.domino.*;
public class JavaAgent extends AgentBase {
  public void NotesMain() {
    try {
      Session session = getSession();
      AgentContext agentContext = session.getAgentContext();
      // (Your code goes here) 
      Database db = agentContext.getCurrentDatabase();
      View view = db.getView("Main View");
      ColorObject color = session.createColorObject();
      color.setNotesColor(view.getBackgroundColor());
      System.out.println(
      "Blue value of Main View background = " + color.getBlue());
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
}

まず、import や class ステートメントは必要ありません。
そして try 節を取り除きます。(try は後述で説明)

Database db = agentContext.getCurrentDatabase();
View view = db.getView("Main View");
ColorObject color = session.createColorObject();
color.setNotesColor(view.getBackgroundColor());
System.out.println(
"Blue value of Main View background = " + color.getBlue());
では上から見ていきます。
最初の行のセッションを取得しているコードは不要です。
XPages の JavaScript はエージェントのコンテキストで動作しているわけではありませんので、この行も削除します。このようにサンプルのコードがアプリケーション、サーブレット、またはアプレットのコンテキストで動作する場合は同様に削除しても構いません。

ではどうやって現在のデータベースを取得するのでしょうか?
XPages の JavaScript は現在のデータベースを表す「database」というグローバル変数を提供しています。
そこで先頭の行をこの変数を使うように書き換えます。Viewvar に置き換えます。
var view = database.getView("Main View");
ColorObject color = session.createColorObject();
color.setNotesColor(view.getBackgroundColor());
System.out.println(
"Blue value of Main View background = " + color.getBlue());
補足ですが、次のコード例のように変数の後にコロンをつけてコメントすることができます。
var view:NotesView = database.getView("Main View");
同様に ColorObject の代わりに var を使用します。
session」の文法はそのまま通用しますが、意味合いが少し異なります。
Java コードでは session は getSession によって返された変数ですが、JavaScript では session は現在のセッションを現すグローバル変数のひとつです。
したがってコードは次のようになります。
var view = database.getView("Main View");
var color = session.createColorObject();
color.setNotesColor(view.getBackgroundColor());
System.out.println(
"Blue value of Main View background = " + color.getBlue());
view と color はセットされているので次の行は何も変更する必要はありません。
ここでの JavaScript の文法は Java とまったく同じです。
最後の行は調整が必要です。JavaScirpt は System オブジェクトを認識しません。
getBlur() の値をコンソールへ返したいのであれば次のようになります。
var view = database.getView("Main View");
var color = session.createColorObject();
color.setNotesColor(view.getBackgroundColor());
print ("Blue value of Main View background = " + color.getBlue());
しかし当然 JavaScript はある制御のための値が必要ですから return キーワードを使って値を返すことになります。
var view = database.getView("Main View");
var color = session.createColorObject();
color.setNotesColor(view.getBackgroundColor());
return "Blue value of Main View background = " + color.getBlue());
コード内で発生したエラーを catch したい場合は、下のように記述することができます。
JavaScript でステートメントが複数になっている場合にはセミコロンを取り除くことに注意してください。
try {
 var view = database.getView("Main View")
 var color = session.createColorObject()
 color.setNotesColor(view.getBackgroundColor())
 return "Blue value of Main View background = " + color.getBlue())
} catch (e) {
 return e.message
}

また次のサンプル JavaScript はエージェントの名前をリストで返す例です。
var agents = database.getAgents().iterator();
var list = "";
while (agents.hasNext()) {
 list = list + agents.next().getName() + "\n";
}
return list
最後は getFirst...getNext... の繰り返しを使って処理を行い null で終了する方法です。
DATABASE は固定値として定義されていることに注意してください。
var DATABASE = 1247;
var out = "";
var dir = session.getDbDirectory("");
var db = dir.getFirstDatabase(DATABASE);
while (db != null) {
 out = out + db.getFileName() + "\n";
 db = dir.getNextDatabase();
}
return out;

0 件のコメント:

コメントを投稿