IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  Lotus  >

PortalベースのWorkplaceアプリケーション開発手法について

開発元直送!シリーズ

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません


レベル: 初級

林田 憲昌 (hysd@jp.ibm.com), WPLC開発 / ソフトウェア開発研究所 , IBM

2006年 4月 07日

IBM Workplace Collaboration Services (WCS) および IBM Workplace Services Express (WSE) は、WebSphere Portalをベースとした安定性と拡張性を兼ね備えるフロントエンド統合のためのミドルウェアで、より効率的な共同作業を可能とするコラボレーション環境を提供しています。本稿では、そのWCS/WSE上で動作するWorkplaceアプリケーションをどのように設計し、開発していったらよいのかについて、その手順を簡略化してくれるCollaborative Component Wizardを用い、実際の例を示しながら説明していきます。

(本稿は、Portal Tools がインストールされているRational Application Developer v6.0.1およびIBM Workplace Software Development Kits v2.6を用いて開発を行い、Windows 2000サーバー上にインストールされたIBM Workplace Collaboration Services v2.6にデプロイして動作確認することを前提としています。)

開発環境の構築

まず初めに、Workplaceアプリケーションを効率的に開発するために開発環境を整えます。基本的には通常のポートレットを開発する場合と大きな違いはないため、Portal ToolsがインストールされたRational Application Developer(RAD)を用いれば問題なく開発を行うことはできますが、さらにCollaborative Component Wizardを利用することによって、推奨されるWorkplaceアプリケーションのアーキテクチャーに基づいたプロジェクトやソースコードの自動生成が可能になります。この自動生成されたプロジェクト内では、各APIがすでに利用可能な状態になっており、開発初期における設定の煩わしさも幾分解消してくれます。以上のようなことから、理想的なデザインを有するWorkplaceアプリケーションの開発を素早く開始するために、このWizardを利用することをお薦めしています。

Collaborative Component Wizard for IBM Workplace Applications のインストール

本稿で用いるCollaborative Component Wizardをお使いのRADにインストールします。IBM Workplace Software Development Kit v2.6(Workplace SDK)をこちらのサイトからダウンロードし、任意のディレクトリー(例:. C:\workplacesdk26。以下、<WCSAPI_HOME>と表記します)に展開してください(図1)。<WCSAPI_HOME>\wcsapi\tools\CollaborativeComponentWizard以下に Collaborative Component Wizard pluginが格納されています。詳細なインストール方法についてはWorkplace SDKに含まれているユーザーズ・ガイド(<WCSAPI_HOME>\doc\ wcsapi26_ug.pdf)第5章「SDK Sample Code」内の「The Collaborative Component Wizard」を参照してください。


図1.展開されたWorkplace SDK
図1.展開されたWorkplace SDK

ビルド・パスの設定

Workplace特有のライブラリーを使用するために、ライブラリーが置かれているフォルダをクラスパス変数として定義します。

RADのメニューから「ウィンドウ」 -> 「設定」を選択して設定画面を開き、「Java」 -> 「ビルド・パス」 -> 「クラスパス変数」を選択します(図2)


図2.クラスパス変数の設定画面
図2.クラスパス変数の設定画面

「新規」ボタンをクリックし、以下のようなクラスパス変数を追加してください。Workplace SDKに同梱されているサンプルや、Collaborative Component Wizardによって作成されるアプリケーションのひな形は、すべてこれと同じ名前の変数を使用しています。

名前: WCS_HOME
パス: WCSがインストールされているディレクトリー。WCSがインストールされているマシンが開発マシンと異なる場合は、NetBIOSやSamba等を用いてWCSのディレクトリーをネットワーク・マウントしてください(図3)。


図3.WCS_HOME の設定
図3.WCS_HOME の設定

名前: WCSAPI_HOME
パス: Workplace SDKを解凍したディレクトリー(図4)。


図4.WCSAPI_HOME の設定
図4.WCSAPI_HOME の設定

図5のように変数が追加されたことを確認し、「OK」をクリックして設定を保存してください。


