WEB アプリケーション用に LOTUS DOMINO をプログラミングする


Java と LotusScript のマッピング

実装コードWeb サービスの実装コードは Web サービス自体のパブリッククラスに置かれます。


利用者が Web サービスの操作を呼び出すと、Lotus Domino はパラメータとして入力メッセージを渡し、対応するメソッド、関数、またはサブルーチンを呼び出します。メソッドまたは関数が正常に終了すると、Lotus Domino は操作の出力メッセージとして戻り値またはパラメータを使用します。

Java の宣言と初期化Java コードには、標準 Java パッケージには定義されていない障害データ型、XML Schema データ型、およびホルダークラスに対する次の import が含まれることがあります。


lotus.domino パッケージには、静的メソッド getCurrentSession が入ったクラス WebServiceBase があります。通常は、このメソッドを実装クラスのパラメータなしコンストラクタで使用して、Lotus Domino セッションを表すセッションオブジェクトを取得します。Lotus Domino Web サービスのランタイムエンジンは実装クラスのパラメータなし (デフォルト) コンストラクタを呼び出し、他のすべてのコンストラクタを無視します。デフォルトコンストラクタは明示的ではないことがありますが、明示的にする場合、public を宣言する必要があります。実装で使用する他のコンストラクタも存在することがあります。

Session.getAgentContext() は Web サービスのコンテキストを取得します。次の AgentContext プロパティは Web サービスに適用されます。getCurrentAgent() はカレント Web サービスを取得します。getCurrentDatabase() はカレントデータベースを取得します。getCurrentAgent() の場合、エージェントプロパティgetName()、getOwner()、getCommonOwner()、getOnBehalfOf()、getComment()、getHttpURL()、getNotesURL()、getParent()、および getLockHolders() がカレント Web サービスに反映されます。

System.out はサーバーコンソールおよびサーバーの log.nsf に出力します。

LotusScript のオプション、宣言、初期化(Options) には次の INCLUDE ステートメントが含まれることがあります。インクルードされるファイルでは、WSDL 文書のデータ型にマップするデータ型を定義します。


通常、(Declarations) には、NotesSession と NotesDatabase (カレントデータベース用) オブジェクトに対する Dim ステートメントが含まれます。

NotesSession オブジェクトの設定など、呼び出す操作の前に常に実行されるコードには実装クラスで Sub NEW を使用します。新しい NotesSession オブジェクトを作成すると、Lotus Domino セッションが取得されます。Sub NEW のシグネチャには引数がないことがあります。同じ制限は、Web サービスメソッドが受け取るか返すすべてのクラスの Sub NEW に適用されます (他のクラス内にあるクラスを含む)。

次の NotesSession プロパティは Web サービスに適用されます。CurrentAgent はカレント Web サービスを取得します。CurrentDatabase はカレントデータベースを取得します。CurrentAgent の場合、NotesAgent プロパティ Name、Owner、CommonOwner、OnBehalfOf、Comment、HttpURL、NotesURL、Parent、および LockHolders がカレント Web サービスに適用されます。

Messagebox はサーバーコンソールおよびサーバーの log.nsf に出力します。

lsxsd.lss ファイルでは、BOOLEAN_HOLDER、BOOLEANARRAY_HOLDER、BYTE_HOLDER、BYTEARRAY_HOLDER、DOUBLE_HOLDER、DOUBLEARRAY_HOLDER、INTEGER_HOLDER、INTEGERARRAY_HOLDER、LONG_HOLDER、LONGARRAY_HOLDER、NOTESDOMELEMENTNODE_HOLDER、NOTESDOMELEMENTNODEARRAY_HOLDER、SINGLE_HOLDER、SINGLEARRAY_HOLDER、STRING_HOLDER、STRINGARRAY_HOLDER、VARIANT_HOLDER、VARIANTARRAY_HOLDER の各クラスを定義します。これらのクラスは、出力および入出力パラメータに使用されます。これらのクラスには、取得と設定が可能なパブリック変数「Value」があります。また、lsxsd.lss では、XML Schema データ型のクラスとホルダークラスも定義します (XSD_BOOLEAN と XSD_BOOLEAN_HOLDER など)。後述の「データの説明」の XSD データ型を参照してください。

