メッセージボディの開発
このトピックでは、承認申請プロセッサインタフェースの機能を使用してメッセージボディを生成する方法について説明します。既成では、カスタマイズ中にオーバーライドされるカスタマイズ可能な承認申請プロセッサクラスが com.ptc.qualitymanagement.regmstr.impl パッケージに含まれています。これらのクラスには、承認申請オブジェクトをパラメータとして使用する、オーバーライド可能なメソッド generatePayload があります。
ソリューション
• generatePayload メソッドをオーバーライドするカスタム承認申請プロセッサクラスを作成します。
• カスタムメッセージボディの生成を実装します。generatePayload メソッドがオーバーライドされた新しいカスタムクラスの例を参照してください。
• カスタムクラスを登録する services.xconf エントリを作成します。
ソリューションエレメント
次のテーブルで、ソリューションエレメントについて説明します。
エレメント
|
タイプ
|
説明
|
generatePayload(RegulatorySubmission regulatorySubmission)
|
API
|
最終的に監督官庁に送信されるファイルを生成し、そのファイルを REGULATORY_SUBMISSION_PAYLOAD コンテンツカテゴリに規制コンテンツとして保存します。
|
デフォルトの動作
デフォルトの実装は、主にデモと説明のみを目的としています。デフォルトの実装では、指定した承認申請が使用され、キーと値の属性から成る JSON オブジェクトがオブジェクトに作成され、そのファイルがコンテンツのカテゴリ REGULATORY_SUBMISSION_PAYLOAD に規制コンテンツとして保存されます。一意の「申請 ID」が割り当てられて承認申請のメッセージボディに追加され、承認申請オブジェクトで更新されます。
カスタムクラスの作成
メッセージボディの生成をカスタマイズするには、SimpleRegulatorySubmissionProcessor または適切な改訂可能なサブタイププロセッサを拡張する Java クラスプロセッサ (独自のプロセッサ) を作成してから、generatePayload メソッドをオーバーライドします。改訂可能なサブタイププロセッサは、AERSubmissionProcessor、ERSubmissionProcessor、RPSSubmissionProcessor、または UDISubmissionProcessor のいずれかです。generatePayload メソッドで、TransactionRunner クラスを使用して、プロセスがトランザクション内で実行されるようにします。キーと値の属性から成る JSON オブジェクトを承認申請から作成します。作成された JSON オブジェクトを UTF_8 文字列として ByteArrayInputStream クラスに渡します。ConditionalAutoCheckoutRunner クラスを使用して、規制コンテンツを保存するプロセス中に、必要に応じて承認申請オブジェクトがチェックアウトおよびチェックインされるようにします。ConditionalAutoCheckoutRunner ラッパークラスの RegulatoryContentHelper クラスを使用して、規制コンテンツをコンテンツのカテゴリ REGULATORY_SUBMISSION_PAYLOAD として保存します。このメソッドの最後に、承認申請オブジェクトを返す前に、PersistenceHelper クラスの refresh メソッドを使用してオブジェクトを再表示します。次に、VersionControlHelper’s getLatestIteration method を使用して、最新バージョンの承認申請をフェッチします。ConditionalAutoCheckoutRunner クラスは承認申請に対してチェックイン操作を実行し、申請のバージョンに作業版数を適用するので、PersistenceHelper クラスと VersionControlHelper’s getLatestIteration メソッドを使用する必要があります。
次の例は、generatePayload メソッドがオーバーライドされた新しいカスタムクラスを示しています。
@Override
public RegulatorySubmission generatePayload(RegulatorySubmission regulatorySubmission) throws Exception {
// Check modify permissions.
if(!AccessControlHelper.manager.hasAccess(regulatorySubmission, AccessPermission.MODIFY)) {
throw new WTException(accessResource.class.getName(), accessResource.NOT_AUTHORIZED_EXCEPTION, null);
}
return new TransactionRunner<RegulatorySubmission>() {
@Override
public RegulatorySubmission performBusinessProcess() throws Exception {
JSONObject jsonObject = new JSONObject();
jsonObject.append("Type", TypeIdentifierHelper.getType(regulatorySubmission));
jsonObject.append("Number", regulatorySubmission.getNumber());
jsonObject.append("Name", regulatorySubmission.getName());
String sid = UUID.randomUUID().toString();
jsonObject.append("SubmissionID", sid);
JSONArray subjectArray = new JSONArray();
if (regulatorySubmission instanceof RegSubmission2) {
WTList subjects = RegulatorySubmissionHelper.service
.getSubjectsForRegulatorySubmission(regulatorySubmission);
for (Object o : subjects) {
subjectArray.put(IdentityFactory.getDisplayIdentifier(o)
.getLocalizedMessage(SessionHelper.getLocale()));
}
} else {
subjectArray.put(regulatorySubmission.getSubject().getDisplayIdentifier()
.getLocalizedMessage(SessionHelper.getLocale()));
}
jsonObject.append("Subjects", subjectArray);
InputStream is = new ByteArrayInputStream(jsonObject.toString().getBytes(StandardCharsets.UTF_8));
String description = "regulatory_submission_payload.json";
return new ConditionalAutoCheckoutRunner<RegulatorySubmission>(regulatorySubmission) {
public RegulatorySubmission performBusinessProcess(RegulatorySubmission regulatorySubmission) throws Exception {
regulatorySubmission.setSubmissionID(sid);
regulatorySubmission = (RegulatorySubmission) PersistenceHelper.manager.save(regulatorySubmission);
return RegulatoryContentHelper.getService().storeRegulatoryContent(regulatorySubmission,
RegulatoryContentCategory.REGULATORY_SUBMISSION_PAYLOAD, description, is);
};
}.invoke();
}
}.invoke();
}