287.5. RFC のメッセージボディー

リクエストおよびレスポンスオブジェクト

SAP エンドポイントは、SAP リクエストオブジェクトを含むメッセージボディーを含むメッセージを受信することを想定しており、SAP レスポンスオブジェクトを含むメッセージボディーを含むメッセージを返します。SAP のリクエストとレスポンスは、各フィールドが事前定義されたデータ型を持つ名前付きフィールドを含む固定マップデータ構造です。

SAP リクエストとレスポンスの名前付きフィールドは、SAP エンドポイントに固有であり、各エンドポイントが受け入れる SAP リクエストとレスポンスのパラメーターを定義することに注意してください。SAP エンドポイントは、それに固有のリクエストとレスポンスオブジェクトを作成するファクトリーメソッドを提供します。

public class SAPEndpoint ... {
    ...
    public Structure getRequest() throws Exception;

    public Structure getResponse() throws Exception;
    ...
}

構造物オブジェクト

SAP 要求オブジェクトと応答オブジェクトは両方とも、org.fusesource.camel.component.sap.model.rfc.Structure インターフェイスをサポートする構造オブジェクトとして Java で表されます。このインターフェイスは、java.util.Map インターフェイスと org.eclipse.emf.ecore.EObject インターフェイスの両方を拡張します。

public interface Structure extends org.eclipse.emf.ecore.EObject,
                                        java.util.Map<String, Object> {

    <T> T get(Object key, Class<T> type);

}

構造体オブジェクトのフィールド値には、マップインターフェイスのフィールドの getter メソッドを介してアクセスします。さらに、構造体インターフェイスは、フィールド値を取得するための型制限されたメソッドを提供します。

構造オブジェクトは、Eclipse モデリングフレームワーク (EMF) を使用してコンポーネントランタイムに実装され、そのフレームワークの EObject インターフェイスをサポートします。構造オブジェクトのインスタンスには、それが提供するフィールドのマップの構造と内容を定義および制限するメタデータが添付されています。このメタデータには、EMF が提供する標準的な方法を使用してアクセスし、イントロスペクションすることができます。詳細については、EMF のドキュメントを参照してください。

注記

構造体オブジェクトで定義されていないパラメーターを取得しようとすると、null が返されます。構造体で定義されていないパラメーターを設定しようとすると、例外が出力され、パラメーターの値を正しくない型で設定しようとします。

次のセクションで説明するように、構造体オブジェクトには、複合フィールド型 STRUCTURE および TABLE の値を含むフィールドを含めることができます。これらの型のインスタンスを作成して構造体に追加する必要はないことに注意してください。これらのフィールド値のインスタンスは、必要に応じて、囲んでいる構造にアクセスするときにオンデマンドで作成されます。

フィールドの種類

SAP リクエストまたはレスポンスの構造オブジェクト内に存在するフィールドは、基本 または 複合 のいずれかです。基本フィールドには単一のスカラー値が含まれますが、複合フィールドには基本タイプまたは複合タイプのフィールドが 1 つ以上含まれます。

基本フィールドの種類

基本フィールドは、文字、数値、16 進数、または文字列フィールドタイプのいずれかです。次の表は、構造体オブジェクトに存在する可能性のある基本フィールドのタイプをまとめたものです。

フィールドタイプ

対応 Java 型

Byte Length

Unicode バイト長

小数

説明

CHAR

java.lang.String

1 から 65535

1 から 65535

-

ABAP タイプ 'C': 固定サイズの文字列。

DATE

java.util.Date

8

16

-

ABAP タイプ 'D': 日付 (形式: YYYYMMDD)。

BCD

java.math.BigDecimal

1 から 16

1 から 16

0 から 14

ABAP タイプ 'P': パックされた BCD 番号。BCD 番号には、1 バイトあたり 2 桁が含まれます。

TIME

java.util.Date

6

12

-

ABAP タイプ 'T': 時間 (形式: HHMMSS)。

BYTE

byte[]

1 から 65535

1 から 65535

-

ABAP タイプ 'X': 固定サイズのバイト配列。

NUM

java.lang.String

1 から 65535

1 から 65535

-

ABAP タイプ 'N': 固定サイズの数値文字列。

FLOAT

java.lang.Double

8

8

0 から 15

ABAP タイプ 'F': 浮動小数点数。

INT

java.lang.Integer

4

4

-

ABAP タイプ 'I': 4 バイト整数。

INT2

java.lang.Integer

2

2

-

ABAP タイプ 'S': 2 バイト整数。

INT1

java.lang.Integer

1

1

-

