TOP >技術者情報 >アドオンモジュール開発 >アドオンモジュール開発リファレンス

技術者情報 アドオンモジュール開発リファレンス


 □使い方
   実行クラスは以下のように、インターフェース「jp.co.softbrain.job.module.api.JobExecutor」クラスを実装する。
 public class TestJob1 implements JobExecutor {
  ...
     public ResponseModel execute(EsmJobRequest request) throws Exception {
         ...
    }
    ...
} ...

 
・REST APIの利用 
  eSMが公開しているREST APIを利用するには、「jp.co.softbrain.job.module.util.RestUtils」クラスを利用する。 

 REST APIの詳細は以下を参照する。 
   REST APIリファレンス

 以下に、eSMが公開しているREST API一覧とRestUtilsクラスの使用するメソッドを示す。

ⅰ.eセールスマネージャーRemix REST APIがサポートしているエンティティ名の一覧を取得します。  

 /**
* eセールスマネージャーRemix REST APIがサポートしているエンティティ名の一覧を取得する。
*
* @param authUserToken ユーザ認証トークン
* @param url eSMのURL 例 : http://host:port/contextName 末尾の '/' は不要です。
* @return {@link GetEntityNames}
*/
public static GetEntityNames getEntityNames(final String authUserToken, final String url) {
    ...
}

 
ⅱ.指定したチェックボックス型項目の選択肢一覧を取得します。
 /**
* 指定したチェックボックス型項目の選択肢一覧を取得する。
*
* @param authUserToken ユーザ認証トークン
* @param url eSMのURL 例 : http://host:port/contextName 末尾の '/' は不要です。
* @param obj_name エンティティ名
* @param column_code チェックボックス型項目の項目コード
* @return {@link GetEntitiesCheckItems}
*/
public static GetEntitiesCheckItems getEntitiesCheckItems(
    final String authUserToken, final String url, final String obj_name, final Integer column_code) {
    ...
}

  
 ⅲ.指定したセレクト型項目の選択肢一覧を取得します。
 /**
 * 指定したセレクト型項目の選択肢一覧を取得する。
 *
 * @param authUserToken ユーザ認証トークン
 * @param url eSMのURL 例 : http://host:port/contextName 末尾の '/' は不要です。
 * @param obj_name エンティティ名
 * @param column_code チェックボックス型項目の項目コード
 * @return {@link GetEntitiesSelectItems}
 */
public static GetEntitiesSelectItems getEntitiesSelectItems(
    final String authUserToken, final String url, final String obj_name, final Integer column_code) {
    ...
}


  ⅳ.エンティティの種類を指定し、項目一覧を取得します。
 /**
 * エンティティの種類を指定し、項目一覧を取得する。
 *
 * @param authUserToken ユーザ認証トークン
 * @param url eSMのURL 例 : http://host:port/contextName 末尾の '/' は不要です。
 * @param obj_name エンティティ名
 * @return {@link GetEntitiesColumns}
 */
public static GetEntitiesColumns getEntitiesColumns(
    final String authUserToken, final String url, final String obj_name) {
    ...
}

 
 ⅴ.eセールスマネージャーRemixに登録済みのエンティティを検索します。複数のエンティティを取得可能です。
 /**
 * eセールスマネージャーRemixに登録済みのエンティティを検索し複数のエンティティを取得する。
 *
 * @param authUserToken ユーザ認証トークン
 * @param url eSMのURL 例 : http://host:port/contextName 末尾の '/' は不要です。
 * @param condition {@link EntitiesSearchCondition}
 * @return {@link PostEntitiesSearch}
 */
public static PostEntitiesSearch postEntitiesSearch(
    final String authUserToken, final String url, final EntitiesSearchCondition condition) {
    ...
}


  ⅵ.eセールスマネージャーRemixに登録済みのエンティティを検索し、単一のエンティティを取得します。 
 /**
 * eセールスマネージャーRemixに登録済みのエンティティを検索し、単一のエンティティを取得する。
 *
 * @param authUserToken ユーザ認証トークン
 * @param url eSMのURL 例 : http://host:port/contextName 末尾の '/' は不要です。
 * @param obj_name エンティティ名
 * @param id エンティティのコード
 * @param columncodes 項目コード
 * @return {@link GetEntity}
 */
public static GetEntity getEntity(
    final String authUserToken, final String url, final String obj_name, final Integer id, final Integer... columncodes) {
    ...
}



  ⅶ.eセールスマネージャーRemixに単一のエンティティを登録します。
 /**
 * eセールスマネージャーRemixに単一のエンティティを登録する。
 *
 * @param authUserToken ユーザ認証トークン
 * @param url eSMのURL 例 : http://host:port/contextName 末尾の '/' は不要です。
 * @param request {@link RequestModel}
 * @return {@link Entity} 登録結果
 */