データの説明次の基本データ型は、WSDL 文書と対応する Java または LotusScript のコード間で一対一にマップします。特に示されていない限り、LotusScript XSD データ型は lsxsd.lss に定義されており、次の関数とサブルーチンを備えています。


LotusScript XSD クラス XSD_BASE64BINARY、XSD_DATE、XSD_DATETIME、XSD_HEXBINARY、および XSD_TIME はプロキシクラスです。他の XSD クラスと同様、これらのクラスには、取得と設定が可能なパブリック変数「Value」があります。しかし、「Value」変数は String 型ではありません。

XSD_BASE64BINARY と XSD_HEXBINARY クラスの情報は NotesStream 形式で渡されます。これらのクラスには、次の関数とサブルーチンがあります。


XSD_DATE、XSD_DATETIME、XSD_TIME の各クラスの情報は NotesDateTime 形式で渡されます。これらのクラスには、次の関数があります。
Lotus Domino 7.0 では、これらのクラスには次のサブルーチンがありました。
Lotus Domino 8.0 では、この元のメソッドは下位互換性を保つためにそのまま残されていますが、次のサブルーチンがこれらのクラスの新しいサブルーチンです。
この新しいサブルーチンでは、XSD タイムゾーンの情報が結果の XML 値に追加されます。署名が同じなので、ユーザーは、必要な場合、LSXSD.LSS の SetValueFromNotesDateTime の実装を書き直して、新しいメソッドを呼び出すことができます。

