承認申請確認インタープリタの開発
このトピックでは、既成の承認申請プロセッサクラスを拡張し、確認処理メソッドを機関固有の処理メソッドによってオーバーライドする方法について説明します。
ソリューション
既成の承認申請プロセッサを拡張するカスタムクラスを作成します。
カスタムクラスを登録する xconf エントリを作成します。
ソリューションエレメント
以下のテーブルで、ソリューションエレメントについて説明します。
エレメント
タイプ
説明
processAcknowledgement(String transmissionName, String transmissionContent)
API
承認申請の監督官庁から受信した確認を処理するときに使用します。
デフォルトの動作
デフォルトの実装は、デモと説明のみを目的としています。各監督官庁は、各承認申請タイプの確認の番号とフォーマットに関するドキュメントを提供することが求められています。必要に応じて、インプリメンターは提供されているドキュメンテーションと一致する申請固有のプロセッサを作成できます。
確認 1 には、次のフォーマットの JSON 文字列が含まれています。
{
"ackNumber": 1,
"typeName": "<typeName>"
"name": "<regulatorySubmissionName>",
"number": "<regulatorySubmissionNumber>",
"remoteIdentifier": "<remoteIdentifier>"
}
確認 2 には、次のフォーマットの JSON 文字列が含まれています。
{
"ackNumber": 2,
"typeName": "<typeName>"
"remoteIdentifier": "<remoteIdentifier>"
"certificationNumber": "<certificateNumber>"
"expirationDate": "<exirationDate>"
"result": "SUCCESS|FAILURE"
}
承認申請プロセッサインタフェースに基づいて、確認イベントは確認 2 を受信したときにのみ発送されます。これはジェネリック確認プロセッサのサンプルなので、typename が含まれています。承認申請タイプ固有のプロセッサでは、承認申請プロセッサと登録先のタイプの間に 1 対 1 の関係があるので、typename は既知です。
カスタムクラスの作成
確認処理をカスタマイズするには、SimpleRegulatorySubmissionProcessor または適切な改訂可能なサブタイププロセッサを拡張する Java クラス (独自のプロセッサ) を作成してから、processAcknowledgment メソッドをオーバーライドします。改訂可能なサブタイプポピュレータは、AERSubmissionProcessorERSubmissionProcessorRPSSubmissionProcessor、および UDISubmissionProcessor のいずれかです。
次の例は、既成の要件を満たすように、processAcknowledgment メソッドがオーバーライドされた新しいカスタムクラスを示しています。ConditionalCheckoutRunner は、複数のサービス呼び出しが行われた場合に自動チェックアウトを許可しないようにすることで複数の作業版数を防止するために使用されています。
@Override
public boolean processAcknowledgement(String transmissionName, String transmissionContent) throws Exception {
new TransactionRunner() {
@Override
public void performBusinessProcess() throws Exception {
JSONObject jsonContent = new JSONObject(transmissionContent);
switch (jsonContent.getInt("ackNumber")) {
case 1:
String typeName = jsonContent.getString("typeName");
String number = jsonContent.getString("number");
RegulatorySubmission regulatorySubmission = RegulatorySubmissionHelper.service
.findRegulatorySubmissionByTypeAndAttribute(typeName, "number", number);
new ConditionalAutoCheckoutRunner<RegulatorySubmission>(regulatorySubmission) {
@Override
public RegulatorySubmission performBusinessProcess(RegulatorySubmission coRegSub)
throws Exception {
RegulatoryContentHelper.getService().storeRegulatoryContent(coRegSub,
RegulatoryContentCategory.ACKNOWLEDGEMENT1, transmissionName, transmissionContent);
return RegulatorySubmissionHelper.service.modifyRegulatorySubmission(coRegSub,
Map.of("remoteIdentifier", jsonContent.getString("remoteIdentifier")));
}
}.invoke();
break;
case 2:
String remoteIdentifier = jsonContent.getString("remoteIdentifier");
typeName = jsonContent.getString("typeName");
regulatorySubmission = RegulatorySubmissionHelper.service
.findRegulatorySubmissionByTypeAndAttribute(typeName, "remoteIdentifier", remoteIdentifier);
new ConditionalAutoCheckoutRunner<RegulatorySubmission>(regulatorySubmission) {
@Override
public RegulatorySubmission performBusinessProcess(RegulatorySubmission coRegSub)
throws Exception {
RegulatoryContentHelper.getService().storeRegulatoryContent(coRegSub,
RegulatoryContentCategory.ACKNOWLEDGEMENT2, transmissionName, transmissionContent);
if ("SUCCESS".equals(jsonContent.get("result"))) {
String expDateString = jsonContent.getString("expirationDate");
Timestamp expDate = Timestamp.valueOf(expDateString);
coRegSub = RegulatorySubmissionHelper.service.modifyRegulatorySubmission(coRegSub,
Map.of("certificateNumber", jsonContent.getString("certificateNumber"),
"expirationDate", expDate));
RegulatorySubmissionProcessorHelper.dispatchAcknowledgmentSuccessfulEvent(coRegSub);
}
else {
RegulatorySubmissionProcessorHelper.dispatchAcknowledgmentFailedEvent(coRegSub);
}
return coRegSub;
}
}.invoke();
break;
default:
break;
}
}
}.invoke();
return true;
}
これは役に立ちましたか?