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

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

2017年7月31日月曜日

Notes/DominoでRSSフィードを作成してみよう

皆さん、こんにちは。
7月も今日で終わりです。世間では学生さんたちは夏休み真っ盛りですね。
社会人な皆さんは夏休みはしっかりと取得しているでしょうか?
時には休息も必要なものですので、しっかりと休むようにしましょう。

私はと言えば、普段は暇をしていますが(汗)、なぜかここ最近は忙しくなってしまい、なかなか休息が取れていませんが・・・

忙しかった理由の一つに
こちらがあります。
「カレンダーアーカイブ with OnTime」という製品です。

OnTime Group Calendarという製品は皆さんご存知かと思いますが、その製品群の一つにOnTime Open APIというものがあります。
それを利用してNotesメールDBに含まれるスケジュール文書をアーカイブするという製品を開発してみました。
この製品の開発は(有)アクセルの岡本様のご協力がなければ実現できませんでした。
改めてここで感謝の意を表明します。ありがとうございました。

ちなみに製品については以下のリンクを参照してください。
株式会社エフHP内製品ページ: http://www.effect-force.co.jp/product2/carchive.html
OnTime Group CalendarHP内製品ページ: https://ontimesuite.jp/calendar-archive.php

気になった方は、上記のページからお問い合わせをしてみてください。


では、今日の話題に行きましょう。
「Notes/DominoでRSSフィードを作成してみよう」というものです。

IBM Notes/Domino 8.5からは「RSS Feed Generator」という標準テンプレートがついてくるので、それを使えば簡単にRSSフィードが作成できますが、それは別の機会で設定方法を紹介したいと思います(画面ショットとか面倒なんですよ(笑))。


今回は、JavaとXPagesを組み合わせて、実現してみようと思います。

実装する内容は次の通りとします。
特定のNotes DBに新規作成された文書をRSSフィードに表示させるようにする
  • 「特定のNotes DB」はXPages化されているものとする
  • 「特定のNotes DB」は1つだけとする(複数のNotes DBには対応させません)
  • 「特定のNotes DB」はハードコーディングではなく、環境設定文書に保存しておく
  • 「RSSフィード」の対象は 主文書だけとする(返答文書は対象外)
  • 「タイトル」はSubjectフィールド、本文は「Body」フィールドとする
  • WebブラウザでXPages画面を開くとRSSフィードのページが表示されるようにする

では早速見ていきましょう。

1.RSSフィード対象のNotes DBの設定を行う

・まず、フォームには「タイトル」用のフィールドが必要になります。
・RSSフィードは新規に作成された文書を取得するものなので、日付順のビューを用意します。
このビューは、主文書だけを表示するようにしておきます(選択式を記述してください)。
1列目に更新日時の列(式は@Modifiedで良いでしょう)を設定します。この時、「降順」でソートしておきます。
2列目以降はあってもなくても構いません。結果を分かり易くするのであれば、「タイトル」列を設定しておけばいいでしょう。
・「ACL」の設定を行います。通常ならば「-Default-」や「Anonymous」を読者にしておいた方がいいですが、社内で利用するのであれば、社内のルールに則ってACLを設定しましょう。

2.RSSフィードを表示するためのNotes DBを作成する

RSSフィードの対象Notes DBの設定ができたので、次に本体のNotes DBを作成します。
まずは、「環境設定文書」フォームです。
こんな感じのものを作ってみました。テスト用なので簡潔にしてあります。
環境設定文書の画面

「Notes DBファイルパス」は、Notes DBのパスです。Notes DBの新着文書の情報を取得する際に利用します。
「Notes DBタイトル」は、Notes DBのタイトルです。RSSフィードで表示するのに利用します。
「Notes DBホスト名(URLパス)」は、Notes DBをWebブラウザで表示する際のパスを記述します。RSSフィードなので、WebでNotes文書を表示するのに利用します。
「Notes DBの説明」は、RSSフィード画面で表示するものです(これは任意の値で良いです)
「対象ビュー名」は、Notes DBの新着文書の情報を取得する際に利用します。

フォームが出来たら、文書を作成します。
ここでは対象とするNotes DBは一つだけと決めておきましたので、文書は一つだけ作成します。

3.対象となるNotes DBの新着文書を取得するコードを作成する

今度は、対象となるNotes DBの新着文書を取得します。
そのためのコードは次のようにしました。

var getNotesData = function( configData ) {
    var dbFeed:NotesDatabase = null;
    var vwFeed:NotesView = null;
    var docFeed:NotesDocument = null;
    var retFeed = [3];
    retFeed[0] = new Array();
    retFeed[1] = new Array();
    retFeed[2] = new Array();
    try {
        dbFeed = session.getDatabase( "", configData[1] );
        vwFeed = dbFeed.getView( configData[2] );
        docFeed = vwFeed.getFirstDocument();
        var i = 0;
        while ( docFeed != null ) {
            retFeed[0][i] = docFeed.getItemValueString( "Subject" );
            retFeed[1][i] = configData[3] + "%24%24OpenDominoDocument.xsp?action=openDocument&documentId=" + docFeed.getUniversalID();
            retFeed[2][i] = docFeed.getItemValueString( "Body" );
            
            var docTmp:NotesDocument = vwFeed.getNextDocument( docFeed );
            docFeed.recycle();
            docFeed = docTmp;
            i++;
        }
    } catch(e) {
        print( "Error occurred at [getNotesData] -----From-----" );
        print(e);
        print( "Error occurred at [getNotesData] -----To-----" );
    } finally {
        if ( docFeed != null ) docFeed.recycle();
        if ( vwFeed != null ) vwFeed.recycle();
        if ( dbFeed != null ) dbFeed.recycle();
    }
    return retFeed;
}


