自定义用于监管提交验证的规则集选择
本主题介绍如何配置受支持且可自定义的 API 来动态确定在监管提交验证期间使用的规则集名称。
这意味着,系统不会将固定规则集应用于所有提交,而是会调用 API 来确定适当的规则集名称。
预期结果
此增强功能旨在为监管提交实施者提供灵活且可扩展的机制,以便为给定的提交确定相应的验证规则集。
解决方案
为此,在 RegulatorySubmissionProcessorInterface 中引入一个新的受支持且可扩展的 API。此 API 允许实施者改写用于确定要验证的规则集名称的逻辑。解决方案如下:
• 主要验证方法 - 采用了新 API。
• 两个支持 API - 可被改写以自定义规则集选择和关系解析。
• 默认实施 - 用于处理常见用例,并实现向后兼容性。
解决方案元素
接下来的表格介绍解决方案元素:
|
元素
|
类型
|
说明
|
|
validateRegSubmission
|
API
|
此 API 用于验证监管提交。
|
|
getBusinessRuleSetName
|
API
|
此 API 用于检索必须用于验证提交的规则集的名称。
|
|
getBusinessRuleRelationship
|
API
|
此 API 用于确定提交的正确关系上下文。
|
默认行为
验证监管提交时,系统将使用受支持 API 的默认实施来确定适当的规则集名称。根据提交是不可修订类型还是可修订类型,行为会因具体类型而有所不同。
创建自定义类
要自定义规则集选择逻辑,可通过创建默认 RegulatorySubmissionProcessorInterface 的子类来扩展默认处理器,并改写 getBusinessRuleSetName 和 getBusinessRuleRelationship。
public class ExampleRegulatorySubmissionProcessor extends AbstractRegulatorySubmissionProcessor
{
/**
* Returns the relationship key used to lookup the correct association objects in relation to the primary business object.
* <br/><br />
* Default implementation returns "RegulatorySubmission" registered to the {@link RegMstrObjectsRelationshipDelegate} in the service xconf.
*
*
* <BR>
* <BR>
* <B>Supported API: </B>true <BR>
*
* @param submission
* - A Regulatory Submission
* @return String
*/
@Override
public String getBusinessRuleRelationship(RegulatorySubmission submission)
{
return "RegulatorySubmission";
}
/**
* Returns the rule set key for the BusinessRuleSet to validate against. Default implementation returns null.
*
* <BR>
* <BR>
* <B>Supported API: </B>true <BR>
*
* @param submission
* - A Regulatory Submission
* @return String
*/
@Override
public String getBusinessRuleSetName(RegulatorySubmission submission)
{
return null;
}
/**
* Returns a RuleValidationResultSet after validating the "Simple" or "Revision-Controlled" Regulatory Submission
* against applicable BusinessRules. BusinessRuleSet to validate against is fetched by the name returned from
* getBusinessRuleSetName(RegulatorySubmission).
*
* <BR>
* <BR>
* <B>Supported API: </B>true <BR>
*
* @param submission
* - A Regulatory Submission
* @return RuleValidationResultSet
* @throws WTException
*/
@Override
public RuleValidationResultSet validateRegSubmission(RegulatorySubmission submission,
boolean useWorkingCopy) throws WTException
{
Workable workable = null;
if (useWorkingCopy && submission instanceof Workable)
{
workable = (Workable) submission;
}
try
{
if (useWorkingCopy
&& workable != null
&& WorkInProgressHelper.isCheckedOut(workable)
&& !WorkInProgressHelper.isWorkingCopy(workable))
{
RegulatorySubmission workingCopy = (RegulatorySubmission) WorkInProgressHelper.service
.workingCopyOf(workable);
if (OwnershipHelper.isOwnedBy(workingCopy, SessionHelper.getPrincipal()))
{
submission = workingCopy;
}
}
} catch (WorkInProgressException exception)
{
// Do nothing, user does not have access to the working copy
}
String ruleName = getBusinessRuleSetName(submission);
String relationship = getBusinessRuleRelationship(submission);
if (ruleName == null || relationship == null)
{
return new RuleValidationResultSet();
}
BusinessRuleSetBean defaultBean = BusinessRuleSetBean.newBusinessRuleSetBean(ruleName, relationship);
BusinessRuleSetBean[] beans = new BusinessRuleSetBean[] { defaultBean };
RuleValidationResultSet resultSet = BusinessRulesHelper.engine.execute(submission, beans);
return resultSet;
}
}
RelationshipDelegate 示例:
public class ExampleRegMstrObjectsRelationshipDelegate implements BusinessRuleSetRelationshipDelegate
{
@SuppressWarnings("unchecked")
@Override
public WTCollection getTargetObjects(Object primaryBusinessObject) throws WTException
{
WTCollection targetObjects = new WTHashSet();
if (primaryBusinessObject instanceof RegulatorySubmission)
{
RegulatorySubmission submission = (RegulatorySubmission) primaryBusinessObject;
targetObjects.add(submission);
targetObjects.addAll(
RegulatorySubmissionHelper.service.getSubjectLinksForRegulatorySubmission(submission, false));
targetObjects.addAll(
RegulatorySubmissionHelper.service.getDriverLinksForRegulatorySubmission(submission, false));
targetObjects.addAll(TableDataHelper.getService().getTableData(submission));
}
return targetObjects;
}
}
此委派在 service.xconf 中注册,其选择器与从 getBusinessRuleRelationship(RegulatorySubmission submission) 返回的值相同,如下所示:
<!-- Configure Regulatory Submission Object Relationship Delegate -->
<Service context="default" name="com.ptc.core.businessRules.relationship.BusinessRuleSetRelationshipDelegate">
<Option
cardinality="singleton"
requestor="null"
selector="RegulatorySubmission"
serviceClass="com.ptc.qualitymanagement.regmstr.businessrules.ExampleRegMstrObjectsRelationshipDelegate"
/>
</Service>