public static Entity postEntity(
    final String authUserToken, final String url, final RequestModel request) {
    ...
}

 
ⅷ.eセールスマネージャーRemixに登録済みの単一のエンティティを更新します。
 /**
 * eセールスマネージャーRemixに登録済みの単一のエンティティを更新する。
 *
 * @param authUserToken ユーザ認証トークン
 * @param url eSMのURL 例 : http://host:port/contextName 末尾の '/' は不要です。
 * @param request {@link RequestModel}
 * @return {@link Entity} 更新結果
 */
public static Entity putEntity(
    final String authUserToken, final String url, final RequestModel request) {
    ...
}


ⅸ.eセールスマネージャーRemixに登録済みの単一のエンティティを削除します。
 /**
 * eセールスマネージャーRemixに登録済みの単一のエンティティを削除する。
 *
 * @param authUserToken ユーザ認証トークン
 * @param url eSMのURL 例 : http://host:port/contextName 末尾の '/' は不要です。
 * @param request {@link RequestModel}
 */
public static void deleteEntity(
    final String authUserToken, final String url, final RequestModel request) {
    ...
}

 
 ⅹ.eセールスマネージャーRemixに複数のエンティティを登録します。
 /**
 * eセールスマネージャーRemixに複数のエンティティを登録する。
 *
 * @param authUserToken ユーザ認証トークン
 * @param url eSMのURL 例 : http://host:port/contextName 末尾の '/' は不要です。
 * @param requests {@link List}< {@link RequestModel}>
 * @return {@link Entities} 登録結果
 */
public static Entities postEntities(
    final String authUserToken, final String url, final List<RequestModel> requests) {
    ...
}

   
 ⅺ.eセールスマネージャーRemixに登録済みの複数のエンティティを更新します。
 /**
 * eセールスマネージャーRemixに複数のエンティティを更新する。
 *
 * @param authUserToken ユーザ認証トークン
 * @param url eSMのURL 例 : http://host:port/contextName 末尾の '/' は不要です。
 * @param requests {@link List}&lt; {@link RequestModel}&gt;
 * @return {@link Entities} 更新結果
 */
public static Entities putEntities(
    final String authUserToken, final String url, final List<RequestModel> requests) {
    ,,,
}

 
  ⅻ.eセールスマネージャーRemixに登録済みの複数のエンティティを削除します。
 /**
 * eセールスマネージャーRemixに複数のエンティティを削除する。
 *
 * @param authUserToken ユーザ認証トークン
 * @param url eSMのURL 例 : http://host:port/contextName 末尾の '/' は不要です。
 * @param requests {@link List}&lt; {@link RequestModel}&gt;
 */
public static void deleteEntities(
    final String authUserToken, final String url, final List<RequestModel> requests) {
    ,,,
}


・テンプレートファイルの利用 
  テンプレートファイルを利用するには、「jp.co.softbrain.job.module.util.FileUtils」クラスを利用する。
 コードサンプル(テストコード)
ⅰ.ファイルを取得する。 
 /**
 * ファイルを取得する。
 *
 * @param contextName コンテキスト名
 * @param fileName ファイル名(拡張子付き)
 * @return {@link File}
 */
public static File getFile(final String contextName, final String fileName) {
    ...
}


ⅱ.ファイルオブジェクトをBase64エンコードした文字列に変換する。
 /**
 * ファイルオブジェクトをBase64エンコードした文字列に変換する。
 *
 * @param file ファイル
 * @return Base64エンコードした文字列
 * @throws IOException 入出力例外
 */
public static String fileToBase64Encode(final File file) throws IOException {
    
    ...
}


・ログ出力
   ログを出力するには、「jp.co.softbrain.job.module.util.LoggerUtils」を利用する。
 
 以下に、LoggerUtilsクラスの使用するメソッドを示す。LoggerUtilsクラスのメソッド引数と戻り値型の詳細は javadoc を参照する。
 
 ⅰ.ロガーの取得

 /**
 * ロガーを取得する。
 *
 * @param cls ログ出力クラス。
 * @return {@link Logger}
 */
public static Logger getLogger(final Class<?> cls) {
    ...
}