特に示されていない限り、データ型は双方向にマップされます (WSDL 文書とコード間)。
WSDLJavaLotusScript
xsd:any (要素)org.w3c.dom.Element NotesDomElementNode (バックエンドクラス)
xsd:anyTypejava.lang.ObjectXSD_ANYTYPE
Variant (WSDL へのみ)
xsd:anyURIlotus.domino.types.URIXSD_ANYURI
soapenc:base64byte[] (WSDL からのみ)ByteArray_Holder (WSDL からのみ)
soapenc:base64Binarybyte[] (WSDL からのみ)ByteArray_Holder (WSDL からのみ)
xsd:base64Binarybyte[]ByteArray_Holder
XSD_BASE64BINARY
soapenc:booleanjava.lang.Boolean (WSDL からのみ) XSD_BOOLEAN (WSDL からのみ)
xsd:booleanbooleanBoolean 型
java.lang.Boolean (WSDL へのみ) XSD_BOOLEAN (WSDL へのみ)
soapenc:bytejava.lang.Byte (WSDL からのみ) XSD_BYTE (WSDL からのみ)
xsd:bytebyteXSD_BYTE
java.lang.Byte (WSDL へのみ)
xsd:datejava.util.DateXSD_DATE
xsd:dateTimejava.util.CalendarXSD_DATETIME
soapenc:decimaljava.math.BigDecimal (WSDL からのみ) XSD_DECIMAL (WSDL からのみ)
xsd:decimaljava.math.BigDecimalXSD_DECIMAL
soapenc:doublejava.lang.Double (WSDL からのみ) XSD_DOUBLE (WSDL からのみ)
xsd:doubledoubleDouble 型
java.lang.Double (WSDL へのみ)XSD_DOUBLE (WSDL へのみ)
xsd:durationlotus.domino.types.DurationXSD_DURATION
xsd:ENTITYlotus.domino.types.EntityXSD_ENTITY
xsd:ENTITESlotus.domino.types.EntitiesXSD_ENTITIES
soapenc:floatjava.lang.Float (WSDL からのみ) XSD_FLOAT (WSDL からのみ)
xsd:floatfloatSingle
java.lang.Float (WSDL へのみ)XSD_FLOAT (WSDL へのみ)
xsd:gDaylotus.domino.types.GDayXSD_GDAY
xsd:gMonthlotus.domino.types.GMonthXSD_GMONTH
xsd:gMonthDaylotus.domino.types.GMonthDayXSD_GMONTHDAY
xsd:gYearlotus.domino.types.GYearXSD_GYEAR
xsd:gYearMonthlotus.domino.types.GYearMonthXSD_GYEARMONTH
xsd:hexBinarylotus.domino.types.HexBinaryXSD_HEXBINARY
xsd:IDlotus.domino.types.IdXSD_ID
xsd:IDREFlotus.domino.types.IDRefXSD_IDREF
xsd:IDREFSlotus.domino.types.IDRefsXSD_IDREFS
soapenc:intjava.lang.Integer (WSDL からのみ) XSD_INT (WSDL からのみ)
xsd:intintLong 型
java.lang.Integer (WSDL へのみ)XSD_INT (WSDL へのみ)
soapenc:integerjava.math.BigInteger (WSDL からのみ) XSD_INTEGER (WSDL からのみ)
xsd:integerjava.math.BigIntegerXSD_INTEGER
xsd:languagelotus.domino.types.LanguageXSD_LANGUAGE
soapenc:longjava.lang.Long (WSDL からのみ) XSD_LONG (WSDL からのみ)
xsd:longlongXSD_LONG
java.lang.Long (WSDL へのみ)
xsd:Namelotus.domino.types.NameXSD_NAME
xsd:NCNamelotus.domino.types.NCNameXSD_NCNAME
xsd:negativeIntegerlotus.domino.types.NegativeIntegerXSD_NEGATIVEINTEGER
xsd:NMTOKENlotus.domino.types.NMTokenXSD_NMTOKEN
xsd:NMTOKENSlotus.domino.types.NMTokensXSD_NMTOKENS
xsd:nonNegativeIntegerlotus.domino.types.NonNegativeIntegerXSD_NONNEGATIVEINTEGER
xsd:nonPositiveIntegerlotus.domino.types.NonPositiveIntegerXSD_NONPOSITIVEINTEGER
xsd:NOTATIONlotus.domino.types.NotationXSD_NOTATION
xsd:normalizedStringlotus.domino.types.NormalizedStringXSD_NORMALIZEDSTRING
xsd:positiveIntegerlotus.domino.types.PositiveIntegerXSD_POSITIVEINTEGER
xsd:QNamejavax.xml.namespace.QNameXSD_QNAME
soapenc:shortjava.lang.Short (WSDL からのみ) XSD_SHORT (WSDL からのみ)
xsd:shortshortInteger
java.lang.Short (WSDL へのみ)XSD_SHORT (WSDL へのみ)
soapenc:stringjava.lang.String (WSDL からのみ) String (WSDL からのみ)
xsd:stringjava.lang.StringString 型
XSD_STRING (WSDL へのみ)
xsd:timelotus.domino.types.TimeXSD_TIME
xsd:tokenlotus.domino.types.TokenXSD_TOKEN
xsd:unsignedBytelotus.domino.types.UnsignedByteByte
XSD_UNSIGNEDBYTE (WSDL へのみ)
xsd:unsignedIntlotus.domino.types.UnsignedIntXSD_UNSIGNEDINT
xsd:unsignedLonglotus.domino.types.UnsignedLongXSD_UNSIGNEDLONG
xsd:unsignedShortlotus.domino.types.UnsignedShortXSD_UNSIGNEDSHORT

配列
Lotus Domino 7 の場合:

配列は WSDL で次の属性とサブ要素を持つ XML Schema <complexType> エンティティ要素にマップされます。


たとえば、int 型 (Java) または Long 型 (LotusScript) の配列は次の WSDL を生成します。
配列は WSDL の個々の <element> エンティティにマップされることもあります。その場合、1 より大きい値を持つ maxOccurs 属性が存在します。この 2 番目の配列表現形式は外部定義された任意の WSDL 文書に現れることがありますが、Designer で生成された WSDL では、Java Web サービスに対して、インデックス付きアクセサを持つ Java 値型の配列メンバーに対してのみ使用されます。

