承認申請検証用の規則セット選択のカスタマイズ
このトピックでは、承認申請の検証時に使用される規則セット名を動的に決定する、サポート対象かつカスタマイズ可能な API を設定する方法について説明します。
つまり、すべてのサブミットに固定の規則セットを適用するのではなく、API を呼び出して適切な規則セット名を決定します。
予測される結果
この機能強化の目標は、特定の承認申請に対して適切な検証規則セットを決定するためのフレキシブルかつ拡張可能なメカニズムを承認申請のインプリメンターに提供することです。
ソリューション
これを実現するために、サポート対象かつ拡張可能な新しい API が RegulatorySubmissionProcessorInterface に導入されました。この API を使用すると、インプリメンターは、検証用の規則セット名を決定するために使用されるロジックをオーバーライドできます。このソリューションには以下が含まれます。
新しい API を使用するプライマリ検証方法
規則セットの選択と関係の解決をカスタマイズするためにオーバーライド可能な 2 つのサポート API
一般的なユースケースを処理し、下位互換性を確保するデフォルトの実装
ソリューションエレメント
次のテーブルで、ソリューションエレメントについて説明します。
エレメント
タイプ
説明
validateRegSubmission
API
この API は、承認申請の検証に使用されます。
getBusinessRuleSetName
API
この API は、申請の検証に使用する必要がある規則セットの名前を取得するために使用されます。
getBusinessRuleRelationship
API
この API は、申請の正しい関係コンテキストを決定するために使用されます。
デフォルトの動作
承認申請の検証時に、サポートされている API のデフォルトの実装を使用して、適切な規則セット名が決定されます。この動作は、申請が改訂不可能タイプであるか改訂可能タイプであるかによって異なります。
カスタムクラスの作成
規則セットの選択ロジックをカスタマイズするには、デフォルトの RegulatorySubmissionProcessorInterface のサブクラスを作成してデフォルトプロセッサを拡張し、getBusinessRuleSetNamegetBusinessRuleRelationship をオーバーライドします。
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>
これは役に立ちましたか?