开发有效载荷
本主题介绍监管提交处理器接口如何提供生成有效载荷的功能。预设情况下,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 类中的刷新方法来刷新对象。然后,使用 VersionControlHelper’s getLatestIteration method 获取监管提交的最新版本。需要使用 PersistenceHelper 类和 VersionControlHelper’s getLatestIteration 方法,因为 ConditionalAutoCheckoutRunner 类会对监管提交执行检入操作,并迭代提交的版本。
下一示例显示的新自定义类使用了已改写的 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();
}