Lotus Domino 8 の場合:

配列は、主にエンコードされたサービスの場合、つまり「RPC/エンコード」の SOAP メッセージ形式の Web サービスの場合は、上記で説明されている「soapenc:Array」パターンにマップされます。

「リテラル」サービス (つまり、RPC/リテラル、Doc/リテラル、またはラップの SOAP メッセージ形式) の場合は、配列は「リテラル」配列 (「maxOccurs」属性の値が「unbounded」で、単一の <element> を持つ <complexType>) にマップされます。次はその例です。

<wsdl:types>
<schema targetNamespace="urn:DefaultNamespace"
xmlns="http://www.w3.org/2001/XMLSchema">

<complexType name="xsd_intArray">
<element name="item" minOccurs="0" maxOccurs="unbounded" type="xsd:int"/>
</complexType>

</schema>
</wsdl:types>

また、ここで示す「リテラル」形式は、インデックス付きメンバーアクセサを持つ Java Web サービス値型配列の WSDL でも生成されます。

初期化されていない配列
Lotus Domino 8.0 では、SOAP 要求 (Web サービスプロバイダの場合) または SOAP 応答 (Web サービスコンシューマの場合) 内の空の配列は、非直列化され次の配列になります。


Java の場合は、これは Lotus Domino 7.x の場合と同じ動作ですが、LotusScript の場合は、(可能な場合はいつでも単一要素の配列を返す) Lotus Domino 7.x とは異なります。空の配列を受け取る可能性のある Lotus Domino 8.0 のスクリプトは、動的配列の内容を検索するときには、LotusScript エラー 200 を処理するように実装する必要があります。

クラス
通常、Web サービス操作との間で渡すクラス (値型とも呼ばれます) は、WSDL で各公開データメンバーを表すサブ要素を持つ XML Schema <complexType> 要素にマップされます。たとえば、


LotusScript の場合、公開クラスのデータメンバーはパブリックと宣言されたメンバーです。

Java の場合、公開クラスのデータメンバーはパブリックであるメンバー、または Java Bean の特性である public get および set メソッドを持つメンバーです。認識可能な Java 値型クラスには、デフォルトのパブリックコンストラクタ (引数なし) が必要です。

列挙
列挙は、WSDL で次の特性を持つ XML Schema <simpleType> 要素にマップされます。

たとえば、String 型のメンバーが入った野菜の列挙は次のような WSDL を生成します。
列挙の LotusScript と Java 実装には、次の項目から構成される特定のパターンが反映されます。 WSDL 生成で列挙を検出し、正しく表すためには、実装にすべての識別特性 (では太字) が存在している必要があります。

メモ Java 列挙パターンでは、Java Bean set: メソッドを使用できません。このメソッドは 1 つのパラメータを持つ setValue メソッドであり、パラメータの型は getValue メソッドの戻り値の型に一致します。

障害
障害では、呼び出し元にエラー状態を伝達します。任意の Web サービスメソッドから発信できます。障害は WSDL コントラクトに明示的であったり (WSDL 文書でサービス操作に指定)、WSDL コントラクトに暗黙的であったりします (サービスメソッドのシグネチャの一部として実装のみ)。

明示的障害は、<wsdl:input> および <wsdl:output> 要素と共に、操作に指定される省略可能な <wsdl:fault> 要素として WSDL に表されます。たとえば、

<wsdl:operation name="getStockQuote">
<wsdl:input message="getStockQuoteRequest"/>
<wsdl:output message="getStockQuoteResponse"/>
<wsdl:fault name="InvalidSymbolFault" message="InvalidSymbolFaultMessage"/>
</wsdl:operation>

操作の <wsdl:input> または <wsdl:output> 要素と同様、<wsdl:fault> 要素は message 属性によって型が設定されます。

したがって、WSDL 障害は関連メッセージの「パート」型により、LotusScript または Java の実装のクラスにマップされます。このクラスは、WS_FAULT (LotusScript) または lotus.domino.types.Fault (Java) のサブクラスです。

