本文へジャンプ

Lotus  >  Lotus Developer Domain  >  
   
 

Notes/DominoデータにアクセスするためのカスタムDXLフレームワーク

 
   
 
コンテンツ
はじめに
DXL フレームワーク
ビューと文書の DXL 形式
カスタム DXL エージェント
まとめ
リソース
ダウンロード
筆者について(原文のまま)

Raj Balasubramanian,
Consulting IT Architect, Lotus
レベル:中級
原文の掲載:2005年5月3日
更新日:2005年10月14日更新
原文はこちら(US)


はじめに

Domino XML (DXL) を使用すると、Lotus Notes/Domino 6.x の Notes 文書を他のアプリケーションから作成、表示、更新することができます。また、LotusScript エージェントによって、Notes 文書を DXL で表示したり、DXL から文書を作成または更新することができます。
Domino XML (DXL) は、Notes\xmlschemas ディレクトリーにある Domino DTD を使用して Domino の設計要素を XML 形式で表したものです。(Lotus Notes/Domino 7 にも XML スキーマ文書が含まれる予定です。)DXL は、Domino アプリケーションのデータを他のプラットフォームに提供するための優れた手法です。たとえば、DXL を用いることにより、Domino データと設計要素を XML 形式でエクスポートしたり、インポートすることができます。もともと、DXL は Lotus Domino 5 で導入され、最近のリリースでは、Lotus Domino の中心となるコンポーネントの 1 つになっています。(DXL の基本的な内容については、developerWorks の Lotus 記事『Lotus Domino と IBM WebSphere の統合ソリューション: Domino XML』を参照してください。)

この記事では、Domino データを表示、作成、更新するために Lotus Domino 6.5.x で作成された DXL フレームワークの主要コンポーネントについて解説します。このフレームワークは、Notes 文書の表示、更新、作成を行う 3 つの LotusScript エージェントを含む Domino データベースによって構成されています。この記事は、Lotus Domino および XML の経験がある、熟練したアプリケーション開発者の方を対象として書かれています。

(編集者注: 記事に記述されているサンプル・エージェントは、現在USサイトで公開されておりません。)


上に戻る

DXL フレームワーク

この記事で説明するカスタム DXL フレームワークは、任意のクライアントからの Notes オブジェクトへのアクセスを単純化します。さまざまなプログラミング・プラットフォームから Domino オブジェクトにアクセスするには、何通りもの方法があります。しかし、どのアクセス手法も、特定の状況に基づいた固有の方法を提供するにすぎません。たとえば、カスタム Java アプリケーションによって使用される DIIOP アクセスは、HTTP トラフィックだけが許可される一般的なファイアウォールを通り抜けることはできません。このため、アプリケーションによらない方法で文書を読み書きするレディメードの方法は存在しません。XML が優れた選択であると言えるのは、このような理由があるからです。特殊な要件 (たとえば、ファイアウォール) をともなう Microsoft .Net クライアントまたはカスタム Java クライアントを構築する場合は、この DXL フレームワークが最適のソリューションとなるでしょう。

たとえば、DXL フレームワークを使用すると、ユーザーは次のことができます。

  • Notes ビューにある Notes 文書のリストを表示する
  • リストで文書を選択し、その Notes 文書の詳細を表示する
  • 選択した文書内のデータを更新する
  • 新しい Notes 文書を作成する

DXL フレームワークを構成する主要設計要素を図 1 に示します。


図 1. DXL フレームワーク

DXL フレームワーク


図 1 に示したように、DXL フレームワークは、次の 3 つの LotusScript エージェントを含む Domino データベース (database.nsf) によって構成されています。

  • [DXLUpdateDoc] は、DXL 形式の XML を受け取り、クライアントからの要求を処理します。この要求とは、文書 UNID によって指定された文書を更新することです。
  • [DXLCreateDoc] は、DXL 形式の XML を受け取り、クライアントからの要求を処理して新規文書を作成します。
  • [DXLViewDoc] は、文書 UNID で指定された文書の XML を返します。

