この記事ではテンプレートを紹介し、その詳しい動作について解説します。さらに、ツールのビルド方法も紹介して、テンプレートの操作をお手伝いします(このツールの完全なコードは、Sandboxからダウンロードできます)。このシリーズのパート2では、テンプレートの最良実例および使用可能な他のツールについて紹介します。この記事のシリーズは、Notes/Dominoテンプレートを使い始めたばかりのビギナーに対しても有用ですが、Notes/Dominoのプログラミングについてある程度理解されていることを前提としています。また、テンプレートの最新機能に関するLDD
Todayの解説記事「Enhancements to Notes/Domino 6.0.1 and 6.0.2」をお読みになることをお勧めします。
継承は、設計要素レベルでも設定することができます。この設定によって、データベースをさらに厳密に制御できます。ほとんどのデータベースの設計要素では、データベースの設計プロパティで定義されたテンプレート名を無効にできます。Domino
Designerで設計要素を右クリックすることにより、これらの設定を確認し、変更することができます。[Design
Document(設計文書)]ダイアログ・ボックスに表示される設定は、設計要素のタイプによって変わります。たとえば、データベース・アイコンの設計要素で禁止できるのは、設計の更新、置換、または変更のみです。他の設計要素には、エージェント設計要素の[Run
Agent as Web user(Webユーザーとしてエージェントを実行する)]など、固有の機能が備わっています。さらに、NotesクライアントまたはWebブラウザーのどちらでも、個々の設計要素を選んで実行時に非表示にすることができます。これは、両クライアント上で稼動するNotesアプリケーションを構築する開発者に非常によく利用されている機能です。[Design
Document]ダイアログ・ボックス上にある最後のテンプレート関連機能は、[Prohibit(禁止)]および[Propagate(伝搬)]設定です。これらの設定によって、テンプレートの更新または置換によって設計要素が更新されるのを防げます。[Propagate
this prohibition of design change(設計変更の禁止を伝搬する)]設定をオンにすると、設計要素はテンプレートからこの設定を継承します。
このダイアログ・ボックスは、ある外部テンプレートからこの設計要素(この場合はフレームセット)のみへの固有の継承を示しています。この設計タイプは、Release
4では存在しなかったため、[Do not show this design element in menus of
Notes R4 or later clients(この設計要素をNotes R4以降のクライアントのメニューに表示しない)]設定は不要であり、表示されません。
Release 5では、[Agent(エージェント)]ダイアログ・ボックスに[Run Agent
as Web User]設定が追加されています。
しかしNotes/Domino 6では、この[Run Agent as Web User]オプションは[Agent
Properties(エージェント・プロパティ)]ボックスの一部として構成されています。
次の[Design Document]ダイアログ・ボックスは、グローバル・データベース要素に固有のものです。これらの要素には、[Using
Database(データベースの使用方法)]ドキュメント、[About this Database(このデータベースについて)]ドキュメント、およびデータベース・スクリプトがあります。
同様にIcon(アイコン)設計要素にも、固有の[Design Document]ダイアログ・ボックスがあります。Icon設計要素には、アイコン情報だけでなく、[Inherit
from name(名前から継承)]プロパティや[database launch(データベースの起動)]プロパティなど、データベースに関するさまざまな情報が格納されています。NotesPeekのようなツールを使用すると、この追加情報が表示できます。
単一データベースでは、複数のテンプレートから継承することもできます。たとえば、[Design(設計)]タブを選択し、[Inherit
from the design template(設計テンプレートから継承する)]フィールドに、そこから設計要素を継承したいテンプレート名を入力します。すると、データベースを更新するたびに、指定したテンプレートから自動的にこれらの設計要素が継承されます。
ここが、最初からトラブルを起こす可能性のある個所です。新しくアプリケーションを作成した場合、[Inherit
design from master template(マスター・テンプレートの設計を継承する)]設定を必ず確認してください。カスタム・アプリケーションの作成にテンプレートを使用する場合、設計プロパティの[Inherit
design from master template]の名前をすぐに変更してください(ほとんどのサーバーは、設計タスクを毎日実行して設計を更新します)。カスタム・データベースを作成したら、そのデータベースをテンプレートとして使用して、別のアプリケーションを作成できます。
04/28/2003 1:01:06 AM Warning:
Cannot locate design note 'servers.gif' in 'DOLS Resource Template' template
テンプレートがサーバー上にある場合、このエラーは心配の種になりかねません。しかしこのメッセージは、特に一部のシステム・データベースによって、非エラー状態時にも表示される場合があります。一致するテンプレートが発見されると、設計要素は名前で比較され、更新する必要があるかどうか確認されます。テンプレートに別のバージョンがある場合、[Prohibit
design refresh or replace to modify(設計を更新または置換して修正するのを禁止する)]設定がオンにされていない限り、設計要素は追加、更新、またはデータベースから削除されます。これらの変更の処理中、サーバー・ログには次のようなメッセージが表示されます。
04/28/2003 1:01:46 AM Updating 'DOLS Configuration Settings' into database
'Extended Mail (R6)' from template 'DOLS Resource Template'
04/28/2003 1:01:46 AM Updating 'DOLS Download Control' into database 'Extended
Mail (R6)' from template 'DOLS Resource Template'
04/28/2003 1:01:46 AM Updating 'DOLS Download Instructions' into database
'Extended Mail (R6)' from template 'DOLS Resource Template'
04/28/2003 1:01:46 AM Updating 'DOLS Load Download Page' into database
'Extended Mail (R6)' from template 'DOLS Resource Template'
04/28/2003 1:01:46 AM Updating 'DOLS Offline Configuration' into database
'Extended Mail (R6)' from template 'DOLS Resource Template'
04/28/2003 1:01:46 AM Updating 'DOLS Request Offline ID' into database
'Extended Mail (R6)' from template 'DOLS Resource Template
更新プロセスを開始する前に重複したテンプレート名を見つけ出すことは、もちろん有用です。これを実行するには、サード・パーティーのツールを使用することもできますし、ユーザー自身がコードを作成することもできます。次の例は、重複テンプレート名を検索するツールのコードを示したものです(このコードは、Sandboxからダウンロードできます)。
最初に、空のテンプレートを使用して、search.nsfという名前の新規データベースを作成します。次に、Domino
Designerでこのデータベースに新規エージェントを作成し、Search(検索)という名前を付けます。Searchエージェントのランタイム・タイプを「Action
List Selected(アクション・リスト選択時)」と設定し、Searchエージェントが[Actions(アクション)]メニューに表示されるようにします。次に、[Formula(式)]タイプ・リストから「LotusScript」を選択します。Searchエージェントの[Declarations(宣言)]オブジェクトに、次のコードを入力します。
Dim WhatServer As String
Dim dbd As NotesDbDirectory
Dim tmpDb As NotesDatabase
Dim Tdb As NotesDatabase
Dim SelectDBtype As String
Dim CountDb As Long
Dim view As NotesView
Dim ServerError As String
Dim currentdb As NotesDatabase
Dim item1 As NotesItem
Dim item2 As NotesItem
Dim doc As NotesDocument
Dim DefaultValue As String
Dim CheckTemplateValue As String
Dim AllOK As String
Dim NotesDatabase As NotesDatabase
Dim ServerPath As String
Dim dbtype As Variant
Dim DisplayServer As String
Sub Initialize (This line is shown for reference only)
Dim profSession As New NotesSession
Dim session As New NotesSession
askagain:
WhatServer$ = Inputbox$("Enter Server name - 'exit' -to end program
- enter nothing for Local")
' Leave blank for Local
If WhatServer$ = "exit" Then
Exit Sub
End If
If WhatServer$ = "" Then
DisplayServer$ = "Local"
Else
DisplayServer$ = WhatServer$
End If
AllOK$ = Lcase(Inputbox$("You have selected ---- "
& DisplayServer$ & " -- Is this Correct? Yes/No"))
If AllOK$ = "yes" Then
' All Done
Else
Goto askagain
End If
NextStuff:
' The next two lines will get a handle on the Notes data directory
Set dbd = New NotesDbDirectory( WhatServer$)
' Use as a generic counter - how many DBs are processed.
CountDb = 1
DBorTemplate:
' The next lines are used to determine if you want to process
templates or databases.
SelectDbtype$ = Lcase(Inputbox$("Select Database or Template"))
If SelectDbtype$ = "database" Then
dbType = DATABASE
Set tmpDb = dbd.GetFirstDatabase( dbtype)
Elseif SelectDbtype$ = "template" Then
dbType = TEMPLATE
Set tmpDb = dbd.GetFirstDatabase( dbtype)
Else
Goto DborTemplate
End If
' Here's the meat of the code. This gets a handle on each
database in the Notes data directory and extracts the
template information.
Do While Not ( tmpDb Is Nothing )
Serverpath$ = tmpdb.FilePath
Call tmpDb.Open( WhatServer$,ServerPath$)
Serverpath$ = tmpdb.FilePath
Set notesDatabase = New NotesDatabase( WhatServer$, ServerPath$ )
' The next lines are optional, but useful for
troubleshooting your code:
If notesDatabase.IsOpen Then
Print( "Successfully opened " & notesDatabase .Title )
Else
Print( "Unable to open database" )
End If
Print Serverpath$
Set Tdb = session.CurrentDatabase
Set doc = tdb.CreateDocument
doc.Subject = "New Template Entry"
doc.form = "New Template Entry"
doc.ServerName = WhatServer$
doc.RepID=tmpDb.ReplicaID
doc.pathname = Serverpath$
doc.dbtype = SelectDbtype$
doc.templatename = tmpDB.DesignTemplateName
doc.ActualDBtitle = tmpDB.Title
CheckTemplateValue$ = tmpDB.DesignTemplateName
' These lines are used as part of the user interface
to show which settings are enabled for the inheritance:
If tmpDB.DesignTemplateName = "" Then
doc.x= ""
Else
doc.x= "x"
End If
doc.databaseisatemplate = tmpDB.TemplateName
If tmpDB.TemplateName= "" Then
doc.y= ""
Else
doc.y= "x"
End If
Call doc.Save( True, True )
Call tmpDb.Close
nextentry:
Set tmpDb = dbd.GetNextDatabase
' Finally, these optional lines are used for
troubleshooting and/or process counting:
フィールド名などの設計名を見つけ出すもう1つの方法は、Notes C APIです。前述のLotusScriptコードでは、データベースの設計名全体の概要を示しました。しかしこのコードでは、各設計要素は個別の継承名を持つことができるという事実が考慮に入れられていません。これらのテンプレートの参照は、全設計要素をスキャンし、[$Class]フィールドを調べることによってのみ取得できます。データベース内の全設計要素をスキャンすると、[$Class]フィールドには設計要素レベルの継承テンプレート名が含まれます。
[$Class]フィールドが存在しない場合、設計要素は外部ソースから明示的に継承しません。このアプリケーション・タイプのベースとして使用すべき適切なNotes
C APIアプリケーションは、notesapi\samples\dbdesign\des_collディレクトリーにあるdes_collサンプル・コードです。このサンプル・コードは、所定のデータベース内にある全設計要素のリストを印刷するもので、[$Class]フィールドの有無をチェックし、その値を印刷するように簡単に拡張できます。
著者について
David Byrdは、ジョージア州アトランタのIBM Software Services for Lotus (ISSL)のコンサルティングITアーキテクトです。Byrd氏は、Lotus製品および幅広いテクノロジー(C/C++
API開発から、アプリケーション・アーキテクチャー、セキュリティー・アーキテクチャー、企業レベルのメッセージングとディレクトリーに重きを置くメッセージング・アーキテクチャーまで)のほぼすべての領域において博学多識です。氏はLotus
NotesおよびDominoのために過去10年間働いてきており、Lotus、IBM、Redhat、Microsoft、およびNovellからの数多くの資格認定書を所持しています。Byrd氏の電子メール・アドレスは、david_byrd@us.ibm.comです。
Timothy Speedは、IBM Software Services for Lotus(ISSL)のインフラストラクチャーおよびセキュリティー・アーキテクトです。Speed氏は、ここ10年間はインターネットとメッセージング・セキュリティーに関わってきました。氏はさらに、長野オリンピックでのDominoインフラストラクチャー・チームに加わり、シドニー・オリンピックのLotus
Notesシステムを支援しました。Speed氏が有する資格認定書には、MCSEc、VCA(VeriSign
Certified Administrator)、Lotus Domino CLP Principal Administrator、およびLotus
Domino CLP Principal Developerなどがあります。氏は以下の書籍の共著者でもあります。『The
Internet Security Guidebook』(ISBN: 0122374711、2001年2月)、『The Personal
Internet Security Guidebook』(ISBN: 0126565619、2001年10月)、『Enterprise
Directory and Security Implementation Guide: Designing and Implementing
Directories in Your Organization』(ISBN: 0121604527)、および『Internet
Security: A Jumpstart for Systems Administrators and IT Managers』(ISBN:
1555582982)。Speed氏の電子メール・アドレスは、Tim Speed@us.ibm.comです。