対象のNotes DBから指定したビューの全文書を二次元配列に格納して返しています。
テスト用なので、ビューの全文書にしていますが、運用し続けていくと、文書数がどんどん増えていきますので、その辺はビューで制御するか、上のプログラムを改修するかなどして工夫してみてください。


ここで、引数のconfigDataを生成するための関数が必要になりますが、それは下記のようにしました。

var getConfig = function() {
    var vwConfig:NotesView = null;
    var docConfig:NotesDocument = null;
    var retData = [];
    try {
        vwConfig = database.getView( "vwConfig" );
        docConfig = vwConfig.getFirstDocument();
        retData[0] = docConfig.getItemValueString( "NotesDBTitle" );
        retData[1] = docConfig.getItemValueString( "NotesDBPath" );
        retData[2] = docConfig.getItemValueString( "ViewName" );
        if ( @Right( docConfig.getItemValueString( "NotesURL" ), 1 ) == "/" ) {
            retData[3] = docConfig.getItemValueString( "NotesURL" );
        } else {
            retData[3] = docConfig.getItemValueString( "NotesURL" ) + "/";
        }
        retData[4] = docConfig.getItemValueString( "NotesDBDescription" );
    } catch(e) {
        print( "Error occurred at [getConfig] -----From-----" );
        print(e);
        print( "Error occurred at [getConfig] -----To-----" );
    } finally {
        if ( docConfig != null ) docConfig.recycle();
        if ( vwConfig != null ) vwConfig.recycle();
    }
    return retData;
}


環境設定文書を取得して、そこから必要なフィールド値を配列に格納して返しています。
この辺はもっとスマートなやり方があるでしょうから、色々と工夫してみてください。


4.XAgentで画面出力部分のコードを生成

次に実際に取得できた(はずの)RSSフィードを画面に表示するコードを記述します。
こちらです。

// Generated RSS Feed
var outData = genFeed( cfg, notesData );
var exCon    = facesContext.getExternalContext();
var writer   = facesContext.getResponseWriter();
var response = exCon.getResponse();
response.setContentType( "text/xml" );
response.setHeader( "Cache-Control", "no-cache" );
writer.write( outData );
writer.endDocument();
facesContext.responseComplete();


こちらはXAgentを使用して画面に出力しています。
これは、rss.xspというXPageに設定しました。
RSSフィードはXMLデータなので、出力データのタイプを「"text/xml"」にしています。
XAgentについては、XAgentとは?で言及していますのでこちらを合わせてチェックしてください。
なお、「genFeed」という関数で実際にRSSフィード用のデータを作成しています。



5.RSSフィードを作成する

実際にRSSフィードを生成するためのコードを記述します。
これはJavaのライブラリを使用すると簡単に実装できます。
実装方法は、JavaFXでRSSを作成・読込・表示(ROMEライブラリ)の記事を参考にさせていただきました。
というかほぼ、この記事の中にあるサンプルコードで実装できました。
ですので、コードについては「あえて」記述しません。

実装方法だけ説明していきます(以下の操作は、Domino Designer 9.0.xの場合です)。
1.まず、Javaのコードを記述するのに必要なJavaライブラリファイルをダウンロードします。
2.Domino DesignerでNotes DBを開いたら、設計要素の「Jar」を開きます。
3.[Jarのインポート]メニューでダウンロードしたJavaライブラリファイルをインポートします。
インポートjarファイルの一覧
4.設計要素の「Java」を開いて、新規クラスを作成します。
「パッケージ」と「名前」に任意の値を入力して、[終了]をクリックします。
Javaクラスの生成
5.Javaのコードを記述します。
ここはノーヒントです。

6.XPagesからJavaプログラムを呼び出す

Javaプログラムを書いたのは良いけど、XPagesからどう呼び出すの?となりそうなので、ここは呼び出し方を書いておきます。
サンプルコードは次の通りです。

var genFeed = function( configData, notesData ) {
    var rssFeed:jp.hogehoge.GenerateRSSFeed = new jp.xpages.GenerateRSSFeed();
    return rssFeed.genFeed( configData, notesData );
}



var rssFeed:jp.hogehoge.GenerateRSSFeed = new jp.xpages.GenerateRSSFeed();
でrssFeedという変数にJavaの関数を割り当てています。
次のrssFeed.genFeed( configData, notesData );
でJavaプログラム内のメソッドを呼び出しています。
戻り値はRSSフィードのXMLデータとなります。


7.確認してみよう

実際にrss.xspというXPageを表示した画面がこちら(ブラウザはfirefoxを使用)。
rss.xspを表示したらRSSフィードの画面になった

ちゃんと、Notes DBの文書のようなものが表示されています(データは適当です・・・)


どうでしょうか?
これの面白いところは、Notes DBであれば、どんなものもRSSフィードの対象になりうるというところです。
Web化したのはいいけど、新着情報の取得とかどうしよう・・・というときにつかえる(かもしれません)。
例えば、カレンダー情報がアップデートされた時にこのRSSフィードを使うと、メールDBを開かなくても何か情報が追加されたことが分かるようになったりしますね。



上記で紹介した「カレンダーアーカイブ with OnTime」もJavaプログラムを使っていますが、NotesとJavaはかなり相性が良いので、皆さんもJavaを覚えてNotes アプリケーションをレベルアップしましょう!



それでは今日はこの辺で・・・




Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

0 件のコメント: