Lotus Connections を使用した教育産業向けのよりスマートなコラボレーション: パート 3 プロフィールを使用した研究内容の共有と助成金の交付

ウィジェットと Lotus Connections を使用してユーザー・インターフェースを作成する

この記事では、研究助成金と学術研究内容に関する情報を使用して、IBM Lotus Connections プロフィールのページを拡張する方法について学習します。また、助成金とパブリケーションに関するソース・コンテンツを収集し、詳細なテキスト分析用にそれを保管する方法を、サンプル・アプリケーションを使って示します。コンテンツをランク付けし、プロフィール・ユーザーの研究内容を示すタグ・クラウドに変換します。UI は、XML ファイルと JavaScript ファイルによって構成される 2 つのカスタム・ウィジェットを使用して実装します。

Ilya Afanasiev, Software Engineer, IBM

Photograph of Ilya AfanasievIlya Afanasiev is a software engineer with over seven years successful working experience and rich skill set in various fields, including software research, development, support, and quality assurance. He joined IBM in 2007 as z/OS Systems Programmer in Russian Systems and Technology laboratory. His current focus is web UI development and prototyping, information retrieval, and Java EE application development. His current research interests are text mining and unstructured text analysis.



Carl Osipov, Software Architect, IBM

CarlCarl Osipov is an experienced software architect with the Strategy and Technology organization in IBM Software Group. His skills are in the area of distributed computing, speech application development, and computational natural language understanding. He has published and presented on Service-Oriented Architecture and conversational dialog management to peers in the industry and academia. His current focus is on design of reuse techniques for composite business services.



2011年 9月 09日

はじめに

IBM Lotus Connections は、今日のワークプレース用に設計されたソーシャル・ネットワーク製品です。この製品の 1 つのコンポーネントである「プロフィール」は、カスタマイズ可能な、オンラインのユーザー・ディレクトリーを提供します。

この記事では、Lotus Connections のプロフィールに拡張を実装し、プロフィールの所有者が自身の研究助成金と学術研究内容に関する情報を用いてプロフィール・ページを拡張する方法について学習します。ページを訪れた他のユーザー (プロフィールの閲覧者) は、プロフィール所有者に交付された助成金のタイトル・リストと、プロフィール所有者の研究内容に基づくキーワードのタグ・クラウドを見ることができます。

この記事のサンプル・アプリケーションでは、国立衛生研究所 (NIH: National Institute of Health) からプロフィール・ユーザーに交付された研究助成金のデータ・ソースとして、TAGGS (Tracking Accountability in U.S. Government Grants System) の Web サイトを使用します。助成金に関する情報は、交付対象者の研究内容の一面だけを示します。このアプリケーションは、プロフィール所有者のパブリケーション (たとえば、Diabetes ジャーナルの記事) を Web 上で収集するような構成もできます。ユーザー用に TAGGS およびオンライン・パブリケーションから収集されたすべてのテキスト・データは、「テキスト分析コレクション」と呼ばれる IBM Content Analytics の非構造化 (テキスト・ベースの) コンテンツ・データベースに保持されます。

アプリケーションは Content Analytics を使用して、コレクションのコンテンツを研究内容に関する洞察へと変換します。Content Analytics には、多数の複雑なテキスト分析機能がありますが、この記事では単純な用語の頻度分析に焦点を当てます。分析の出力として、プロフィール・ユーザーの助成金のタイトルやパブリケーションの要約に最も一般的に見られる用語をランク付けしたリストが得られます。このリストは、研究内容のタグ・クラウドとしてプロフィール・ページにレンダリングされます。


アプリケーションのアーキテクチャー

サンプル・アプリケーションのアーキテクチャーを 図 1 に示します。Web アプリケーションでは一般的なことですが、サーバー・サイドは複数の概念層で成り立っています。

図 1. アプリケーションのアーキテクチャー
アプリケーションのアーキテクチャー
プレゼンテーション層 (Web 層)
Web ブラウザー・クライアントの要求を処理し、プロフィールのユーザー・インターフェース (UI) の HTML をブラウザーに送信する役割を持ちます。Web 層は、アプリケーション固有の My Grant Awards ウィジェットと My Keywords ウィジェットによって拡張された Connections サーバーに基づいています。ウィジェットは、プロフィールの拡張として IBM iWidget 仕様に準拠する必要があります。iWidget 対応コンポーネントのインスタンスは、Dojo および JavaScript を使って実装されたカスタム機能を含むために、両方のウィジェットで使用されます。どちらのウィジェットも、XML ファイルおよび JavaScript ファイルで構成されています。

XML ファイルでは、iWidget 定義構文 (iWidget specification 1.0 の Section 9.1) に従って iWidget インスタンスが宣言されます。この構文に準拠する形で、XML ファイルには、ウィジェットのコンテンツをレンダリングする JavaScript (Dojo) オブジェクトの宣言が含まれています。また、この XML ファイルには、ネイティブな HTML マークアップと JavaScript ソース・コードを含むセクションがあり、UI レンダリング・コントロールを Dojo オブジェクトに渡します。

JavaScript ファイルには、UI レンダリングを行う役割を持つ Dojo オブジェクトの実装が含まれています。このオブジェクトは非同期の HTTP GET 呼び出しと HTTP POST 呼び出し (dojo.xhrGetdojo.xhrPost) を使用し、Java サーブレット・テクノロジーに基づいてビジネス層からデータを取得します。データはサーブレット (HTTP) 応答の形でオブジェクトに返され、クライアント・サイドにおける Web ページの DOM の再書き込みに使用されます。

ビジネス層
プロフィールと拡張 JEE アプリケーションをホストします。後者には、My Grant Awards ウィジェットと My Keywords ウィジェットをサポートする Java サーブレットが含まれています。サーブレットの・ロジックは、データの取得 (この場合は、TAGGS または Diabetes Journal Web サイトからの取得) を行うカスタム・メソッドと、データの分析 (Diabetes Journal パブリケーションで使用されているキーワードの頻度計算) を行うカスタム・メソッドを使用します。

サーブレットは、HTTP 応答メッセージを XML 形式または JSON 形式で返します。プロフィールおよび拡張 JEE アプリケーションのどちらも、EAR ファイルとして WebSphere Application Server にデプロイされています。

統合層
Content Analytics の Web クロールおよびテキスト分析機能を、ビジネス層へのサービスとして公開する役割を持ちます。拡張 JEE アプリケーションは、Java API を通じて Content Analytics と対話します。Content Analytics は、動的に生成された Web ページをクロールする機能を提供しないため、アプリケーションにはカスタム・クローラーの実装も含まれています。

この記事の残りの部分では、上記に示したウィジェット (My Grant Awards と My Keywords) について、クライアント・サイドの機能および UI 実装の詳細を説明します。XML および JavaScript ソース・コードのスニペットも含まれています。


My Grant Awards ウィジェット

My Grant Awards ウィジェットは、プロフィール所有者に交付された研究助成金のリストを表示します (図 2 参照)。

図 2. My Grant Awards ウィジェットの外観
My Grant Awards ウィジェットの外観

ウィジェットのコンテンツは、単一の要素、つまり交付された研究助成金に関する情報を持つ HTML 表によって表されます (データを取得して表を埋める方法の詳細については、この連載のパート 4 で説明します)。

iWidget XML

widgets-config.xml ファイルで参照される XML ファイル (リスト 13 参照) は、プロフィール UI 構成で追加ウィジェットを宣言するために使用されます。プロフィール・アプリケーションへの追加ウィジェットのデプロイ方法については、この記事の付録を参照してください。

My Grants Awards ウィジェットの XML ファイルの内容をリスト 1 に示します。

リスト 1. My Grant Awards ウィジェットの iWidget XML
1 <iw:iwidget id="grants" xmlns:iw=http://www.ibm.com/xmlns/prod/iWidget
2 iScope="GrantsWidgetClass" 
3 supportedModes="view" 
4 title="My Grant Awards">
5 <iw:resource uri="grants.js" />
6 <iw:content mode="view">
7 <![CDATA[
8 <div id="grantsWidget">
9 <script type="text/javascript">
10 iContext.iScope().getGrantAwards();
11 </script>
12 </div>
13 ]]>
14 </iw:content>
15  </iw:iwidget>

上記のリスト 1 について説明します。

  • 行 1: grants という ID を使用して iWidget インスタンスを定義する宣言。
  • 行 2: 宣言の続き。GrantsWidgetClass を JavaScript オブジェクトの名前として使用します。
  • 行 3: ウィジェットが表示モードのみをサポートすることを示します。つまり、プロフィール・ユーザーは、表示可能なウィジェットのコンテンツを変更できないということです。
  • 行 4: ウィジェットのタイトルは「My Grant Awards」です。
  • 行 5: iWidget のリソース・セクションを指定します。
  • 行 6 から 14: iWidget のコンテンツ・セクション。

リソース・セクションによって、iWidget 宣言が、JavaScript オブジェクトの実装を含むソース・コード・ファイルにバインドされます。このオブジェクトのクラス名は、リスト 1 の行 2 によって与えられます。GrantsWidgetClass オブジェクトのインスタンスは、ウィジェットの DOM レンダリングを行う役割を持っています。オブジェクトの実装の詳細については、「Dojo/JavaScript のコード」を参照してください。

コンテンツ・セクションには、My Grant Awards ウィジェットの DOM レンダリング用エントリー・ポイントとして機能するソース・コードが含まれています。リスト 1 の行 8 から 12 で、My Grant Awards ウィジェットの静的 HTML が、grantsWidget という名前の単一の DIV 要素によって構成されます。行 10 で、getGrantAwards() メソッドの呼び出しを通じて、要素のコンテンツが動的に生成されます。このメソッドは、JavaScript オブジェクト GrantsWidgetClass のメンバー・メソッドです。

Web ページ全体の管理 (たとえば、レイアウト) を提供する iWidgetコンポーネントは、ハイレベルのオブジェクト修飾子の iContext によってアクセスされます。iScope() 呼び出しは GrantsWidgetClass オブジェクトのインスタンスを返し (行 2)、このインスタンスは iWidget のロードの前に初期化されます。

Dojo/JavaScript のコード

JavaScript オブジェクト GrantsWidgetClass を実装するのは、My Grant Awards ウィジェットの DOM レンダリングの役割です。grants.js ファイル内の Dojo 宣言をリスト 2 に示します。

リスト 2. grants.js における GrantWidgetClass の Dojo 宣言
1 dojo.require("dojox.xml.DomParser");
2 dojo.provide("GrantsWidgetClass");
3 dojo.declare("GrantsWidgetClass", 
4 null, 
5 { 
6 getGrantAwards: function() {
7 var userName = profilesData.displayedUser.displayName;
8 retrieveGrantsXML(userName);
9 }
10 }
11 );

リスト 2 の行 1 で、DOM 解析および取得に使用される Dojox ルーチンの名前が解決されます。リスト 2 の残りのコードで、Dojo クラスの GrantsWidgetClass が、メソッドや変数も含めて宣言されます。GrantWidgetClass クラスには、1 つのメソッド getGrantAwards だけがあります。このメソッドは、リスト 1 に示されているように、grantsWidget という ID を持つ HTML DIV のコンテンツを生成するために呼び出されます。getGrantAwards() メソッドは、プロフィール所有者の名前を表すパラメーターを使用して JavaScript 関数 retrieveGrantsXML を呼び出します (この所有者のプロフィールが、プロフィール・アプリケーションによって表示されます)。

retrieveGrantsXML 関数のハイレベルの概要を リスト 3 に示します。

リスト 3. retrieveGrantsXML の概要
1 var retrieveGrantsXML = function(authorName) {
2 /* ... */
3 var xhrArgs = {
4 url: "/pubApi/grants",
5 handleAs: "text",
6 preventCache: true,
7 content: {
8 investigator: authorName
9 },
10 load: function(data) {
11 /* ... */
12 var doc = dojox.xml.DomParser.parse(data,"text/xml");
13 var results = doc.getElementsByTagName("award");
14 /* ... */
15 },
16 error: function(error) { /* ...error handling code... */ }
17 };
18 var deferred = dojo.xhrGet(xhrArgs);
19 };

上記の リスト 3 について説明します。

  • 行 18: JavaScript 関数 retrieveGrantsXML は、dojo.xhrGet ルーチンを呼び出すことによって非同期 HTTP GET を実装します。
  • 行 3 から 17: この呼び出しの引数が初期化されます。
  • 行 4: GET 呼び出しの実行中は、制御がサーバー・サイド、つまり URL パスで示されるサーブレットに渡されます。
  • 行 7 から 9: サーブレットに渡されるパラメーターは、コンテンツ・セクションにリストされます。
  • 行 10 から 15: ウィジェットのコンテンツを更新する役割を持つコードは、load 関数内にあります。

    この関数は、ブラウザーがサーブレットから応答を受け取り次第、呼び出されます。応答コンテンツは、load 関数のパラメーターである data 変数を介して渡されます。

My Grant Awards サーブレットによって生成される通常の応答は XML 形式です。例をリスト 4 に示します。

リスト 4. My Grant Awards サーブレットの通常の応答
1 <grants-list faculty="Joel Francis Habener" GAManagerVersion="1.0">
2 <award>
3 <fiscal_year>2008</fiscal_year>
4 <opdiv>NIH</opdiv>
5 <award_number>R01DK030834</award_number>
6 <award_title>GLUCAGON BIOSYNTHESIS AND METABOLISM</award_title>
7 <principal_investigator>JOEL F HABENER</principal_investigator>
8 </award>
9 </grants-list>

Dojo XML DOM パーサーを使用してサーブレットの応答データが解析されると (リスト 3 の行 12 から 13)、すぐに結果が図 2 に示すような HTML 表で表示されます。


My Keywords ウィジェット

ユーザーは My Keywords ウィジェットを使用して、プロフィール所有者の主な研究内容を素早く理解できます。このウィジェットは、プロフィール所有者のパブリケーション、助成金の説明、および他の Web ソース (PubMed など) で最も一般的に見られるキーワードを表示します。My Grant Awards ウィジェットとは異なり、My Keywords ウィジェットには、プロフィール所有者がウィジェットの外観と表示内容をカスタマイズするためのコントロールがあります。

プロフィール・ユーザーは、リスト・ビューとクラウド・ビューを切り替えられます。リスト・ビューを図 3 に示します。

図 3. My Keywords ウィジェットのリスト・ビュー
My Keywords ウィジェットのリスト・ビュー

クラウド・ビューを図 4 に示します。

図 4. My Keywords ウィジェットのクラウド・ビュー
My Keywords ウィジェットのクラウド・ビュー

プロフィール所有者は追加コントロールを使用して、ウィジェットで表示する内容をカスタマイズできます (図 5 参照)。たとえば、所有者は、キーワード抽出用に複数のソースを選択する、または一部のキーワード (図 5 では「stop words」と呼ばれています) が表示されないようにする、などが可能です。

図 5. My Keywords ウィジェットの追加コントロール
My Keywords ウィジェットの追加コントロール

プロフィール所有者の Alice が自分のプロフィールを見る場合、図 4 に示すウィジェットのクラウド・ビューには、Alice 自身のキーワードが表示されます。別のプロフィール・ユーザー Bob が Alice のプロフィールを閲覧しようとすると、My Keywords ウィジェットによって、Bob のプロフィールにあるキーワードと一致する Alice のキーワードが強調表示されます。図 6 は、Bob から見た Alice のプロフィールで、共通のキーワードが強調表示されています。

図 6. My Keywords ウィジェット、類似キーワードを持つクラウド・ビュー
My Keywords ウィジェット、類似キーワードを持つクラウド・ビュー

iWidget XML

My Keywords の iWidget XML ソース・コードは、ハイレベルの構造については My Grant Awards ウィジェットのソース・コードと同じですが、実装の詳細が大きく異なっています。リスト 5 のコード・サンプルでは、キーワード抽出に使用するソース名のリストを持ったストリングが作成されます。図 5 の「Extract keywords from」ラベルにおけるソースは次のとおりです。

リスト 5. キーワード・ソースのリストの作成
1 kwGetExtractableSources = function() {
2 str_extract_from = "";
3 if (dojo.byId("chkbox_1").checked) { 
4 str_extract_from += ",source_1";
5 }
6 if (dojo.byId("chkbox_2").checked) {
7 str_extract_from += ",source_2";
8 }
9 str_extract_from = str_extract_from.substring(1,str_extract_from.length);
10 if(str_extract_from=="") {
11 str_extract_from = "default_source"; 
12 }
13 return str_extract_from; 
14 }

このストリングは、他のパラメーターとともに My Keywords サーブレットに渡されます。

My Grant Awards の実装と同様に、My Keywords ウィジェットにも、GUI をレンダリングする役割を持った独自の JavaScript オブジェクトがあります。オブジェクトのメソッドの 1 つが My Keywords iWidget XML ファイルから呼び出されます (リスト 6 参照)。このメソッドは、抽出可能なソース・リストを表すストリングを受け取ります。ストリングは、リスト 5 に示されている関数を呼び出すことによって取得されます。

リスト 6. My Keywords ウィジェット内部の初期更新
1 document.getElementById("kw_status").innerHTML += "Loading keywords...";
2 iContext.iScope().kwInitialUpdate (kwGetExtractableSources());

図 5 の一番下にある「Update current view」ボタンがクリックされたときの処理を行うコードをリスト 7 に示します。

リスト 7. 「Update current view」ボタンのクリックを処理するコード
1 <script type="text/javascript"> 
2 kwProcessUpdateCall = function() {
3 str_extract_from = kwGetExtractableSources();
4 iContext.iScope().kwInterimUpdate(kwGetExtractableSources(),
5 kwCurrPage, kwCurrView);
6 }
7 </script>
8 <form name=stopWordsForm>
9 <textarea name=stopWordsText id=kw_stopwords_editable cols=25 rows=5>
10 </textarea>
12 </form>
13 <input type="button" class="lotusBtn lotusBtnSpecial" name="submit_all" 
14 value="Update current view" onClick=kwProcessUpdateCall();/>

2 つの異なるメソッドが呼び出されることに注意してください。

2 つのメソッドは、ウィジェットの GUI レンダリングを開始するそれぞれのエントリー・ポイントとなります。詳細については、「ウィジェット GUI のレンダリング」を参照してください。


ウィジェットのコントロールに対する役割ベースの許可

Lotus Connections のプロフィールを表示しているユーザーは、2 つの役割 (プロフィール所有者またはプロフィール閲覧者) のいずれかです。プロフィール所有者はプロフィールを作成したユーザーなので、そのプロフィールを変更できます。プロフィール閲覧者はプロフィールの表示は可能ですが、変更はできません。

My Grant Awards ウィジェットは、プロフィール所有者にもプロフィール閲覧者にも同じように表示されます。しかし、My Keywords ウィジェットは、プロフィール所有者とプロフィール閲覧者では表示が異なります。プロフィール閲覧者には、My Keywords ウィジェットによって表示されるコンテンツを変更する権限がありません。プロフィール所有者が利用できるコントロールを図 5 に示します。

役割ベースのウィジェットの許可は Dojo の onLoad 関数に実装されています。この関数は、ウィジェットをロードするプロセスの完了時に、Dojo によって呼び出されます。リスト 8 に示す onLoad 関数は、次の 2 つの変数を使用します。

  • pObserved – 現在、プロフィールが閲覧されているユーザーを表します。
  • pLoggedIn – 現在、プロフィール・アプリケーションにログインしているユーザーを表します。
リスト 8. Dojo onLoad() 関数における、役割ベースのシンプルな許可
1 onLoad: function () {
2 var pObserved = this.personObserved;
3 var pLoggedIn = this.personLoggedIn;
4 if(pObserved != null && pLoggedIn != null && pObserved == pLoggedIn) {
5 dojo.byId('kw_cust_expand').style.display = "";
6 }
7 }

2 つの変数の英数字を比較した結果に応じて、kw_cust_expand という ID を持つ HTML 要素を表示するか、非表示のままにするかが決められます。この HTML 要素は、図 3 および図 4 に示されている「Customize this view」リンク要素を表します。ウィジェットは 1 度だけロードされるため (ブラウザーがプロフィール・ページをロードするときに)、役割による許可を連続して維持する必要はありません。

重要な点として、リスト 6 に示した My Keywords ウィジェットの初期化コードによって呼び出される kwInitialUpdate メソッドは、ウィジェットがロードされる前に呼び出されることに注意してください。Dojo の onLoad 関数は kwInitialUpdate メソッドの呼び出しの後で呼び出されるため、kwInitialUpdate は、Dojo の onLoad 関数によって使用されるオブジェクト変数の personObservedpersonLoggedIn を初期化します。

ウィジェット GUI のレンダリング

ウィジェットの GUI のレンダリングを開始する 2 つのエントリー・ポイント (メソッド) については、すでに説明しました (リスト 6 および リスト 7 参照)。

  • kwInitialUpdate は、初期ロード時にウィジェットのコンテンツを更新します。
  • kwInterimUpdate は、ユーザーが「Update current view」(図 5 参照) をクリックした後に、ウィジェットのコンテンツを更新します。

ウィジェットの初期更新は、kwUpdateContents 関数呼び出しを用いて行われます (リスト 9 の行 4 を参照してください)。

リスト 9. My Keywords ウィジェット用の初期および途中更新メソッドの実装
        1 kwInitialUpdate: function(extractableSources) { 
        2 /* initialization of personObserved and personLoggedIn */
3 /* ... */
4 kwUpdateContents(this,personObserved,0);
5 }
6 kwInterimUpdate: function(extractableSources, currPageId, currView) { 
7 /* ... */
8 kwUpdateStopWords(this, personLoggedIn,extractableSources,currPageId);
9 }

上記の関数の実装をリスト 10 に示します。

リスト 10. My Keywords ウィジェット用の非同期 HTTP GET 呼び出しの実装
1 var kwUpdateContents = function(kwClassInstance,investigatorName,currPage) {
2 var xhrArgs = {
3 url: "/termsfrequency_proxy/termsfrequency",
4 handleAs: "text",
5 preventCache: true,
6 content: {
7 investigator: investigatorName,
8 compare_with: kwClassInstance.personLoggedIn,
9 extract_from: termsSources, 
10 threshold: 2
11 }, 
12 load: function(data) {
13 /* ... */
14 kwClassInstance.xmlParsed = dojox.xml.DomParser.parse(data);
15 kwUpdateWidgetInternals(kwClassInstance,currPage);
16 /* ... */
17 },
18 error: function(error) {
19 /* error handling ... */
20 }
21 };
22 var deferred = dojo.xhrGet(xhrArgs);
23 };

リスト 10 では、/termsfrequency_proxy/termsfrequency を URL パスとして使用し、content スコープ (行 6 から 11) からの要求パラメーターを使用して、HTTP GET が非同期に呼び出されます。HTTP GET がデータを返すとすぐに、load 関数は kwUpdateWidgetInternals 関数によってカプセル化された実装を呼び出すことにより、GUI レンダリングを実行します。

kwInterimUpdate メソッドは kwUpdateStopWords 関数を呼び出します。この関数は、(kwUpdateContents とは異なり) 非同期の HTTP POST を呼び出します。HTTP POST 要求がサーバー・サイドで処理されるとすぐに、制御が呼び出し側 (kwUpdateStopWords 関数) に戻されます。この関数は kwUpdateContents を呼び出します。リスト 11 の行 14 と 15 を参照してください。

リスト 11. My Keywords ウィジェット用の非同期 HTTP POST 呼び出しの実装
1 var kwUpdateStopWords = 
2 function(kwClassInstance,userName,termsSources,currPage) {
3 var stopWordsEditable = dojo.byId("kw_stopwords_editable");
4 var stopWordsGiven = "";
5 if(stopWordsEditable.value != "Add your own stop words to here...") {
6 stopWordsGiven = stopWordsEditable.value; 
7 }
8 var xhrArgs = {
9 url: "/termsfrequency_proxy/termsfrequency",
10 postData: "updated_stopwords_list="+stopWordsGiven+"+
11 "&investigator="+username+"&terms_sources="+termsSources,
12 error: function(error) {/* ... error handling ... */}
13 };
14 var handler = dojo.xhrPost(xhrArgs);
15      handler.addCallback(kwUpdateContents(kwClassInstance,userName,currPage));
16 };

Dojo Tag Cloud ウィジェットの使用

kwDisplayCloudView メソッドを使用して、ユーザー・キーワードをクラウドとして表示します (図 4 および 図 6 参照)。クラウドは、My Keywords ウィジェットが更新されるたびに最初から作成される Dojo Tag Cloud オブジェクトを使用して実装されます。

Dojo Tag Cloud は、読み取り専用のデータ・ストアである dojo.data.ItemFileReadStore と連携して機能します。ウィジェットの初期化中に一度、データ・ストアはメタデータを使用して生成されます。メタデータとは、キーワードとその頻度のリスト、および同様のタグ・クラウドのレンダリングに使われる追加マークアップです。My Keywords サーブレットからの応答により、キーワードとその頻度を XML および JSON で表したものがデータ・ストアに格納されます。My Keywords ウィジェットはリスト・モードで XML を使用し、クラウド・モードで JSON を使用します。

Dojo Tag Cloud ウィジェットをレンダリングする役割を持ったロジックの実装をリスト 12 に示します。

リスト 12. Dojo.TagCloud ウィジェットの実装
1 kwDisplayCloudView: function() {
2 var kwCloudDivName = "kw_cloud_placeholder";
3 var kwCloudRootName = "kw_cloud_root";
4 if(this.oCloud == null) {
5 this.jsonStore = 
6           new dojo.data.ItemFileReadStore({data:this.termsJson,clearOnClose:true});
7 var kwCloudDiv = dojo.byId(kwCloudDivName);
8           this.oCloud = new myDojo.TagCloud({store: this.jsonStore},kwCloudDiv);
9 } else {
10 this.jsonStore.close();
11 this.jsonStore._jsonData = this.termsJson;
12 this.jsonStore.fetch();
13 this.oCloud.destroy();
14 kwCreateCloudDiv(kwCloudDivName, kwCloudRootName);
15 var kwCloudDiv = dojo.byId(kwCloudDivName);
16          this.oCloud = new myDojo.TagCloud({store: this.jsonStore},kwCloudDiv);
17 }
18 }
19
20 var kwCreateCloudDiv = function(divName, rootName) {
21 _kwCreateCloudDiv_impl('div', {id: divName, widgetid: ""}, rootName);
22 }
23
24 _kwCreateCloudDiv_impl = function(tag, attrs, ref, pos){
25 var n = dojo.doc.createElement(tag);
26 if(attrs) dojo.attr(n, attrs);
27 if(ref) dojo.place(n, ref, pos);
28 return n;
29 }

上記のリスト 12 について説明します。

  • 行 5 から 8: dojo.TagCloud オブジェクトの初期作成を処理します。
  • 行 10 から 16: 前の手順で作成された dojo.TagCloud オブジェクトと、それにバインドされている読み取り専用データ・ストアをクリーンアップする役割を持っています。
  • 行 2、7、8: 初期 dojo.TagCloud オブジェクトを、事前に作成された DOM 要素に添付します。それ以降のすべての dojo.TagCloud オブジェクトの再作成は、最初に DOM 要素を廃棄することによって行われます。
  • 行 14、15、および 20 から 29: この DOM 要素は最初から新たに作成されます。その後で、新規の dojo.TagCloud オブジェクトがこの DOM 要素内に作成されます。

まとめ

この記事では、IBM Lotus Connections と IBM Content Analytics を統合し、Connections のユーザーが研究内容のキーワードと研究助成金に関する情報を共有できるようにすることの利点について学習しました。まず、アプリケーションのアーキテクチャーを取り上げ、My Keywords iWidget と My Grant Awards iWidget の詳細について説明しました。次に、Dojo を使用したウィジェットの HTML および JavaScript の実装について説明しました。プロフィールでの役割ベースの許可を理解する上で役に立つサンプル・ソース・コードも含まれています。さらに、ウィジェットと Java サーブレット間の HTTP 通信を有効にする方法を説明しました。

この連載のパート 4 では、サーブレットの実装と Content Analytics との統合にフォーカスします。ご期待ください。


付録

プロフィール・アプリケーションへの追加ウィジェットのデプロイ

この記事で説明した、ウィジェットを宣言する XML ファイルへのパスは、widgets-config.xml ウィジェット構成ファイル内にあります。既存のウィジェットを構成する、またはカスタム・ウィジェットをプロフィールで利用可能にするには、widgets-config.xml ファイル内の設定を変更します。詳細については、「プロフィールのウィジェットの構成」を参照してください。この構成ファイルは、Lotus Connections のプロフィールの UI コンテンツをカスタマイズするために使用されます。

リスト 13 に、プロフィールのウィジェット構成ファイルにおける My Grant Awards ウィジェット定義の一部として、My Grant Awards ウィジェットの宣言 XML ファイルの例を示します。

リスト 13. widgets-config.xml での My Grant Awards ウィジェット定義
<widgetDef defId="myGrantAwards" bundleRefId="extraBundle" 
           url="{context_root}/extra-widgets/grantsWidget.xml?version={version}"/>

参考文献

学ぶために

製品や技術を入手するために

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Industries, Lotus
ArticleID=742501
ArticleTitle=Lotus Connections を使用した教育産業向けのよりスマートなコラボレーション: パート 3 プロフィールを使用した研究内容の共有と助成金の交付
publish-date=09092011