図5.クラスパス変数設定後の画面
図5.クラスパス変数設定後の画面



上に戻る


ウィザードによるWorkplaceアプリケーションのひな形作成

RADのメニューから「ファイル」 -> 「新規」 -> 「プロジェクト」を選択し、新規プロジェクト・ダイアログを表示します。「IBM Workplace」というカテゴリーが追加されているので、「Workplace Collaboration Services Component」を選択して「次へ」をクリックしてください(図6)。


図6.新規プロジェクトウィザード
図6.新規プロジェクトウィザード

任意のコンポーネント名を入力し、「次へ」をクリックしてください(図7)。


図7.コンポーネント名の設定
図7.コンポーネント名の設定

任意のクラス名およびパッケージ名を入力し、「終了」をクリックしてください(図8)。


図8.各プロジェクトで使用されるクラス名およびパッケージ名の設定
>図8.各プロジェクトで使用されるクラス名およびパッケージ名の設定

5つのプロジェクトが自動的に生成されます(図9)。この段階ですでにWorkplaceアプリケーションとして動作させることができる状態になっています。後は、通常のポートレットを開発する場合と同じように、JSPやJSFなどでUIを作成したり、EJBなどを使ってビジネス・ロジックを記述したりしていくことになります。


図9.自動的に生成されるプロジェクト
図9.自動的に生成されるプロジェクト



上に戻る


Component and Application Infrastructure Services APIs (Services APIs) の利用

Workplace SDKに含まれているServices APIsを利用することで、メッセージングやドキュメントといったIBMが提供しているさまざまなサービスやコンテンツにアクセスすることが可能になります。詳細についてはこちらの解説を参照してください。ここでは、先ほどウィザードで作成したWorkplaceアプリケーションのひな形を拡張し、ログインしているユーザーのメール一覧をこのServices APIsを使って取得し、表示させるサンプルを作成します。その際に、どのようなアプリケーション・デザインを用いたらよいかについても触れていきます。

推奨されるWorkplaceアプリケーションのアーキテクチャー

IBMが提供しているWorkplaceアプリケーションは図10に示すような4層構造からなるモデルをアーキテクチャーとして採用しています。これは一般的なWebアプリケーションで用いられている3層構造のモデルを拡張したもので、拡張性や柔軟性の点において、より優れた仕様となっています。そのため、Workplaceアプリケーションを開発する際にはこの4層モデルを用いることが推奨されています。


図10.Workplaceアプリケーションが採用している4層構造のモデル
図10.Workplaceアプリケーションが採用している4層構造のモデル

Collaborative Component Wizardによって生成されたアプリケーションのひな形もこのモデルに従っているため、Services APIsを用いた拡張もこの点を考慮して行っていくことにします。具体的には、まず、サービス層にあるEJBにAPIを使ってメール一覧を取得するようなメソッドを用意し、ワークスペース層のDelegateから呼び出すことができるようにします。そして、UIを生成するJSPファイル(ユーザー層)からそのDelegateを介してEJBのサービスを利用し、メールの情報を取得・描画を行うようなコードを追加していくことにします。

メール一覧を取得するメソッドをEJBに追加

ウィザードにより、サービス層に相当するEJBプロジェクト(例: WCSSampleAppServiceEJB)が生成されているので、このプロジェクト内のSessionBeanのクラス(例: WCSSampleAppServiceBean.java)に以下のようなメソッドを追加します。