実装の値型 (前述の「クラス」を参照) が関連する WSDL 構成体 (通常は WSDL <complexType>) にマップされるのと同様に、この実装の障害サブクラスは WSDL 障害の関連メッセージに定義されたデータメンバーにマップされます。

たとえば、次の WSDL complexType があるとします (ここでは、上の例の「InvalidSymbolFaultMessage」の型として指定)。


この complexType は次のように LotusScript にマップされます。
Java には次のようにマップされます。

public class InvalidSymbolFaultMessage extends lotus.domino.types.Fault {
private java.lang.String tickerSymbol;
private int applicationCode;

public InvalidSymbolFaultMessage() {
}
public InvalidSymbolFaultMessage(java.lang.String tickerSymbol, int applicationCode) {
this.tickerSymbol = tickerSymbol;
this.applicationCode = applicationCode;
}
public java.lang.String getTickerSymbol() {
return this.tickerSymbol;
}
public int getApplicationCode() {
return this.applicationCode;
}
// helper methods?
}

Web サービスの操作が呼び出し元にサービス固有の追加データを送信する必要がない場合、明示的な WSDL 障害は必要なく、暗黙的障害で十分です。

暗黙的障害は常に使用でき、Web サービスフレームワークによってさまざまな呼び出しエラーに対して発行されます。しかし、実装 PortType クラスに公開されたサービスメソッドによって発行されることもあります。

また、実装メソッド署名への暗黙的障害の追加または削除は、Web サービスコントラクトの変更とは扱われないため、それ自体では Web サービスの保存時に WSDL は再生成されません。

サービスメソッドの障害処理は明示的および暗黙的障害のどちらに対しても同様に行われます。ですべての識別特性は太字になっています。

リスト
XML Schema の list 型は <simpleType> の形式の 1 つであり、その値はスペースで区切られた 1 つのリストとして表されます。たとえば、次のような野菜があるとします (各トークンはスペース文字で区切られています)。


これは、次の list 型のインスタンスの有効な値です。
リストの値は配列として実装に利用されるため、LotusScript と Java では配列のような実装にマップされます。で WSDL 生成の識別特性は太字にされています。

ネームスペース
XML Schema では、ネームスペース修飾子を使用して、名前が似ているが定義が異なる構成体 (特にデータ型) を区別します。次に例を示します。


ここで、「telephone」データ型は MyAddressBook ネームスペースの一部として指定されています。

Lotus Domino Java Web サービスの実装ではマップされたネームスペースを Java パッケージとして表します。したがって、上記の「telephone」データ型は次の Java パッケージとクラスにマップされます。


LotusScript Web サービス実装にはこのように使用するパッケージ構成体がありません。また、LotusScript 識別子の有効な長さは Java に比べて制限されています。したがって、WSDL XML Schema ネームスペースは、ネームスペース定数と LotusScript クラス名に追加された短い接尾辞として、またはデフォルトネームスペースに適用される 1 つの「DefaultNamespace」定数としてマップされます。

たとえば、上記の「telephone」データ型は次のように WSDL から LotusScript にインポートされます。

Const n1 = "MyAddressBook" 'string constant value can be many characters long
Class Telephone_
n1
_
End Class

また、次のように「DefaultNamespace」定数を使用して指定することもできます。

Const DefaultNamespace = "MyAddressBook"
Class Telephone 'no suffix specified
_

End Class

未サポート構成体
このリリースでは、次の WSDL または XML Schema 構成体で、LotusScript または Java へのマッピングは制限されているかサポートされていません。また、Designer の「WSDL のインポート」機能では拒否 (指定した場合は無視) されます。

同様に、次の LotusScript と Java 構成体では WSDL XML Schema へのマッピングがサポートされていません。また、Web サービス操作の引数または戻り値の型として公開されたとき、Designer の「WSDL のエクスポート」、「WSDL の表示」、および「機能の保存」で拒否されます。