これらのエージェントの内部動作については、後で説明します。また、Notes ビューのネイティブな機能でも、XML データを出力することができます。つまり、URL コマンドの「?ReadViewEntries」を使用すると、選択した Notes ビューに対して XML データを要求できます。

この記事では、DXL フレームワークのサーバーサイド・コンポーネントに注目します。(図 1 に示したサンプル・エージェントをダウンロードする場合は、この記事の最後にある「ダウンロード」セクションを参照してください。)


上に戻る

ビューと文書の DXL 形式

それでは、ビューと文書の DXL 形式がどのようにレイアウトされるかを見ていきましょう。ビューの DXL を図 2 に示します。


図 2. Notes ビューの DXL 形式

Notes ビューの DXL 形式

図 2 では、次のような表記になっています。

  • 青い円は要素を表します。
  • グレーの楕円は属性を表します。
  • 黄色の四角形は文字データを表します。
  • 緑の矢印は「いずれか 1 つを含む」ことを示します。
  • 黒の矢印は集約を示します。

図 2 からわかるように、viewentries は最上位の要素です。これは 1 つ以上の viewentry 要素を含みます。また、viewentry 要素は 1 つ以上の entrydata 要素を含みます。各 entrydata 要素は、text、number、datetime、または numberlist のいずれかの要素を持つことができます。

メモ:このセクションでは、ビューの内容を DXL 形式で表す DXL viewentries 要素について説明します。これを DXL の view 要素と混同しないでください。view 要素は、DXL 形式によるビューの実際の説明です。

XML 処理で使用される主な属性も、図に示されています。viewentries 要素では、toplevelentries を使用して、ビュー内のすべての文書の数を取得します。viewentry では、UNID を取得します (後で利用するために保管しておきます)。また、entrydata の columnnumber 属性を使用して、必要なフィールド値を検索します。

ビューの DXL コードの一部を以下に示します。

<?xml version="1.0" encoding="UTF-8"?>
<viewentries toplevelentries="26">
<viewentry position="1" unid="F0C7DF1BE84F48B685256F0800720716" noteid="1392" siblings="26">
<entrydata columnnumber="0" name="$18">
<number>0</number></entrydata>
<entrydata columnnumber="1" name="$17">
<text>Styles, Ron</text></entrydata>
<entrydata columnnumber="2" name="$12">
<text></text></entrydata>
<entrydata columnnumber="3" name="CompanyName">
<text></text></entrydata>
<entrydata columnnumber="4" name="$16">
<text>R Styles@ABC</text></entrydata>
<entrydata columnnumber="5" name="$21">
<text>NotesMail/HQ/ABC</text></entrydata>
</viewentry>
......
</viewentries>

Notes 文書の DXL (この例では、database.nsf 内のユーザー文書) を図 3 に示します。


図 3. Notes 文書の DXL 形式

Notes 文書の DXL 形式

この記事では、DXL Notes 文書について、図 3 で示した要素と属性について説明します。(この記事では noteinfo 要素と updatedby 要素は扱わないので、図から除外してあります。)図からもわかるように、document は最上位の要素で、1 つ以上の item 要素を含みます。同様に、各 item 要素は、text、number、datetime、numberlist、または textlist のいずれかの要素を持つことができます。item 要素の主要属性は name で、この属性を使用して、目的のフィールド値を調べることができます。

文書の DXL コードの一部を以下に示します。

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE document SYSTEM 'xmlschemas/domino_6_5_1.dtd'>
<document xmlns="http://www.lotus.com/dxl" version='6.5' maintenanceversion='1.0'
   replicaid='85256F080071E637' form='Person'>
<noteinfo >......</noteinfo>
<updatedby>......</updatedby>
<item name='Title'><text/></item>
......
<item name='Owner' authors='true' names='true' protected='true'><text>
   CN=Ron Styles/OU=HQ/O=ABC</text></item>
</document>

ビューを開く

これまでに、ビューと文書の DXL 形式について説明しました。次のステップとして、クライアントがサンプル・データベースの [すべての文書] ビューで文書のリストを表示するときに、内部ではどのようなイベントが発生しているのかを見ることにしましょう。手順は次のとおりです。

  1. ユーザーがカスタム・クライアント・アプリケーションを開き、ユーザー ID とパスワードを入力します。(または、構成ファイルによってこの情報を渡すこともできます。)
  2. クライアント・アプリケーションは、「?ReadViewEntries」というクエリー文字列を使用して、ターゲット・データベースのビューを要求する、Domino Server への HTTP 要求を作成します。この例では、サンプル・データベース内のすべての文書を表示するサンプルの [すべての文書] ビューが使用されます。
  3. Domino Server はユーザーを認証し、HTTP 応答として XML データをクライアントに送り返すことによって、要求を処理します。
  4. クライアント・アプリケーションは、サーバーから受け取った XML データを処理し、[すべての文書] ビューにある文書のリストを表示します。

このプロセスを図 4 に示します。


図 4. 文書の表示

文書の表示
文書を開く

クライアントが [すべての文書] ビューで Notes 文書を開くときは、次の手順が発生します。

  1. ユーザーは、前のセクションで説明したように、[すべての文書] ビューを開きます。
  2. ユーザーは、開きたい文書を選択します。
  3. クライアント・アプリケーションは選択されたデータベースの UNID を取得し、Domino Server のターゲット・データベースに対し、「/ViewDXLDoc?Open&unid=<doc UNID>」という URI を使用して HTTP 要求を送信します。
  4. Domino Server は、ユーザーを認証し、エージェント要求を処理することで、要求を処理します。そして、文書の DXL 形式を出力します (この UNID は送信された要求に含まれていたものです)。
  5. カスタム・クライアントは DXL 文書の XML データを受け取り、処理します。
  6. 選択された文書の詳細なビューがユーザーに表示されます。

このプロセスを図 5 に示します。

図 5. 文書を開く

文書を開く

文書の作成

ユーザーが新しい Notes 文書を作成するときは、次の手順が発生します。

  1. ユーザーはクライアント・アプリケーションを起動し、新規文書を作成するために適切なメニュー・オプションを選択します。
  2. アプリケーション内で、カスタム文書フォームがユーザーに提示されます。ユーザーはこのフォームに入力し、送信/保存します。
  3. アプリケーションはフォーム内のデータを抽出し、XML 形式 (DXL 文書形式に適合した形式) に変換し、DXLCreateDoc エージェントを起動します。これにより、DXL コンテンツが HTTP 要求に含められて、送信されます。
  4. Domino Server は、ユーザーを認証し、エージェント要求を処理します。
  5. DXL 文書内の XML データが DXLCreateDoc エージェントによって処理され、リターン・メッセージがクライアントに送り返されます。
  6. フォーム送信アクションの成功または失敗を示すメッセージが、ユーザーに表示されます。

これらの手順を図 6 に示します。


図 6. 文書の作成

文書の作成
上に戻る

カスタム DXL エージェント

このセクションでは、[DXLViewDoc]、[DXLUpdateDoc]、および [DXLCreateDoc] の各 LotusScript エージェントが内部的にどのように動作するのかを説明します。これらのエージェントは、DXL フレームワークにとってたいへん重要なコンポーネントです。各エージェントのコードの一部を取り上げ、どのような動作をしているのかを説明します。(各エージェントのコード全体をダウンロードするには、「ダウンロード」セクションを参照してください。)

[DXLViewDoc]

[DXLViewDoc] エージェントは、選択された文書の XML を返します。このエージェントは、標準変数を設定することから開始します。文書オブジェクトの取得には、セッションの文書コンテキスト・メソッド (DocumentContext メソッド) を使用します。HTTP 要求への応答は、標準の print ステートメントを用いて処理します。最初に、応答のコンテキストタイプを「text/xml」として初期化します。また、すべてのエラーを検出します。

	Sub Initialize
		Dim s As New notessession
		Dim db As notesdatabase
		Dim doc As notesdocument
		Dim doc1 As notesdocument
		Set doc1 = s.DocumentContext
		Print "Content-type: text/xml" 
		On Error Goto err1
		Set db = s.currentdatabase
		Dim stg As String

