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

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

2012年8月29日水曜日

XPagesのアクセスログを作ってみよう(応用編)

累積アクセス数が28万を超えました。たくさんの方に見ていただいていて、感謝しています。

でも・・・コメントが少ないんですよね。あまりにも一方通行のような気がしてなりません。
コメントするのが恥ずかしいとかいうのであれば、メールでも構いませんので、意見をください。

閑話休題。

さて、そう言いつつも今日も話題を提供します。その前に恒例のクリックをお願いします。
にほんブログ村 IT技術ブログへ


今回は、前回の続きというか応用です。
前回は、1つのXPageにアクセスログを記録するためのコードを埋め込むだけでした。
アクセスログを記録するためのノーツDBは、別に作ってあって共有できるような作りなのに、これでは寂しいです。


ということで、アクセスログを記録するコードを部品化することにチャレンジしてみましょう。

まずは、スクリプトライブラリにJavaScriptライブラリを作成します。
データベースナビゲータビューで、「コード」「スクリプトライブラリ」を開いて、[新規スクリプトライブラリ]ボタンをクリックします(下図参照)。
スクリプトライブラリ一覧画面

新規スクリプトライブラリのダイアログが表示されるので、名前とタイプに適切な値を入力して、[OK]をクリックします。
ここでは「名前」は、 "LibAccessLog"とします。タイプは、"サーバー JavaScript"にします。
新規スクリプトライブラリのダイアログ

すると、JavaScriptのエディタ画面になります。
あまりにも貧相なので、どう記述して良いのか悩んでしまいますが・・・
次のように記述します。
function openDocumentLog( document1:NotesXSPDocument ) {
    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();
    }
}
openDocumentLogというのが関数名になります。その引数はdocument1です。
関数の中身は、前回と同じですね。

記述できたら、保存して閉じます。
次に、このコードをXPageから呼び出せるようにします。

フォームのデータリソースが定義してあるXPage を開きます(ここでのサンプルは前回と同じノーツアプリケーションを利用します)。
設計画面の何もないところをクリックした状態で、プロパティビューを開きます。
そこの「リソース」タブを開いて、[追加▼]というボタンをクリックします。
追加できるリソースの一覧が選択肢として表示されるので、「JavaScript...」を選択します(下図参照)。
JavaScriptライブラリを追加

「JavaScriptライブラリをページへ追加」というダイアログが表示されるので、さきほど作成した「LibAccessLog」を選択して、[OK]をクリックします。
JavaScriptライブラリをページに追加

画面に戻ると、JavaScriptライブラリがページに追加されています。
JavaScriptライブラリがページに追加された

今度は、そのまま「イベント」ビューを開きます。
「データ」「document1」のpostOpenDocumentイベントにコードが追加されているので、思い切ってそれを削除します(アクションを選択して、[削除]ボタンをクリックします)。

そして、[アクションの追加...]をクリックして、「スクリプトの実行」を選択して、スクリプトエディタを開きます。
あとは、ここにさきほど作成した関数名を入力します。引数として、NotesXSPDocument オブジェクト名を入力するのを忘れないようにしましょう。
共通化した関数を入力します

そうしたら、[OK]を押して完了します。
画面に戻ったら、XPage を保存します。

これで完了です。簡単ですね。
ちなみに、他のXPagesアプリケーションに実装して、アクセスログを取得した結果が次の画面です。
複数のXpagesアプリケーションにアクセスログを設定した結果

確かに複数DBのアクセスログが記録されていますね。
ちなみに、「図書管理 for XPages」は、以前に連載していた「おじさんSE」シリーズで作成したXPagesアプリケーションで、フォームのデータリソースは、「BookResource」というカスタムコントロールにあります。
この場合、カスタムコントロールのイベントに関数を設定すれば、アクセスログが取得できます。


ということで、色々なXPagesアプリケーションにアクセスログを設定してみましょう。






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

8 件のコメント:

Hiro-aki Komine さんのコメント...

横浜市在住の中年男性です。いつもブログを楽しみにしています。

今日のアクセスログの部品かも良かったです。
ひとつだけ気になることがあります。ご紹介した方法だとアクセスログ NSF はひとつにまとめられますが、そこに書き込むための openDocumentLog() 関数は、利用するすべての NSF で用意しなくてはなりません。同じ内容の関数なので、これもふくめてアクセスログ NSF にまとめて部品化できるとうれしいと思いました。

こみね

Guy Locke さんのコメント...

Hiro-aki Komineさん、コメントありがとうございます。

仰るとおり、今のままだと、各XPagesアプリケーションにコードを書いていく必要がありますね。

テンプレートの設計要素とすることも考えたのですが、他に方法がないか調査してみますね。

Nozomi Taniguchi さんのコメント...

ブログ愛読者の広島在住アラサー女子です。
いつも勉強させてもらってます!

クライアントサイドのJavascriptなら、
リソースの追加で、
「このアプリケーションからJavaScriptライブラリを使用」ではなくて
「URLからJavaScriptライブラリへのリンク」で、
他のアプリケーションのスクリプトライブラリ呼べることはやってみたことあるのですが、
その際に、種類を「サーバー」に変更してサーバーサイドJavaScriptを呼び出そうとしたところ、
エラーになってしまい・・・
時間もなく、詳しい調査ができずに挫折しましたorz
もし、なにかわかりましたら是非また教えてくださいチャンピオン!!

Guy Locke さんのコメント...

Nozomi Taniguchi さん、コメントありがとうございます。

そうなんですよね。「URLからJavaScriptライブラリへのリンク」がエラーになるんですよね。ソースを見る限りでは、"http://~"がつくかつかないか何ですけどね。

どうも、この"http://~"があること自体が悪そうな雰囲気で・・・
もう少し調べてみます。

Guy Locke さんのコメント...

http://www-01.ibm.com/support/docview.wss?uid=swg1LO60879

こんな情報を見つけました。
「URLからJavaScriptライブラリへのリンク」で、別のデータベースのサーバーサイドJavaScriptは動作しません。
という事みたいです。
ただ、別のサーバーなのか、別のノーツDBなのかは読み取れませんでした。

Hiro-aki Komine さんのコメント...

確かに、この制限でのために DB を超えての SSJS 参照はできないですね。

でも…、

他の方法はないのかしら?

・エージェントをキックする
→ パラメータが渡せない?
・UI の無い XPages を作ってリクエストを投げる
→ 予備側の処理も大変

難しいですね。

Nozomi Taniguchi さんのコメント...

わぁ!情報ありがとうございます!
やはりDBを超えてのSSJS参照はできないのですね…残念です(T_T)

クライアントサイドのJavascriptからエージェントのキックなら、
URLパラメータでエージェントに値を渡せるので実装できそうですね!
ただ、それだとXPages関係なくなっちゃいますけど(汗)

Hiro-aki Komine さんのコメント...

自分で振った課題を解決しました。
レプリカとか NSF の環境が自由に変わる LL乙sNotes/Domino の世界で、外部の NSF にある SSJS を呼び出すのはよろしくないのだと思います。
その場合はやっぱり XPages Extensibility API による XPages コントロールの追加をしないといけないと思います。
ということで実装してみました。

XPages アクセスログ機能をコントロールとして実装してみる