…
import com.ibm.workplace.api.common.data.TreeRetrievalOptions;
import com.ibm.workplace.api.common.exception.WorkplaceException;
import com.ibm.workplace.api.factory.FactoryCreator;
import com.ibm.workplace.api.factory.MailFactory;
import com.ibm.workplace.api.factory.ServiceFactory;
import com.ibm.workplace.api.mail.data.MailFolder;
import com.ibm.workplace.api.mail.data.MailFolderEntry;
import com.ibm.workplace.api.mail.data.MailMessage;
import com.ibm.workplace.api.mail.data.MailRetrievalOptions;
import com.ibm.workplace.api.mail.service.MailService;
import com.ibm.workplace.api.mail.service.MailServiceConstants
…
…
   public MailMessage[] getMailMessage() throws WorkplaceException {
      List mailMsgList = new ArrayList();

      ServiceFactory serviceFactory = FactoryCreator.createServiceFactory();
      MailService mailService = serviceFactory.createMailService();
      MailFactory mailFactory = FactoryCreator.createMailFactory();

      if (!mailService.isAvailable()) {
         throw new WorkplaceException();
      }

      MailRetrievalOptions options = mailFactory.createMailRetrievalOptions();
      options.setDescendantDepth(TreeRetrievalOptions.DEPTH_ALL);

      MailFolder mailInbox = mailService.getFolderByName(
      MailServiceConstants.FOLDERNAME_INBOX, null, options);
      List inboxEntries = mailInbox.getEntries();

      for (int i = 0; i < inboxEntries.size(); i++) {
         MailFolderEntry mailEntry = (MailFolderEntry) inboxEntries.get(i);
         if (null != mailEntry && mailEntry.isMessage()) {
            mailMsgList.add((MailMessage) mailEntry);
         }
      } 
      return (MailMessage[]) mailMsgList.toArray(new MailMessage[mailMsgList.size()]);
   }
…
…

これにより、ログインしているユーザーのメールボックスのInbox内にあるすべてのメールデータを取得することができます。APIの詳細な使用方法については、Workplace SDKに同梱されているJavaDoc(<WCSAPI_HOME>\wcsapi\javadoc)などを参照してください。

追加したメソッドを、ネットワークを介して呼び出すことができるようにするためには、プロモートと呼ばれる作業を行う必要があります。RADのアウトライン・ビュー上で追加したメソッド(例: getMailMessages())を選択し、右クリック・メニューから「エンタープライズBean」 -> 「リモート・インターフェースへのプロモート」を選択します(図11)。


図11.リモート・インターフェースへのプロモート
図11.リモート・インターフェースへのプロモート

これにより、EJBのインターフェイスへメソッドを追加といった作業が自動的に行われ、メソッドの横に「R」というマークが追加されます(図12)。今回のサンプルではリモート・インターフェースしか使用しませんが、必要に応じて「ローカル・インターフェースにプロモート」も行ってください。


図12.リモート・インターフェースにプロモートされたメソッド
図12.リモート・インターフェースにプロモートされたメソッド

また、サーバー上でEJBへのリモート・アクセスを可能にするためには、スタブおよびスケルトンの生成をおこなわなければなりません。EJBプロジェクト内の「デプロイメント記述子」を選択し、右クリック・メニューから「デプロイ」を選択してください(図13)。


図13.EJBのデプロイ
図13.EJBのデプロイ

これにより、「ejbModule」フォルダ内にデプロイメント・コードが自動生成され、EJBとして利用できる状態になります(図14)。以上でサービス層の実装は終了です。


図14.生成されたデプロイメント・コード
図14.生成されたデプロイメント・コード

EJBと通信するDelegateにメソッドを追加

EJBのメソッドをポートレットから呼び出す際には、UIとサービスの仲介役となるDelegateをワークスペース層に用意する方法が一般的です(Business Delegateパターン)。Collaborative Component WizardはこのDelegateも自動的に生成してくれているため、開発者が行う必要があるのは、新規に追加したEJBのメソッドを呼び出す部分をDelegate側にも用意することだけです。

ウィザードによって生成された動的Webプロジェクト(例: WCSSampleAppPortlet)内にはDelegateに相当するクラス(例: WCSSampleAppDelegate.java)が用意されており、このクラスのコンストラクター内にはJNDIを使ったEJBの検索やSession Beanの取得を行うコードが自動生成されています(図15)。取得されるSession Bean(このサンプルではmServiceBean)を介することで、先ほど追加したEJBのメソッドを呼び出すことができます。


図15.自動生成されるDelegateのコンストラクター
図15.自動生成されるDelegateのコンストラクター

