

AWS Mainframe Modernization Service (マネージドランタイム環境エクスペリエンス) は、新規のお客様に公開されなくなりました。 AWS Mainframe Modernization Service (マネージドランタイム環境エクスペリエンス) と同様の機能については、 AWS Mainframe Modernization Service (セルフマネージドエクスペリエンス) をご覧ください。既存のお客様は、通常どおりサービスを引き続き使用できます。詳細については、[AWS 「 Mainframe Modernization の可用性の変更](https://docs.aws.amazon.com/m2/latest/userguide/mainframe-modernization-availability-change.html)」を参照してください。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Transform AWS for Mainframe のデータシンプリファイアとは
<a name="ba-shared-data"></a>

メインフレームシステムおよびミッドレンジシステム (以下のトピックでは「レガシー」システムと呼びます) では、COBOL、PL/I、RPG などのプログラミング言語が使用され、メモリへの低レベルアクセスが可能になります。このアクセスは、ゾーン型、パック型、英数字などのネイティブ型からアクセスされるメモリレイアウトに重点が置かれており、グループや配列を通じて集約されることもあります。

1 つのプログラムには、型付きフィールドによる特定のメモリへのアクセスと、バイト (raw メモリ) への直接アクセスの両方が混在しています。例えば、COBOL プログラムでは、引数を連続したバイトセット (LINKAGE) として呼び出し元に渡すか、同じ方法でファイルからのデータの読み取り/書き込み (レコード) を行い、コピーブックにまとめられた型付きフィールドを使ってメモリ範囲を解釈します。

メモリへの raw アクセスと構造化アクセスの組み合わせ、正確なバイトレベルのメモリレイアウトへの依存、ゾーン型やパック型などのレガシータイプなどの機能は、そのまま Java プログラミング環境で簡単に利用することはできません。

レガシープログラムを Java にモダナイズするための AWS Transform for mainframe ソリューションの一部として、**Data Simplifier** ライブラリはモダナイズされた Java プログラムにこのようなコンストラクトを提供し、Java 開発者 (getters/setters、byte arrays、class-based) にできるだけ精通した方法で公開します。それは、このようなプログラムから生成されたモダナイズされた Java コードの主要な依存関係です。

わかりやすくするため以下の説明のほとんどは COBOL コンストラクトに基づいていますが、ほとんどの概念は似ているため、PL1 と RPG のデータレイアウトのモダナイズには同じ API を使用できます。

**Topics**
+ [メインクラス](#ba-shared-data-main-classes)
+ [データバインディングとアクセス](#ba-shared-data-binding-access)
+ [説明した Java タイプの FQN](#ba-shared-data-fqn)

## メインクラス
<a name="ba-shared-data-main-classes"></a>

このドキュメントでは、読みやすくするために、メインフレーム API インターフェイスとクラスの AWS 変換の Java 短縮名を使用します。詳細については、「[説明した Java タイプの FQN](#ba-shared-data-fqn)」を参照してください。

### 低レベルメモリ表現
<a name="ba-shared-data-main-classes-memory"></a>

 最も低いレベルでは、メモリ (高速でランダムにアクセス可能な連続したバイト範囲) が `Record` インターフェイスによって表現されます。このインターフェイスは基本的に固定サイズのバイト配列を抽出したものです。そのため、基になるバイトにアクセスしたり変更したりできるセッターやゲッターが用意されています。

### 構造化されたデータ表現
<a name="ba-shared-data-main-classes-structured"></a>

COBOL DATA DIVISION にある「01 データ項目」や「01 コピーブック」などの構造化データを表すには、`RecordEntity` クラスのサブクラスが使用されます。これらは通常、手動で記述されるのではなく、対応するレガシーコンストラクトのメインフレームモダナイゼーションツールの AWS 変換によって生成されます。その主な構造と API を知っておくと、モダナイズされたプログラムのコードでどのように使われているかを理解できるようになるため、今でも役に立ちます。COBOL の場合、コードは PROCEDURE DIVISION から生成される Java です。

生成コードは `RecordEntity` サブクラスを持つ各「01 データ項目」で表現されます。それを構成する各基本フィールドまたは集合は、ツリーとして編成されたプライベート Java フィールドとして表現されます (ルート以外の各項目には親があります)。

説明のために、COBOL データ項目の例を次に示します。次に、メインフレーム生成コードの対応する AWS 変換をモダナイズします。

```
01 TST2.
 02 FILLER PIC X(4).
 02 F1     PIC 9(2) VALUE 42.
 02 FILLER PIC X.
 02        PIC 9(3) VALUE 123.
 02 F2     PIC X VALUE 'A'.
```

```
public class Tst2 extends RecordEntity {

	   private final Group root = new Group(getData()).named("TST2"); 
	   private final Filler filler = new Filler(root,new AlphanumericType(4));
	   private final Elementary f1 = new Elementary(root,new ZonedType(2, 0, false),new BigDecimal("42")).named("F1");
	   private final Filler filler1 = new Filler(root,new AlphanumericType(1));
	   private final Filler filler2 = new Filler(root,new ZonedType(3, 0, false),new BigDecimal("123"));
	   private final Elementary f2 = new Elementary(root,new AlphanumericType(1),"A").named("F2");
	

	   /**
	    * Instantiate a new Tst2 with a default record.
   	 * @param configuration the configuration
   	 */
	   public Tst2(Configuration configuration) {
		      super(configuration);
		      setupRoot(root);
	   }
	   /**
	    * Instantiate a new Tst2 bound to the provided record.
	    * @param configuration the configuration
	    * @param record the existing record to bind
	    */
	   public Tst2(Configuration configuration, RecordAdaptable record) {
		      super(configuration);
		      setupRoot(root, record);
	   }

	   /**
	    * Gets the reference for attribute f1.
	    * @return the f1 attribute reference
	    */
	   public ElementaryRangeReference getF1Reference() {
		      return f1.getReference();
	   }

	   /* *
	    * Getter for f1 attribute.
	    * @return f1 attribute
	    */
	   public int getF1() {
		      return f1.getValue();
	   }

	   /**
	    * Setter for f1 attribute.
	    * @param f1 the new value of f1
	    */
   	public void setF1(int f1) {
		      this.f1.setValue(f1);
	   }
	   /**
	    * Gets the reference for attribute f2.
	    * @return the f2 attribute reference
	    */
	   public ElementaryRangeReference getF2Reference() {
		      return f2.getReference();
	   }

	   /**
	    * Getter for f2 attribute.
	    * @return f2 attribute
	    */
	   public String getF2() {
		      return f2.getValue();
	   }

	   /**
	    * Setter for f2 attribute.
	    * @param f2 the new value of f2
	    */
	   public void setF2(String f2) {
		      this.f2.setValue(f2);
	   }
}
```

#### 基本フィールド
<a name="ba-shared-data-main-classes-structured-elementary"></a>

クラスのフィールド `Elementary` (名前が付けられていない場合は `Filler`) はレガシーデータ構造の「リーフ」を表します。これらは基礎となるバイトの連続したスパン (「範囲」) に関連付けられており、通常、それらのバイトの解釈と変更の方法 (バイト配列に対して値を「デコード」および「エンコード」する) を表す型 (パラメータ化されている場合もあります) があります。

すべての基本型は `RangeType` のサブクラスです。一般的なタイプは次のとおりです。


| COBOL タイプ | Data Simplifier タイプ | 
| --- | --- | 
|  `PIC X(n)`  |  `AlphanumericType`  | 
|  `PIC 9(n)`  |  `ZonedType`  | 
|  `PIC 9(n) COMP-3`  |  `PackedType`  | 
|  `PIC 9(n) COMP-5`  |  `BinaryType`  | 

#### 集計フィールド
<a name="ba-shared-data-main-classes-structured-aggregate"></a>

集計フィールドは、その内容 (他の集計フィールドまたは基本フィールド) のメモリレイアウトを整理します。それら自体には基本型はありません。

`Group` フィールドはメモリ内の連続フィールドを表します。含まれている各フィールドはメモリ内で同じ順序で配置され、メモリ内のグループフィールド位置を基準にした最初のフィールドのオフセットは `0` で、2 番目のフィールドのオフセットは `0 + (size in bytes of first field)` という具合です。それらは同じ格納フィールドの下にある COBOL フィールドのシーケンスを表すために使用されます。

`Union` フィールドは、同じメモリにアクセスする複数のフィールドを表します。格納されている各フィールドは、メモリ内のユニオンフィールド位置を基準にしたオフセットが `0` で配置されます。例えば、それらは COBOL の「REDEFINES」コンストラクト (最初のユニオンの子は再定義されたデータ項目、2 番目の子は最初の再定義など) を表すために使用されます。

配列フィールド (`Repetition` のサブクラス) は、メモリ内の子フィールド (集計自体であれ基本項目であれ) のレイアウトの繰り返しを表します。このような子レイアウトが指定された数だけメモリ内に配列され、それぞれのオフセットは `index * (size in bytes of child)` になります。これらは COBOL の「OCCURS」コンストラクトを表すために使われます。

#### プリミティブ型
<a name="ba-shared-data-main-classes-structured-primitive"></a>

一部のモダナイズでは、独立した「ルート」データ項目を表示するために「プリミティブ型」を使用する場合もあります。これらは `RecordEntity` の使用法と非常に似ていますが、そこから継承されたものではなく、生成コードに基づくものでもありません。代わりに、メインフレームランタイムの AWS 変換によって`Primitive`インターフェイスのサブクラスとして直接提供されます。このような提供クラスの例には、`Alphanumeric` または `ZonedDecimal` があります。

## データバインディングとアクセス
<a name="ba-shared-data-binding-access"></a>

構造化データと基礎データを関連付ける方法は複数あります。

そのための重要なインターフェイスは `RecordAdaptable` で、これは `RecordAdaptable` の基礎データに「書き込み可能なビュー」を提供する `Record` を取得するために使用されます。以下の説明では、複数のクラスが `RecordAdaptable` を実装しています。逆に、メインフレーム APIs の AWS 変換と低レベルメモリ (プログラムの引数、ファイル I/O レコード、CICS 通信領域、割り当てられたメモリなど) を操作するコードでは、多くの場合、そのメモリへのハンドル`RecordAdaptable`として が想定されます。

COBOL のモダナイズの場合、ほとんどのデータ項目はメモリと関連付けられ、対応するプログラム実行の存続期間中は固定されます。この目的のために、`RecordEntity` サブクラスは生成された親オブジェクト (プログラムコンテキスト) で一度インスタンス化され、`RecordEntity` バイトサイズに基づいて、基礎となる `Record` のインスタンス化を行います。

COBOL では、LINKAGE 要素をプログラム引数に関連付けたり、SET ADDRESS OF コンストラクトをモダナイズしたりする場合などに、`RecordEntity` インスタンスを提供された `RecordAdaptable` に関連付ける必要があります。そのため、次の 2 つのメカニズムがあります。
+ `RecordEntity` インスタンスが既に存在する場合は、(`Bindable` から継承した) `RecordEntity.bind(RecordAdaptable)` メソッドを使用して、このインスタンスにこの `RecordAdaptable` を「ポイント」させることができます。次に、`RecordEntity` で呼び出されるゲッターやセッターは、基になる `RecordAdaptable` バイトによってバックアップ (バイト読み取りまたは書き込み) されます。
+ `RecordEntity` をインスタンス化する場合は、`RecordAdaptable` を受け付ける生成コンストラクタを使用できます。

逆に、現在構造化データにバインドされている `Record` にもアクセスできます。このため、`RecordEntity` は `RecordAdaptable` を実装し、`getRecord()` そのようなすべてのインスタンスから呼び出すことができます。

最後に、COBOL や CICS の動詞の多くは、読み取りまたは書き込みのために単一フィールドにアクセスする必要があります。`RangeReference` クラスはそのようなアクセスを表すために使用されます。そのインスタンスは、`RecordEntity` が生成した `getXXXReference()` メソッド (`XXX` はアクセスされたフィールド) から取得して、ランタイムメソッドに渡すことができます。`RangeReference` は通常は `RecordEntity` または `Group` 全体へのアクセスに使用され、サブクラス `ElementaryRangeReference` は `Elementary` フィールドへのアクセスを表します。

上記のほとんどの観測値は`Primitive`サブクラスに適用されます。これは、メインフレームランタイムの AWS 変換 (生成されたコードではなく) で提供される`RecordEntity`場合と同様の動作の実装に取り組んでいるためです。この目的のために、`Primitive` のすべてのサブクラスは `RecordEntity` サブクラスおよび基本フィールドの両方の代わりに使用できるように `RecordAdaptable`、`ElementaryRangeReference`、`Bindable` インターフェイスを実装しています。

## 説明した Java タイプの FQN
<a name="ba-shared-data-fqn"></a>

次の表は、このセクションで説明した Java タイプの完全修飾名を示しています。


| 短い名前 | 完全修飾名 | 
| --- | --- | 
|  `Alphanumeric`  |  `com.netfective.bluage.gapwalk.datasimplifier.elementary.Alphanumeric`  | 
|  `AlphanumericType`  |  `com.netfective.bluage.gapwalk.datasimplifier.metadata.type.AlphanumericType`  | 
|  `BinaryType`  |  `com.netfective.bluage.gapwalk.datasimplifier.metadata.type.BinaryType`  | 
|  `Bindable`  |  `com.netfective.bluage.gapwalk.datasimplifier.data.Bindable`  | 
|  `Elementary`  |  `com.netfective.bluage.gapwalk.datasimplifier.data.structure.Elementary`  | 
|  `ElementaryRangeReference`  |  `com.netfective.bluage.gapwalk.datasimplifier.entity.ElementaryRangeReference`  | 
|  `Filler`  |  `com.netfective.bluage.gapwalk.datasimplifier.data.structure.Filler`  | 
|  `Group`  |  `com.netfective.bluage.gapwalk.datasimplifier.data.structure.Group`  | 
|  `PackedType`  |  `com.netfective.bluage.gapwalk.datasimplifier.metadata.type.PackedType`  | 
|  `Primitive`  |  `com.netfective.bluage.gapwalk.datasimplifier.elementary.Primitive`  | 
|  `RangeReference`  |  `com.netfective.bluage.gapwalk.datasimplifier.entity.RangeReference`  | 
|  `RangeType`  |  `com.netfective.bluage.gapwalk.datasimplifier.metadata.type.RangeType`  | 
|  `Record`  |  `com.netfective.bluage.gapwalk.datasimplifier.data.Record`  | 
|  `RecordAdaptable`  |  `com.netfective.bluage.gapwalk.datasimplifier.data.RecordAdaptable`  | 
|  `RecordEntity`  |  `com.netfective.bluage.gapwalk.datasimplifier.entity.RecordEntity`  | 
|  `Repetition`  |  `com.netfective.bluage.gapwalk.datasimplifier.data.structure.Repetition`  | 
|  `Union`  |  `com.netfective.bluage.gapwalk.datasimplifier.data.structure.Union`  | 
|  `ZonedDecimal`  |  `com.netfective.bluage.gapwalk.datasimplifier.elementary.ZonedDecimal`  | 
|  `ZonedType`  |  `com.netfective.bluage.gapwalk.datasimplifier.metadata.type.ZonedType`  | 