次に、要求 URL のクエリー文字列として渡された UNID を検索します。このとき、最小限のエラー・チェックを行います。

		stg = doc1.Query_String(0)
		If Len(stg) < 5 Then
			Goto err1
		End If
		If Instr(stg,"unid=") < 1 Then
			Goto err1
		Else
			stg =  Right(stg,Len(stg)-Instr(stg,"="))
		End If

有効な UNID を入手した後は、Notes 文書へのハンドルを取得し、XML の一部として DTD 要求が設定されていないことを確認した上で、NotesDXLExporter を使用してコンテンツを XML にエクスポートします。

		Set doc = db.GetDocumentByUnID(stg)
		Dim exporter As NotesDXLExporter
		Dim stream As notesstream
		Set exporter = s.CreateDXLExporter
		exporter.OutputDOCTYPE=False
		Set stream = s.CreateStream
		Call exporter.SetInput(doc)
		Call exporter.SetOutput(stream)
		Call exporter.Process

次に、ストリーム・オブジェクトからテキストを取得し、クライアントへ出力します。

		Print stream.ReadText()
	End
err1:
	Print "You reached in error"
	Resume
	
End Sub

[DXLUpdateDoc]

[DXLUpdateDoc] エージェントは、選択された文書を更新するクライアント要求を処理します。要求の Request_Content 属性を使用して、クライアントから送信された実際の XML のハンドルを取得し、それをストリーム・オブジェクトへのパイプとして設定します。

	Dim x As NotesItem
	Dim stream As NotesStream
	Set x =doc.GetFirstItem("Request_Content")
	...........
	.....
	Call stream.WriteText(x.Text)

次に、データベース・コンテキスト内でストリームを消費するために NotesDXLImporter のインスタンスを生成し、このインポートが更新である (そして、作成ではない) ことを指定します。

	Dim imp As NotesDXLImporter
	Set imp = session.CreateDXLImporter(stream, db)
	imp.DocumentImportOption=DXLIMPORTOPTION_UPDATE_ELSE_IGNORE
	imp.ReplicaRequiredForReplaceOrUpdate = False
	Call imp.Process

[DXLCreateDoc]

[DXLCreateDoc] エージェントは、新規文書を作成するクライアント要求を処理します。このエージェントは、[DXLUpdateDoc] エージェントとたいへんよく似ています。この 2 つのエージェントの主な違いは、データベース・コンテキスト内でのストリーム消費プロセスにおいて、インポートが更新または作成のどちらであるかという点です。このエージェントでは、作成タイプとして指定するため、新規文書を作成できます。

imp.DocumentImportOption=DXLIMPORTOPTION_CREATE
....


上に戻る

まとめ

この記事では、Lotus Notes/Domino 6 の DXL 機能を活用し、カスタム LotusScript エージェントを用いて既存の Notes 文書を表示および更新するフレームワークを作成する方法について解説しました。このフレームワークは、Notes オブジェクトへのアクセスを単純化するよう設計されています。HTML ではなく XML を使用することにより、XML の処理が可能なアプリケーションであれば、このフレームワークを容易に使用することができます。また、HTTP 上での転送を利用しているので、ファイアウォールとの相性が良い点も大きな特長です。

この記事の目的は、DXL フレームワークを使用して、Domino データへのアクセスと処理を行うアプリケーションの設計方法を解説することです。このフレームワークを使用することにより、Web (JSR168 ポートレット) とリッチクライアント (Eclipse RCP) の両方に対応するアプリケーションを作成できます。


上に戻る

ダウンロード

(編集者注: 記事に記述されているサンプル・エージェントは、現在USサイトで公開されておりません。)
説明 ファイル名 サイズ ダウンロード方法
サンプル・エージェントのコード agents.ZIP 1.52KB HTTP
ダウンロード方法について(US)

上に戻る

リソース


上に戻る

筆者について(原文のまま)

Raj Balasubramanian is a Consulting IT Architect for IBM Software Services for Lotus. He works on customer engagements delivering application and infrastructure related projects. His interests range from anything technical to history and physics. During his copious spare time, he enjoys talking about robots with his sons.
上に戻る