トランスフォーメーション > Javaトランスフォーメーション > Javaトランスフォーメーションの例
  

Javaトランスフォーメーションの例

ここで例として示されるJavaコードを使用すると、アクティブなJavaトランスフォーメーションの作成およびコンパイルを実行できます。
Javaトランスフォーメーションを使用して、架空の会社の従業員データを処理します。Javaトランスフォーメーションは、フラットファイルソースから入力行を読み込み、フラットファイルターゲットに出力行を書き込みます。ソースファイルには、従業員ID番号、名前、職位、管理職のID番号を含む従業員データが格納されています。
トランスフォーメーションは、指定された従業員の管理職の名前を管理職のID番号に基づいて検索し、従業員データを含む出力行を生成します。出力データには、従業員ID番号、名前、職位、従業員の管理職の名前が含まれています。ソースデータに従業員の管理職が存在しない場合は、トランスフォーメーションはその従業員が組織階層の最上位に位置している人物であると想定します。
注: トランスフォーメーションロジックは、従業員の職位がソースファイルで降順に配置されていると想定します。
この例のマッピングを作成して実行するには、次の手順を実行します。
  1. 1ソースファイルを作成します。
  2. Secure Agentがアクセスできるディレクトリにカンマ区切りのフラットファイルを作成します。
  3. 2マッピングを設定します。
  4. ソーストランスフォーメーション、ターゲットトランスフォーメーション、およびJavaトランスフォーメーションをマッピングに追加し、フィールドを設定します。
  5. 3JavaトランスフォーメーションのJavaコードスニペットを設定します。
  6. [パッケージのインポート]、[Helperコード]、および[入力行に達したとき]セクションにコードスニペットを入力します。
  7. 4コードをコンパイルし、マッピングを実行します。

ソースファイルを作成する

ソースファイルをカンマ区切りのフラットファイルとして作成します。Secure Agentがアクセス可能なディレクトリにファイルを保存します。
以下のデータを使用します。
EMP_ID,EMP_NAME,EMP_AGE,EMP_DESC,EMP_PARENT_EMPID
1,James Davis,50,CEO,
4,Elaine Masters,40,Vice President - Sales,1
5,Naresh Thiagarajan,40,Vice President - HR,1
6,Jeanne Williams,40,Vice President - Software,1
9,Geetha Manjunath,34,Senior HR Manager,5
10,Dan Thomas,32,Senior Software Manager,6
14,Shankar Rahul,34,Senior Software Manager,6
20,Juan Cardenas,32,Technical Lead,10
21,Pramodh Rahman,36,Lead Engineer,14
22,Sandra Patterson,24,Software Engineer,10
23,Tom Kelly,32,Lead Engineer,10
35,Betty Johnson,27,Lead Engineer,14
50,Dave Chu,26,Software Engineer,23
70,Srihari Giran,23,Software Engineer,35
71,Frank Smalls,24,Software Engineer,35

マッピングの設定

この例でマッピングを設定するには、新しいマッピングを作成し、Javaトランスフォーメーションを追加します。次にソースフィールド、ターゲットフィールド、およびJavaトランスフォーメーションフィールドを設定します。Javaトランスフォーメーションで、トランスフォーメーション動作がアクティブであることを確認します。
次の図に、マッピングを示します。
マッピング例では、ダウンストリームのJavaトランスフォーメーション「java_FindEmpMgr」に接続しているソーストランスフォーメーション「src_Emp」を示します。Javaトランスフォーメーションは、ターゲットトランスフォーメーション「tgt_EmpWithMgr」に接続しています。
トランスフォーメーションを次のように設定します。
ソーストランスフォーメーション
ソーストランスフォーメーションで、次の表に示すようにソースフィールドメタデータを更新します。
名前
タイプ
精度
スケール
オリジン
EMP_ID
integer
10
0
<ソースファイル名>
EMP_NAME
string
100
0
<ソースファイル名>
EMP_DESC
string
100
0
<ソースファイル名>
EMP_AGE
integer
10
0
<ソースファイル名>
EMP_PARENT_EMPID
integer
10
0
<ソースファイル名>
Javaトランスフォーメーション
Javaトランスフォーメーションには、ソーストランスフォーメーションからの受信フィールドがすべて含まれます。
以下の出力フィールドを作成します。
名前
タイプ
精度
スケール
EMP_ID_OUT
integer
10
0
EMP_NAME_OUT
string
100
0
EMP_DESC_OUT
string
100
0
EMP_PARENT_EMPNAME
string
100
0
[詳細]タブで、動作がアクティブに設定されていることを確認します。
ターゲットトランスフォーメーション
ターゲットトランスフォーメーションで、以下のターゲットフィールドを作成します。
名前
タイプ
精度
スケール
オリジン
EMP_ID
integer
10
0
<ターゲットファイル名>
EMP_NAME
string
100
0
<ターゲットファイル名>
EMP_DESC
string
100
0
<ターゲットファイル名>
EMP_PARENT_EMPNAME
string
100
0
<ターゲットファイル名>
次の表に示すようにフィールドマッピングを設定します。
ターゲットフィールド名
マッピングされたフィールド
EMP_ID
EMP_ID_OUT
EMP_NAME
EMP_NAME_OUT
EMP_DESC
EMP_DESC_OUT
EMP_PARENT_EMPNAME
EMP_PARENT_EMPNAME

Javaコードスニペットの設定

