HCL Nomad で Java を動かす
モバイル端末、Web ブラウザ版の Notes クライアントである HCL Nomad Mobile / Web。
既に業務に取り入れ、その便利さを実感している人も増えてきています。
非常に有用なツールのHCL Nomad ですが、Java が利用された機能が利用できないという制限事項があります。私の note でも触れてきたように、Notes/Domino V14 では、Java が大幅にアップデートされており、HCL Nomad でも Java を利用したいところです。
そこで、今回は、HCL Nomad の制限事項をすり抜け、Java を利用したエージェントを HCL Nomad でも実行する方法をご紹介します。
クライアント実行がダメなら、サーバーで動かせばいい
結論から言うと、NotesAgent クラスの RunOnServer メソッドを利用して、目的のエージェントをサーバー側で実行させます。
サーバー側での実行となる為、既存エージェントをそのまま利用したり、すべての機能を実現できるとは限らないですが、Java を HCL Nomad で動かす為の有効的な手段です。
Java を含むエージェントの修正
対象エージェントに修正が必要か否かの判断は、そのエージェントをスケジュールエージェントとして実行した際、そのまま利用可能かどうかを基準に考えて頂ければと思います。
1.UIの操作を伴う処理
UIの操作が必要となる処理を含む場合は、サーバーでは処理できません。その為、UIの操作が必要な処理、Javaが必要な処理でエージェントを分割するなどの考慮が必要となります。
具体的には、NotesUIWorkspace クラスを利用していたり、確認メッセージの表示などです。これらが必要な場合は、 RunOnServer を実行する前に利用し、RunOnServerで実行されるエージェント(Java を含むエージェント)の中では利用しないようにします。
2.エージェントに情報を渡す
表示中の文書やビューの選択文書に対して処理をする場合は、その文書の NoteID を RunOnServer の引数として設定します。そして、RunOnServer で実行されるエージェントから、引数の NoteID をキーに、対象文書を取得します。その為、新規作成の文書の場合は、文書を保存する必要があります。
また、NotesUIWorkspace クラスの Prompt メソッドなど、処理中にユーザーが入力した値を Java の処理で利用したい場合は、ダミー文書を作成して、そこに入力した値を保存し、その文書の NoteID を RunOnServer の引数として指定することで Java の処理に連携することが可能です。
※ RunOnServer の引数に NoteID の代わりに文字列を設定して、利用することもできなくはないですが、推奨されていないようです。
3.実行場所に依存する処理
ファイルの I/O に関する処理、Environ 関数などで環境変数の情報を取得するなどの処理も考慮が必要です。ファイルを生成して保存する処理の場合、出力先に「C:¥Temp」を指定していた場合、通常のエージェント実行では、実行者のパソコンが対象となりますが、RruOnServer で実行した場合は、実行サーバーが出力先となります。
出力先が実行者のパソコンであれば、UIで出力先フォルダに移動し、出力ファイルを開くことも簡単ですが、実行サーバー上にファイルが出力された場合だと、それは容易ではありません。
その為、出力ファイルを Notes アプリケーションの文書に添付したり、出力ファイルをサーバー上に残さない為に、処理の完了時に削除するなどの考慮も必要となります。
4.セキュリティレベル
処理によっては、エージェントの「セキュリティ」タブにて、実行時のセキュリティレベルを変更する必要があります。この設定は、実際に動作を確認し、うまく動作しない場合に設定してみるとよいでしょう。
また、サーバー文書の「セキュリティ」タブの「制限付き LotusScript/Java エージェントの署名または実行」もエージェントの実行に影響がある為、うまく処理が動かない場合は、一度、設定を確認してみてください。
5.エージェントの実行者
エージェントを普通に実行すると、実行者はその操作を行ったユーザーとなりますが、RunOnServer で実行した場合は、エージェントの署名者となります。実行ユーザーの情報が RunOnServerで実行されるエージェント内で必要となるケースでは、RunOnServer の引数に指定する文書に事前に保存しておくなどの考慮が必要になるでしょう。
サンプルプログラム
今回は、前回ご紹介した QR コードの作成エージェントを例に説明を進めていきたいと思います。
前回はエージェント内で指定した固定文字列を QR コードに変換していましたが、より実践的な構成とする為、フォームで入力した値を QR コードに変換し、生成したQRコードのファイルも文書に添付させるようにします。
【フォームの構成】
QrText :テキスト(QR コードに変換する文字)
Body : リッチテキスト(生成したQRコードのファイルを添付)
「QR生成」ボタン :
@Command([FileSave]);
@Command([ToolsRunMacro]; "(agDo)");
「QR生成」ボタンで実行する「(agDo)」エージェント
このエージェントは、フォームの「QR生成」ボタンから実行します。
処理はシンプルで、「(QR_Server)」エージェントを RunOnServer メソッドを利用してサーバー実行します。その際、実行元の文書の NoteID を引数に設定しています。
Option Public
Option Declare
Sub Initialize
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim ns As New NotesSession
Dim ndb As NotesDatabase
Dim nd As NotesDocument
Dim ag As NotesAgent
Dim nId As String
Set ndb = ns.CurrentDatabase
Set uidoc = ws.Currentdocument
Set nd = uidoc.Document
nId = nd.NoteID
Set ag = ndb.GetAgent("(agQR_Server)")
Call ag.RunOnServer(nId)
End Sub
Java 機能を含む「(agQR_Server)」エージェント
実行時に指定された NoteID は、NotesAgent クラスのの ParameterDocID プロパティで取得することが可能です。その NoteID を利用して、実行元の文書を取得し、「QrText」フィールドで入力された値で QR コード(PNG ファイル)を作成します。(QR コードを生成する Java のプログラムは、前回の記事をご確認ください)
その後、生成された QR コードのファイルを「Body」フィールドに添付し、処理の最後にサーバー上から作成したファイルを削除しています。
※このエージェントは、「セキュリティ」タブにて、実行時のセキュリティレベルを「2.制限された操作を許可する」にします。
Option Public
Option Declare
UseLSX "*javacon"
Use "lbZXing"
Sub Initialize
Dim js As New JavaSession
Dim jc As JavaClass
Dim jo As JavaObject
Dim qrText As String 'QR文字列
Dim size As Integer 'サイズ(ピクセル)
Dim filePath As String 'ファイル保存先
Dim ns As New NotesSession
Dim ndb As NotesDatabase
Dim nd As NotesDocument
Dim nrti As NotesRichTextItem
Dim ag As NotesAgent
Dim nId As String
Set ndb = ns.CurrentDatabase
Set ag = ns.CurrentAgent
nId = ag.ParameterDocID
Set nd = ndb.GetDocumentById(nId)
qrText = nd.GetItemValue("QrText")(0)
size = 200
filePath = "C:\Temp\qr_code.png"
Set jc = js.GetClass("JavaZXing")
Set jo = jc.CreateObject
Call jo.createQrCode(qrText, size, filePath)
Call nd.RemoveItem("Body")
Set nrti = nd.CreateRichTextItem("Body")
Call nrti.Embedobject(EMBED_ATTACHMENT, "", filePath)
Call nd.Save(True, True, True)
Kill filePath
End Sub
※ 処理実行後、文書を開きなおすと QR コードが添付されています。