TRONアドレス生成処理のDataSpiderアダプタ化

DataSpiderとブロックチェーン　その３
## TRONアドレス生成アダプタのブラッシュアップ
[前回は、DataSpiderSDKを使用したTRONアドレスの生成アダプタの概要](https://qiita.com/dataspider-fan/items/1fa23384ec0ccfa31461)を紹介しました。
今回は、TRONアドレスの生成アダプタのブラッシュアップした点を説明したいと思います。

## なにをするか
* INPUTの改良
レコード単位のIDをうけとるようにします。
* OUTPUTの改良
INPUTのIDに紐づく公開鍵と秘密鍵を出力するようにします。

## シナリオと利用シーンのイメージ
管理者名簿CSVファイルを読み込み、TRONアドレス発行後、TRONアドレス名簿としてCSVファイルを出力する。
![tron_address_list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/aec961e7-9b39-7af1-9f70-15230625b9a6.png)

## アダプタの実装
入力側データを取得し、出力側バッファに出力します。

##### GetTronGenerateAddressOperation.java
```java
/**
Project Name    : DataSpider fan community
Creation Date   : 2022/09/01

Copyright 2022 kamomek2. All rights reserved.
This software is released under the MIT License.
http://opensource.org/licenses/mit-license.php
*/

package com.jpn.linux.dp.modules.adapter.TronGenerateAddress;

import static com.jpn.linux.dp.modules.adapter.TronGenerateAddress.Constants.*;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

import org.tron.trident.core.key.KeyPair;

import com.appresso.ds.common.fw.LoggingContext;
import com.appresso.ds.common.xmlfw.table.Column;
import com.appresso.ds.common.xmlfw.table.Row;
import com.appresso.ds.common.xmlfw.table.TableDataBuilder;
import com.appresso.ds.common.xmlfw.table.TableDataType;
import com.appresso.ds.common.xmlfw.table.TableRowIterator;
import com.appresso.ds.dp.spi.OperationConfiguration;
import com.appresso.ds.dp.spi.OperationContext;
import com.appresso.ds.xmlfw.DataBuilderFactory;
import com.appresso.ds.xmlfw.DataParserFactory;

public class GetTronGenerateAddressOperation extends TronGenerateAddressOperation {

	public GetTronGenerateAddressOperation(
			OperationConfiguration conf,
			OperationContext context) {
		super(conf, context);
	}

	@Override
	public Map execute(Map inputData) throws Exception {
		Map res = new HashMap();

		String addressType = getAddressType();

		Object data = inputData.get(KEY_INPUT);

		LoggingContext log = getContext().log();

		// 出力側TableDataBuilderを生成する。
		TableDataBuilder builder = DataBuilderFactory.newTableDataBuilder(getColumnOutputTypes(), isLargeData());

		log.info(builder.toString());

		try (TableRowIterator rowIterator = DataParserFactory.newTableRowIterator(data)) {

			// 出力側項目の出力開始を宣言する
			builder.startConstruction();

			// 入力側レコードの繰り返し処理
			while (rowIterator.hasNext()) {
				Row record = rowIterator.next();

				builder.startRow(); // 出力側行単位のデータを格納するバッファ

				for (int columnIndex = 0, columnCount = record.getColumnCount(); columnIndex < columnCount; columnIndex++) {

					// 入力側の特定の列値を取得
					Column column = record.getColumn(columnIndex);
					String columnValue = getColumnValue(column);

					log.debug("** record datas **");
					log.debug("inputData = " + columnValue);
					builder.column(columnValue); // KEY_OUTPUT_COLNAME_ADDRESS_ID

					// TRONアドレス生成
					KeyPair keyPairGenarate = KeyPair.generate();
					String privateKey = keyPairGenarate.toPrivateKey();

					log.debug("*******************");

					// 画面から指定されたラジオボタンの値を参照
					if(AddressTypeRadioButtonItems[0].equals(addressType)) {

						// BASE58アドレス
						String publicAddress =keyPairGenarate.toBase58CheckAddress();

						log.info("** Generate toBase58CheckAddress TRON address **");
						// 実行ログに生成したアドレスを表示する
						log.debug(MultiLangMessage.getString("log.generate.address", publicAddress));

						builder.column(publicAddress); // KEY_OUTPUT_COLNAME_ADDRESS


					} else {

						// HEXアドレス
						String publicAddress =keyPairGenarate.toHexAddress();

						log.info("** Generate publicAddress TRON address **");
						// 実行ログに生成したアドレスを表示する
						log.debug(MultiLangMessage.getString("log.generate.address", publicAddress));

						builder.column(publicAddress); // KEY_OUTPUT_COLNAME_ADDRESS

					}

					builder.column(privateKey); // KEY_OUTPUT_COLNAME_PRIVATE_KEY
					LocalDateTime now = LocalDateTime.now();
					builder.column(now.toString()); //KEY_OUTPUT_COLNAME_PAYOUT_DATE

					now = null;

				}

				builder.endRow();

			}

			builder.endConstruction();
			Object result = builder.getResult();

			res.put(KEY_OUTPUT, result);

		}

		return res;
	}

	private String getColumnValue(Column column) throws Exception {
		switch (column.getType()) {
			case TableDataType.TYPE_INT:
				return String.valueOf(column.getIntegerValue());
			default:
				return column.getStringValue();
		}
	}

	@Override
	public void destroy() throws Exception {
		// オペレーション終了処理
	}
}
```
## スクリプト実装イメージ
![script3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/a3e4cd37-3623-153c-2963-90b866f8199d.png)

### 入力データと出力データ
![script4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/5e567ed6-cf7a-b889-f0d6-670d514c2eb4.png)

## 次回は
スマートコントラクトに焦点を充てて[DataSpiderからスマートコントラクを呼び出すための実装](https://qiita.com/dataspider-fan/items/301dc2dd582f7e21ec3f)を紹介したいと思います。
概要は以下：
* MetaCoinの発行
* MetaCoinのスマートコントラクト呼び出し