・サンプルコード
 eSMとのデータ送受信は、RESTを使用するため全てのデータが文字列となる。
 eSMから受信したデータは、対応する「EsmJobRequest」へ変換するが
 eSMへ返却するデータ「ResponseModel」の値はファイルオブジェクトや業務固有のデータオブジェクトは文字列で返却する。

 以下に各ユーティリティクラスの使用例とオブジェクトを文字列変換する例を示す。
 ・REST API

 以下で、顧客シートと関連する拡張シートへのデータ追加の例を示す。

 ...
 var item = new Item().setColumn_code("10008").setColumnType(ColumnType.text).setValue("テストです。"); 
 var relatedObject = new RelatedObject() 
     .setObjectName("employee@RELATION_10007") 
     .addItem(new Item().setColumn_code("501").setColumnType(ColumnType.num).setValue(2)); 
 var ent = RestUtils.postEntity( 
     AUTH_USER_TOKEN, TARGET_URL, 
     new RequestModel().setObjectName("customize_20001").addItem(item).addRelatedObject(relatedObject)); 
 ...

① 追加する拡張シートの項目コード、項目タイプと値をオブジェクト「Item」に設定する。(複数項目の場合は、オブジェクト「Item」のリストを作成する)
② 関連オブジェクト「RelatedObject」を作成する。 
③ 関連オブジェクト「RelatedObject」のオブジェクト名へ関連するテーブル名と項目列名を設定する。
④ 関連オブジェクト「RelatedObject」へ関連するテーブルの項目コード、項目タイプとレコードを一意に特定する値を設定する。
⑤ 「RestUtils」クラスの#postEntityメソッドのパラメータに⑥と⑦を設定する。

 
 ・FileUtils
 ファイルオブジェクトは、「FileUtils」クラスのメソッド#getFileを使用してファイルを取得し
 メソッド#fileToBase64Encodeを使用しBase64文字列に変換する。 
 ...
file = FileUtils.getFile("remix", "sample.txt"); 

fileInfo.setFileContent(FileUtils.fileToBase64Encode(file)) 
     .setFileEncoding("SJIS") 
    .setFileName(file.getName()); 

responseModel.setContentType("text/plain"); 
... 

① ファイルオブジェクトを取得する。
② ファイルオブジェクトをBase64文字列へ変換する。
③ ファイルエンコーディングを設定する。
④ ファイル名を設定する。
⑤ ファイルのコンテントタイプを設定する。


 
・ファイルダウンロード
 以下に、JavascriptでBase64文字列のファイルをダウンロードする例を示す。
     ・共通関数
  EdgeとEdge以外のブラウザでファイルダウンロードのダイアログを表示する共通関数の例となる。
 ...
 function callJobApi(targetUrl, authUserToken, authApiToken, requstData, doneCallback, failCallback) {
     $.ajax({
         type : 'POST',
         url : targetUrl + '/rest/v1/job/execute',
         contentType : 'application/json; charset=UTF-8',
         data : JSON.stringify(requstData),
         dataType : 'json',
        headers : {
             'X-Auth-User-Token' : authUserToken,
             'X-Auth-API-Token' : authApiToken
         }
     }).done(function(data, status, jqXHR) {

         var resultData = JSON.parse(data.result[0].resultMessage);

         if (resultData.fileInfo) {
            downloadDialog(
                resultData.contentType,
                resultData.fileInfo.fileEncoding,
                resultData.fileInfo.fileName,
                resultData.fileInfo.fileContent);
         } else {
 
            if (doneCallback) {
                 doneCallback(data, status, jqXHR);
             }
         }
     }).fail(function(jqXHR, status, errorThrown) {
 
        if (failCallback) {
             failCallback(jqXHR, status, errorThrown);
         }
     });
 }

 function downloadDialog(contentType, charset, fileName, base64content) {
 
    if (window.navigator.msSaveBlob) {
 
         var blob = toBlob(contentType, base64content);
         window.navigator.msSaveBlob(blob, fileName);
         // msSaveOrOpenBlobの場合はファイルを保存せずに開ける
         window.navigator.msSaveOrOpenBlob(blob, fileName);
     } else {

         var element = document.createElement('a');
         var fl = 'data:' + contentType + ';charset=' + charset + ';base64,'
             + base64content;
         element.setAttribute('href', fl);
         element.setAttribute('download', fileName);
         element.click();
         element.remove();
     }
}

 function toBlob(contentType, base64content) {
     var bin = atob(base64content.replace(/^.*,/, ''));
     var buffer = new Uint8Array(bin.length);
     for (var i = 0; i < bin.length; i++) {
         buffer[i] = bin.charCodeAt(i);
     }
     try{
         var blob = new Blob([buffer.buffer], {
             type: contentType
         });
     }catch (e){
         return false;
     }
     return blob;
 }
 ...

 ※ このコードは、Edgeのバージョン「44.19041.423.0」とChromeのバージョン「87.0.4280.88」で動作を確認済。

   ・実行関数