このDelegateクラスに、ユーザー層とサービス層の仲介役を果たす以下のようなメソッドを追加します。このサンプルにおいては、(1)の部分でEJBに追加されたメソッドを呼び出しています。

   public MailMessage[] getMailMessage() {
      MailMessage[] mailMsgs = new MailMessage[0];

      if (null != mServiceBean) {
         try {
            mailMsgs = mServiceBean.getMailMessage();  ------------------ (1)
         } catch (WorkplaceException we) {
            we.printStackTrace();
         } catch (RemoteException re) {
            re.printStackTrace();
         }
      }
      return mailMsgs;
   }

以上でワークスペース層の実装は終了です。

Delegateを介してデータを取得し、表示するためのコードをJSPに追加

Delegateに追加されたメソッドを介してサービス層からデータを取得し、表示するために、JSPファイルを編集します。ウィザードによって生成されるJSPファイルには<jsp:useBean>タグによってDelegateのクラスにアクセスする方法がすでに提供されています(図16)。これにより、スクリプトレットを用いれば、<% <BEAN_ID>.getMailMessage(); %>といった形でDelegateのメソッドを利用することができます。


図16.JSP内からDelegateのクラスにアクセスするための定義
図16.JSP内からDelegateのクラスにアクセスするための定義

しかし、スクリプトレットを用いると、さまざまな複雑な処理を行うことができるという利点がある一方で、JSPの中にJavaのコードが埋め込まれることから、見通しが悪い、ViewとModelの分離ができない、デバッグがしづらくなるなどといった問題も指摘されており、可能な限りスクリプトレットを使用すべきでないというのが近年の傾向です。そこで今回のサンプルでは、JavaServer Pages Standard Tag Library(JSTL)を利用し、タグのみでデータの取得と表示を行う方法を用いることにします。JSTLの詳細についてはこちらのサイトなどを参照してください。

まず、JSP標準タグ・ライブラリーを利用可能にする必要があります。動的Webプロジェクト(例: WCSSampleAppPortlet)のプロパティーを開き、「Webプロジェクト・フィーチャー」を選択します。使用可能なWebプロジェクト・フィーチャーから「JSP標準タグ・ライブラリー」にチェックを入れて保存してください(図17)。


図17 JSP標準タグ・ライブラリーを使用可能にする設定
図17 JSP標準タグ・ライブラリーを使用可能にする設定

JSTLが使用可能になったので、JSPファイルを開き、以下のようなコードを追加します。このサンプルでは(1)の部分でDelegateに追加したメソッドを呼び出しcom.ibm.workplace.api.mail.data.MailMessageの配列を取得しています。<c:forEach>はループ処理を行うためのタグで、items属性に与えられた配列、コレクションなどのオブジェクトの集合から順番にオブジェクトを取り出し、var属性で与えられた変数に代入していきます。(2)、(3)および(4)の部分では、取り出されたオブジェクト(MailMessage)のメソッドを呼び出し、値を取得して<c:out>タグで出力しています。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
…
…
<table width='100%' border='1'>
<tr style='font-weight:bold;'>
<td width='10%'>Sender</td>
<td width='10%'>SentDate</td>
<td>Subject</td>
</tr>
<c:forEach var='mailMessage' items='${WCSSampleAppDelegate.mailMessage}'> ------ (1)
<tr>
<td width='10%'><c:out value=’${mailMessage.sender}’/></td>               ------ (2)
<td width='10%'><c:out value=’${mailMessage.sentDate}’/></td>             ------ (3) 
<td><c:out value=’${mailMessage.subject}’/></td>                          ------ (4)
</tr>
</c:forEach>
</table>

以上でユーザー層の実装は終了です。




上に戻る


Workplaceアプリケーションの動作確認

作成したサンプルアプリケーションをサーバーにデプロイし動作確認を行います。

デプロイ

作成したWorkplaceアプリケーションをEARファイル(サービス層とリソース層)およびWARファイル(ユーザー層とワークスペース層)としてエクスポートし、サーバーにデプロイします。各手順の詳細についてはユーザーズ・ガイド(<WCSAPI_HOME>\doc\ wcsapi26_ug.pdf)第5章「SDK Sample Code」内の「Installing the generated EAR file on the server」および「Installing the generated portlet WAR file on the server」を参照してください。

新規アプリケーションテンプレートの作成

デプロイしたWorkplaceアプリケーションを配置するためのテンプレートを、Workplaceビルダーを用いて新規に作成します。Workplaceアプリケーションとテンプレートの関係性についてはこちらの解説を参照してください。

まず、WCSに管理ユーザーでログインし、「テンプレート」メニューをクリックし、Workplaceビルダーを開きます(図18)。


図18.WCSのWelcomeページ
図18.WCSのWelcomeページ

「アプリケーションテンプレートライブラリ」ページで「新規」をクリックしてください(図19)。


図19.アプリケーション・テンプレート・ライブラリー
図19.アプリケーション・テンプレート・ライブラリー

任意のテンプレート名を入力し、カテゴリーとして「Workplace アプリケーション」、開始点として「空のテンプレート」を選択し、「OK」をクリックしてください(図20)。


図20.新規アプリケーションテンプレートのプロパティー入力
図20.新規アプリケーションテンプレートのプロパティー入力

「ページとレイアウト」画面を開き、「ページ2」をクリックしてください(図21)。


図21.ページとレイアウト画面
図21.ページとレイアウト画面

「ポートレットの追加」ボタンをクリックしてください(図22)。


図22.ポートレットの追加画面
図22.ポートレットの追加画面

デプロイしたポートレット(例: WCSSampleAppPortlet)を検索し、選択して「OK」をクリックします(図23)。


図23.追加するポートレットの検索
図23.追加するポートレットの検索

正常に追加されたことを確認し、「終了」をクリックしてください(図24)。


図24.ポートレットの追加完了
図24.ポートレットの追加完了

「保存して閉じる」をクリックしてテンプレートを保存してください(図25)。以上でテンプレートの作成は完了です。


図25.テンプレートの保存
図25.テンプレートの保存

テンプレートからアプリケーションを生成

先ほど作成したテンプレートを元にアプリケーションを作成します。「マイワーク」に戻り、「Team Collaboration」 -> 「アプリケーション」を開いて「新規」ボタンをクリックしてください(図26)。


図26.アプリケーションのリスト画面
図26.アプリケーションのリスト画面

任意のアプリケーション名を入力し、テンプレートとして先ほど作成したものを選択して「OK」をクリックしてください(図27)。


図27.新規アプリケーションの作成画面
図27.新規アプリケーションの作成画面

アプリケーションが正常に作成されリストに追加されたことを確認し、そのアプリケーションを開いてください(図28)。


図28.アプリケーションの作成完了
図28.アプリケーションの作成完了

「ページ2」を開くと、デプロイしたWorkplaceアプリケーションを利用することができます。問題がなければ、ログインしているユーザーのメールボックスからメール一覧を取得し、送信者と送信日時、サブジェクトが表示されます(図29)。


図29.メールの情報を表示するサンプル・アプリケーションの例
図29.メールの情報を表示するサンプル・アプリケーションの例



上に戻る


まとめ

本稿ではWCSおよびWSE上で動作するPortalベースのWorkplaceアプリケーションを、Collaborative Component Wizardを用い、効率的に開発する方法について具体的な例を示しながら説明してきました。Collaborative Component Wizardを用いれば、理想的なアーキテクチャーを持つWorkplaceアプリケーションの開発を素早く開始することができるので、新規に開発を行う際にはこのツールを利用することをお薦めします。Workplace SDKにはこのツールを使って作成したアプリケーションのサンプルもいくつか含まれていますので、そちらも併せて参考にしてみてください。



参考文献



著者について

林田 憲昌 は YSLのWPLC 開発部門に所属するソフトウェア・エンジニアで、現在は主にLotus Notes の開発に取り組んでいます。仕事でリッチクライアントばかりやっていると、Web が恋しくなって、ついつい Greasemonkey でネタをプロトしてしまう近頃です。




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



はいいいえわからない
 


 


54321
大変素晴らしい不充分・不完全である
 


上に戻る


    日本IBMについて プライバシー お問い合わせ