ABAP タイプ 'B': 1 バイト整数。

DECF16

java.match.BigDecimal

8

8

16

ABAP タイプ 'decfloat16': 8 バイトの 10 進浮動小数点数。

DECF34

java.math.BigDecimal

16

16

34

ABAP タイプ 'decfloat34': 16 バイトの 10 進浮動小数点数。

STRING

java.lang.String

8

8

-

ABAP タイプ 'G': 可変長文字列。

XSTRING

byte[]

8

8

-

ABAP タイプ 'Y': 可変長バイト配列。

文字フィールドの種類

文字フィールドには、基礎となる JCo および ABAP ランタイムで非 Unicode または Unicode 文字エンコーディングを使用できる固定サイズの文字列が含まれます。非 Unicode 文字列は、1 バイトあたり 1 文字をエンコードします。Unicode 文字列は、UTF-16 エンコーディングを使用して 2 バイトでエンコードされます。文字フィールドの値は、Java では java.lang.String オブジェクトとして表され、基礎となる JCo ランタイムが ABAP 表現への変換を担当します。

文字フィールドは、関連する byteLength および unicodeByteLength プロパティーでそのフィールド長を宣言します。これらのプロパティーは、各エンコーディングシステムでのフィールドの文字列の長さを決定します。

CHAR
CHAR 文字項目は、英数字を含むテキスト項目であり、ABAP タイプ C に対応します。
NUM
NUM 文字フィールドは、数字のみを含む数値テキストフィールドであり、ABAP タイプ N に対応します。
DATE
DATE 文字フィールドは、年、月、日が YYYYMMDD としてフォーマットされた 8 文字の日付フィールドであり、ABAP タイプ D に対応します。
TIME
TIME 文字フィールドは、時、分、および秒が HHMMSS としてフォーマットされた 6 文字の時間フィールドであり、ABAP タイプ T に対応します。

数値フィールドの種類

数値フィールドには数値が含まれています。次の数値フィールドタイプがサポートされています。

INT
INT 数値フィールドは、基礎となる JCo および ABAP ランタイムで 4 バイトの整数値として格納される整数フィールドであり、ABAP タイプ I に対応します。INT フィールド値は、Java では java.lang.Integer オブジェクトとして表されます。
INT2
INT2 数値フィールドは、基礎となる JCo および ABAP ランタイムに 2 バイトの整数値として格納される整数フィールドであり、ABAP タイプ S に対応します。INT2 フィールド値は、Java では java.lang.Integer オブジェクトとして表されます。
INT1
INT1 フィールドは、基になる JCo および ABAP ランタイム値に 1 バイトの整数値として格納される整数フィールドであり、ABAP タイプ B に対応します。INT1 フィールド値は、Java では java.lang.Integer オブジェクトとして表されます。
FLOAT
FLOAT フィールドは、基礎となる JCo および ABAP ランタイムに 8 バイトの double 値として格納される 2 進浮動小数点数フィールドであり、ABAP タイプ F に対応します。FLOAT フィールドは、フィールドの値が関連する小数プロパティー。FLOAT フィールドの場合、この 10 進プロパティーは 1 ~ 15 桁の値を持つことができます。FLOAT フィールド値は、Java では java.lang.Double オブジェクトとして表されます。
BCD
BCD フィールドは、基礎となる JCo および ABAP ランタイムで 1 から 16 バイトのパック数として保管される 2 進化 10 進フィールドであり、ABAP タイプ P に対応します。パック数は、1 バイトあたり 2 桁の 10 進数を保管します。BCD フィールドは、関連する byteLength および unicodeByteLength プロパティーでフィールド長を宣言します。BCD フィールドの場合、これらのプロパティーは 1 ~ 16 バイトの値を持つことができ、両方のプロパティーが同じ値になります。BCD フィールドは、関連付けられた decimal プロパティーで、フィールドの値に含まれる 10 進数の桁数を宣言します。BCD フィールドの場合、この 10 進プロパティーは 1 ~ 14 桁の値を持つことができます。BCD フィールド値は、Java では java.math.BigDecimal として表されます。
DECF16
DECF16 フィールドは、基礎となる JCo および ABAP ランタイムで 8 バイトの IEEE 754 decimal64 浮動小数点値として格納される 10 進浮動小数点であり、ABAP タイプ decfloat16 に対応します。DECF16 フィールドの値は、10 進数で 16 桁です。DECF16 フィールドの値は、Java では java.math.BigDecimal として表されます。
DECF34
DECF34 フィールドは、基礎となる JCo および ABAP ランタイムで 16 バイトの IEEE 754 decimal128 浮動小数点値として格納される 10 進浮動小数点であり、ABAP タイプ decfloat34 に対応します。DECF34 フィールドの値には、34 桁の 10 進数があります。DECF34 フィールドの値は、Java では java.math.BigDecimal として表されます。