トランスフォーメーション機能を定義するJavaコードスニペットを[Java]タブで入力します。
Javaエディタの以下のセクションでJavaコードスニペットを入力します。
パッケージのインポート
java.util.Mapおよびjava.util.HashMapパッケージをインポートします。
ヘルパーコード
Javaトランスフォーメーションにおいてデータの状態を追跡するためにMapオブジェクト、ロックオブジェクト、およびブール変数を作成します。
入力行に達したとき
入力行を受け取る際のJavaトランスフォーメーションの動作を定義するコードを入力します。

パッケージのインポート

[パッケージのインポート]セクションでは、サードパーティ製のJavaパッケージ、ビルトインJavaパッケージ、カスタムJavaパッケージをインポートします。この例では、MapパッケージおよびHashMapパッケージを使用しています。
[パッケージのインポート]セクションに、以下のコードを入力します。
import java.util.Map;
import java.util.HashMap;
データ統合が、トランスフォーメーションのJavaコードにインポート文を追加します。

ヘルパーコード

[Helperコード]セクションで、Javaトランスフォーメーションのユーザー定義変数およびメソッドを宣言します。
[Helperコード]セクションは、[入力行に達したとき]セクションのJavaコードで使用する以下の変数を定義します。
変数
説明
empMap
ソースからのID番号および従業員名を格納するMapオブジェクトです。
lock
パーティション全体でempMapへのアクセスを同期するために使用するLockオブジェクトです。
generateRow
現在の入力行に対して出力行の生成が必要かどうかを判断するために使用するBoolean変数です。
isRoot
その従業員が企業の組織図の最上位(ルート)に位置するかどうかを判断するために使用するBoolean変数です。
[Helperコード]セクションに、以下のコードを入力します。
// Static Map object to store the ID and name relationship of an employee.
// If a session uses multiple partitions, empMap is shared across all partitions.
private static Map <Integer, String> empMap = new HashMap <Integer, String> ();

// Static lock object to synchronize the access to empMap across partitions.
private static Object lock = new Object();

// Boolean to track whether to generate an output row based on validity of the
// input data.
private boolean generateRow;

// Boolean to track whether the employee is root.
private boolean isRoot;
データ統合が、トランスフォーメーションのJavaコードにインポート文を追加します。

入力行に達したとき

Javaトランスフォーメーションは、入力行を受け取ると[入力行に達したとき]セクションでJavaコードを実行します。この例では、トランスフォーメーションによって出力行を生成することについての可能性が入力行の値に基づいて決定されます。
[入力行に達したとき]セクションで、以下のコードを入力します。
// Initially set generateRow to true for each input row.
generateRow = true;

// Initially set isRoot to false for each input row.
isRoot = false;

// Check if input employee id and name is null.
if (isNull ("EMP_ID") || isNull ("EMP_NAME"))
{
incrementErrorCount(1);

// If input employee id and/or name is null, don't generate a output row for this
// input row.
generateRow = false;

} else {

// Set the output field values.
EMP_ID_OUT = EMP_ID;
EMP_NAME_OUT = EMP_NAME;
}

if (isNull ("EMP_DESC"))
{
setNull("EMP_DESC_OUT");
} else {
EMP_DESC_OUT = EMP_DESC;
}

boolean isParentEmpIdNull = isNull("EMP_PARENT_EMPID");

if(isParentEmpIdNull)
{
// This employee is the root for the hierarchy.
isRoot = true;
logInfo("This is the root for this hierarchy.");
setNull("EMP_PARENT_EMPNAME");
}

synchronized(lock)

{
// If the employee is not the root for this hierarchy, get the corresponding
// parent ID.
if(!isParentEmpIdNull)
EMP_PARENT_EMPNAME = (String) (empMap.get(new Integer (EMP_PARENT_EMPID)));

// Add employee to the map for future reference.
empMap.put (new Integer(EMP_ID), EMP_NAME);
}

// Generate row if generateRow is true.
if(generateRow)
generateRow();

コードのコンパイルとマッピングの実行

トランスフォーメーションのJavaコードをコンパイルするには、Javaエディタで[コンパイル]をクリックします。コードを正常にコンパイルすると、マッピングを実行できます。
コンパイル結果には、コンパイルの状況が表示されます。Javaコードのコンパイルに失敗した場合、Javaエディタでエラーを修正してからJavaコードをコンパイルします。トランスフォーメーションを正常にコンパイルしたら、マッピングを保存して実行します。
マッピングを実行するには、Mapping Designerで[実行]をクリックします。
ターゲットファイルには次の結果が含まれています。
"EMP_ID","EMP_NAME","EMP_DESC","EMP_PARENT_EMPNAME"
1,"James Davis","CEO",
4,"Elaine Masters","Vice President - Sales","James Davis"
5,"Naresh Thiagarajan","Vice President - HR","James Davis"
6,"Jeanne Williams","Vice President - Software","James Davis"
9,"Geetha Manjunath","Senior HR Manager","Naresh Thiagarajan"
10,"Dan Thomas","Senior Software Manager","Jeanne Williams"
14,"Shankar Rahul","Senior Software Manager","Jeanne Williams"
20,"Juan Cardenas","Technical Lead","Dan Thomas"
21,"Pramodh Rahman","Lead Engineer","Shankar Rahul"
22,"Sandra Patterson","Software Engineer","Dan Thomas"
23,"Tom Kelly","Lead Engineer","Dan Thomas"
35,"Betty Johnson","Lead Engineer","Shankar Rahul"
50,"Dave Chu","Software Engineer","Tom Kelly"
70,"Srihari Giran","Software Engineer","Betty Johnson"
71,"Frank Smalls","Software Engineer","Betty Johnson"