上記の共通関数を呼び出す「onclick」イベントの例を以下に示す。 
 ...
 $(document).ready(function() {
     $('#download').click(function() {

        var authUserToken = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';   
        var authApiToken = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy';

         var requstData = {
             job_id : '10001',  
             sync : 'true',  ③
             file_extension : 'txt'  ④
         };
 
        callJobApi('http://host:port/contextName', authUserToken, authApiToken, requstData, doneCallback, failCallback);  ⑤
     });
 });

 function doneCallback(data, status, jqXHR) {  ⑥
     console.log('jsonContent: ', data);
}

 function failCallback(jqXHR, status, errorThrown) {  ⑦
    console.log('FAIL: ', errorThrown);
}
 ...
 <div>
    <input type="button" id="download" value="go" /><br>
 </div>
 ...

① 認証情報を設定する。(必要な情報全て)
② ジョブIDを設定する。
③ ここはeSMの仕様による。
④ サンプルコードで使用する固有パラメータ。
⑤ URL,認証情報、リクエストデータと正常時・例外時の関数を指定して共通関数を呼び出す。
⑥ 正常終了時の関数。
⑦ 例外終了時の関数。 



  ・データ(Java Bean)オブジェクトの文字列変換
     データオブジェクトはJSON文字列とする。 
 ...
 var model = new JobId10002Model().setStr("test").setInteger(100).setLng(1111111111111L); 
 
return new ResponseModel()
    .setStatus(0) 
    .setMessage("処理完了!!!") 
    .setJsonContent(new ObjectMapper().writeValueAsString(model)) 
    .setContentType("application/json"); 

... 

① 返却するオブジェクトを作成する。
② 処理結果ステータスを設定する。(正常終了=0)
③ 処理結果メッセージを設定する。
④ 返却するオブジェクトをJSON文字列に変換する。(この例では、「jackson」の「ObjectMapper」を使用している)
⑤ レスポンスオブジェクトのコンテントタイプを設定する。 


 
 ・LoggerUtils
    ログ出力には、以下に示す通りロガーを取得する。
 ...
import ch.qos.logback.classic.Logger;
 ...
 public class TestJob1 implements JobExecutor {

    private static final Logger log = LoggerUtils.getLogger(TestJob1.class);
 ...


 ・単体テスト(Unit test)
    単体テストを作成する際は、Mockit等のmock作成ライブラリを使用してJunitで作成する。

    ここでは、JunitやMockitの解説は割愛し、提供するユーティリティクラス「jp.co.softbrain.job.module.util.RestUtils」、「jp.co.softbrain.job.module.util.FileUtils」
    と「jp.co.softbrain.job.module.util.LoggerUtils」のmock化について説明する。
 
    以下では、サンプルプログラム「jp.co.softbrain.wes.sfa.job.businessLogic.test.TestJob1」のJunit Jupiterでのテストケースを例として示す。
    テストクラスは、「jp.co.softbrain.wes.sfa.job.businessLogic.test.TestJob1Test」となる。
 
 ...
 mockStatic(RestUtils.class); 

var entity = new Entity().setPrimarykey("100001"); 

when(RestUtils.postEntity(anyString(), anyString(), any())).thenReturn(entity); 
... 

① RestUtilsクラスをモックオブジェクトにする。
② RestUtilsのメソッド#postEntityの戻り値を作成する。
③ RestUtilsのメソッド#postEntityが呼び出された場合の戻り値を設定する。 



 ...
static boolean init = false; 
@BeforeEach 
public void beforeEach() throws Exception {
    if (!init) {
         mockStatic(LoggerUtils.class); 
         Logger log = (Logger) LoggerFactory.getLogger(TestJob1.class); 
          when(LoggerUtils.getLogger(TestJob1.class)).thenReturn(log); 
         init = true;
     }
 }
... 

① 初期化フラグを初期化未済で設定する。
② 各テストケースの実行前メソッドを用意する。
③ LoggerUtilsクラスをモックオブジェクトにする。
④ LoggerUtilsのメソッド#getLoggerの戻り値を作成する。(logbackのロガー)
⑤ LoggerUtilsのメソッド#getLoggerが呼び出された場合の戻り値を設定する。
⑥ 初期化フラグを初期化済にする。

※ LoggerUtilsクラス等のユーティリティクラスのモックオブジェクトを毎回生成すると例外が発生する。
    また、logback.xmlを「src/main/resources」または「src/test/resources」に配置する。