16 進フィールドタイプ

16 進数フィールドには生のバイナリーデータが含まれます。次の 16 進数フィールドタイプがサポートされています。

BYTE
BYTE フィールドは、基礎となる JCo および ABAP ランタイムにバイト配列として格納される固定サイズのバイト文字列であり、ABAP タイプ X に対応します。BYTE フィールドは、関連する byteLength および unicodeByteLength プロパティーでフィールド長を宣言します。BYTE フィールドの場合、これらのプロパティーは 1 ~ 65535 バイトの値を持つことができ、両方のプロパティーが同じ値になります。BYTE フィールドの値は、Java では byte オブジェクトとして表されます。

文字列フィールドの種類

文字列フィールドは、可変長の文字列値を参照します。その文字列値の長さは実行時まで固定されません。文字列値のストレージは、基礎となる JCo および ABAP ランタイムで動的に作成されます。文字列フィールド自体のストレージは固定されており、文字列ヘッダーのみが含まれています。

STRING
STRING フィールドは文字列を参照し、基礎となる JCo および ABAP ランタイムに 8 バイト値として格納されます。ABAP タイプ G に対応します。STRING 項目の値は、Java では java.lang.String オブジェクトとして表されます。
XSTRING
XSTRING フィールドはバイト文字列を参照し、基礎となる JCo および ABAP ランタイムに 8 バイト値として格納されます。ABAP タイプ Y に対応します。STRING 項目の値は、Java では byte オブジェクトとして表されます。

複雑なフィールドタイプ

複合フィールドは、構造体またはテーブルフィールドタイプのいずれかです。次の表は、これらの複雑なフィールドタイプをまとめたものです。

フィールドタイプ

対応 Java 型

Byte Length

Unicode バイト長

小数

説明

STRUCTURE

org.fusesource.camel.component.sap.model.rfc.Structure

個々のフィールドのバイト長の合計

個々のフィールドの Unicode バイト長の合計

-

ABAP タイプ 'u' & 'v': 異種構造

TABLE

org.fusesource.camel.component.sap.model.rfc.Table

行構造体のバイト長

行構造体の Unicode バイト長

-

ABAP タイプ 'h': テーブル

構造体フィールドタイプ

STRUCTURE 項目には構造オブジェクトが含まれ、基礎となる JCo および ABAP ランタイムに ABAP 構造レコードとして格納されます。ABAP タイプ u または v のいずれかに対応します。STRUCTURE 項目の値は、Java ではインターフェイス org.fusesource.camel.component.sap.model.rfc.Structure を持つ構造オブジェクトとして表されます。

テーブルフィールドタイプ

TABLE フィールドにはテーブルオブジェクトが含まれ、基礎となる JCo および ABAP ランタイムに ABAP 内部テーブルとして格納されます。ABAP タイプ h に対応します。フィールドの値は、インタフェース org.fusesource.camel.component.sap.model.rfc.Table を持つテーブルオブジェクトによって Java で表されます。

テーブルオブジェクト

テーブルオブジェクトは、同じ構造を持つ構造オブジェクトの行を含む同種のリストデータ構造です。このインターフェイスは、java.util.List インターフェイスと org.eclipse.emf.ecore.EObject インターフェイスの両方を拡張します。

public interface Table<S extends Structure>
    extends org.eclipse.emf.ecore.EObject,
    java.util.List<S> {

    /**
     * Creates and adds table row at end of row list
     */
    S add();

    /**
     * Creates and adds table row at index in row list
     */
    S add(int index);

}

テーブルオブジェクト内の行のリストは、リストインターフェイスで定義された標準メソッドを使用してアクセスおよび管理されます。さらに、テーブルインターフェイスは、構造体オブジェクトを作成して行リストに追加するための 2 つのファクトリーメソッドを提供します。

テーブルオブジェクトは、Eclipse Modeling Framework (EMF) を使用してコンポーネントランタイムに実装され、そのフレームワークの EObject インターフェイスをサポートします。テーブルオブジェクトのインスタンスには、それが提供する行の構造と内容を定義および制限するメタデータが添付されています。このメタデータには、EMF が提供する標準的な方法を使用してアクセスし、イントロスペクションすることができます。詳細については、EMF のドキュメントを参照してください。

注記

間違った型の行構造値を追加または設定しようとすると、例外が出力されます。