当ブログに掲載しているサンプルは、すべて利用者の自己責任という形でお願いします。
ただし、明らかな不具合がある場合、ご連絡いただければ、訂正記事を出します。
また、こちらのサンプルは、別のサイト等への公開、転載は一切禁止しています。
どうしてもと言う場合は、筆者にあらかじめご連絡ください。

テクてく Lotus 技術者 Slack に参加しよう!

2012年8月28日火曜日

XPagesのアクセスログを作ってみよう

こんにちは。
皆さん、今日もヘルプを読んでますか!分からないことがあったら、ヘルプをまず読みましょう!
隅から隅まで読むときっと次へのステップの手がかりが見つかります!



それでも、ヘルプなんか読みたくないんだよ!という方は、このボタンを押してから、記事を読みましょう。より理解が深まることでしょう。
にほんブログ村 IT技術ブログへ



さて、今日はXPagesでのアクセスログを作ってみましょう。
通常のノーツアプリケーションの場合であれば、フォームのQureyopenイベントにアクセスログを記録するコードを書けばよいでしょう。Webアプリケーションの場合であれば、フォームのWebQueryOpenで実行するエージェントにコードを追記すればよいでしょう。
では、XPages の場合はどうすれば良いのか?というところを検証します。

今回は、そんなに深くまで検証していないので、フォームが設定されたXPageをターゲットとします。
他のパターン(カスタムコントロールや1つのXPage内に複数のフォームが設定されている場合等)については、別の機会に検証しましょう。

まず、アクセスログは、別のDBに記録するものとします。同一DB内でも良いのですが、DBの文書が増えてしまうのと、他のDBからも利用できるようにするためということが理由です。汎用性を持たせると言うことですね。

データベースパス名は、「XPages/acsLog.nsf」とします。(XPagesというフォルダの下に作成します)。
フォーム名は何でも良いですが、ここでは「AccessLog」としておきます。
フィールドは以下の6つを作成します。
No.項目名フィールド名
1アクセスDBパスAccessDatabase
2アクセスDBタイトルAccessDatabaseTitle
3アクセス日時AccessDateTime
4アクセスユーザーAccessUser
5アクセス文書UNIDAccessDocUNID
6アクセス文書IDAccessDocID


次に、このアクセスログに記録するXPageですが、XPagesで添付ファイルの処理をする(アップロード) で作成したDBを使います。

このDBの文書を開いたときに、ログを記録するようにします。ということで使用するXPageは、「MainTopic」です。

このXPageの設計画面の何もないところをクリックして、イベントビューを表示します。
イベントビューに「データ」「document1」と表示してある箇所があるので、「document1」をクリックします。
すると、付随するイベントの一覧が展開して表示されます(下図)。
document1のイベント一覧

察しの良い方はこれだけで分かったのではないでしょうか?
そうです。ここのイベントにコードを記述すればよいのです。では、どこのイベントが良いでしょうか?
今回は、既存の文書が開かれたときに、アクセスログを取ることにしたいので、「postOpenDocument」イベントを選択します。

そうしたら、[アクションの追加]というボタンをクリックします。「シンプルアクションの追加」ダイアログが表示されるので、「アクション」を"スクリプトの実行"に変更します(下図参照)。
すると、画面下部がスクリプトのエディタ画面に変わります。しかし、これでは入力しづらいので、エディタの右側にあるボタンをクリックします。
「スクリプトの実行」アクションを追加

大きなエディタ画面になるので、次のコードを入力します。
アクセスログを追加するコード

画像ではわからん!という人はこちらをどうぞ。
var logdb:NotesDatabase = session.getDatabase( @Subset(@DbName(),1), "XPages/acsLog.nsf", false );

if ( logdb == null ) {
} else {
    var accessDateTime = session.createDateTime( @Now() );
    var accessDoc = database.getDocumentByID( document1.getNoteID() );

    var logdoc:NotesDocument = logdb.createDocument();

    logdoc.replaceItemValue( "Form" , "AccessLog" );
    logdoc.replaceItemValue( "AccessDatabase" , database.getFilePath() );
    logdoc.replaceItemValue( "AccessDatabaseTitle", database.getTitle() );
    logdoc.replaceItemValue( "AccessDateTime" , accessDateTime );
    logdoc.replaceItemValue( "AccessUser" , @UserName() );
    logdoc.replaceItemValue( "AccessDocUNID" , accessDoc.getUniversalID() );
    logdoc.replaceItemValue( "AccessDocID" , document1.getNoteID() );

    logdoc.save();
}
以下、簡単に解説をします。
1行目は、アクセスログDBを取得しています。
@Subset(@DbName(),1)で、自身と同じサーバのサーバ名を取得しています。
ファイル名は、"XPages/acsLog.nsf"です。ノーツアプリケーションの場合、フォルダの区切りは"\"でしたが、XPagesアプリケーションの場合、"/"で区切ります。

3行目のif ( logdb == null ) {は、万が一アクセスログDBにアクセスできなかった場合の事を考えています。

5行目のvar accessDateTime = session.createDateTime( @Now() ); は、今の時間をNtesDateTimeオブジェクトとして作成しています。
アクセスログDBの「AccessDateTime」というフィールドは、日時型で作成しているので、このような形にしておく必要があります。

6行目のvar accessDoc = database.getDocumentByID( document1.getNoteID() ); は、自文書のUNIDを取得するために実行しています。
XPageで定義するデータリソースはNotesXSPDocumentというオブジェクトで、プロパティにUNIDを保有していないのです。そこで仕方がないので、NoteIDを使って、文書を検索してきているのです。ここで取得している文書は、NotesDocumentオブジェクトなので、文書UNIDが取得できると言うことです。

10~16行目のlogdoc.replaceItemValue(・・・) は、アイテムに値をセットしているところです。

18行目のlogdoc.save();でアクセスログ文書を保存しています。


入力したら、[OK]をクリックします。
「シンプルアクションの追加」ダイアログに戻るので、ここでも[OK]をクリックします。

イベントビューを見ると、確かにアクションが追加されたことが分かります。
postOpenに追加されたアクション

これでXPageを保存します。

後は、実際にXPageアプリケーションをWebブラウザから開いてみてください。
画面上では文書が開くだけで何も起きませんが、アクセスログDBを見てみると、アクセスログが記録されています。
アクセスログDBのビュー画面


どうでしょうか?そんなに難しくないですよね。今までのアプリケーションでアクセスログを取っていたけど、XPages にしたら取れなくなったけど、どうすれば良いんだ?と言う場合に参考にしてみてください。




【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

0 件のコメント: