数据管理功能 > 管理更改 > “更改管理”管理 > 更改关联规则管理 > 柔性更改链接转换 > 将自定义链接转换为柔性更改链接
  
将自定义链接转换为柔性更改链接
如果您具有自定义更改对象或链接,则必须执行下列附加步骤将其转换为柔性更改对象:
更新更改进程链接 - 仅当存在包括附加属性的自定义更改链接时,需要执行此操作。
为每个自定义链接类型创建转换器委派。
为每个自定义链接类型创建转换器规则文件。
创建自定义就绪委派 - 仅当所提供的就绪委派不满足您的要求时,需要执行此操作。


更新更改进程链接
如果自定义链接具有任何附加属性,则无法转换为更改进程链接。
您可以使用 AddColumns 实用程序来完成此操作。有关详细信息,请参阅运行 AddColumns 工具
有关具有其他属性的自定义链接的示例,请参阅下一部分。


自定义链接类型的转换器委派
借助此委派,您可以通过自定义旧式链接更新具有任何唯一值的更改进程链接。要注册新委派,请参阅 Properties and Property Files
Windchill 可提供以下链接转换器委派注册:
<!-- Delegates for converting legacy change link to flexible links. -->
<Service context="default" name="wt.change2.flexible.FlexibleChangeLinkConverterDelegate">
<Option selector="wt.change2.FormalizedBy" cardinality="singleton"
serviceClass="wt.change2.flexible.DefaultFlexibleChangeLinkConverterDelegate"
requestor="null"/>
<Option selector="wt.change2.AddressedBy2" cardinality="singleton"
serviceClass="wt.change2.flexible.DefaultFlexibleChangeLinkConverterDelegate"
requestor="null"/>
</Service>
在以下示例中,自定义旧式链接具有一个必须添加到更改进程链接的附加属性。本示例假定您已运行 AddColumns 实用程序。
委派将检索自定义旧式链接中的属性,然后将其添加至更改进程链接:
package com.myCompany;
public class CustomLinkConverterDelegate extends FlexibleChangeLinkConverterDelegate {
@Override
public void postStoreUpdate(WTValuedMap legacyToFlexibleLinkMap) throws WTException {
Locale locale = SessionHelper.getLocale();
//Go through individual legacy links
for(Object obj: legacyToFlexibleLinkMap.entrySet()){
WTValuedEntry entry = (WTValuedEntry) obj;
ObjectReference legacyLinkRef = (ObjectReference) entry.getKey();
ObjectReference changeProcessRef = (ObjectReference) entry.getValue();

//Get value of custom attribute
CustomFormalizedBy formalizedBy = (CustomFormalizedBy) legacyLinkRef.getObject();
String customLinkValue = formalizedBy.getValue().toString();

//Set value of attribute on Change Process Link
ChangeProcessLink changeProcessLink = (ChangeProcessLink) changeProcessRef.getObject();
PersistableAdapter perAdapter = new PersistableAdapter(changeProcessLink,null,locale,new UpdateOperationIdentifier());
perAdapter.load("CustomLinkValue");
perAdapter.set("CustomLinkValue",customLinkValue);
perAdapter.apply();
try {
changeProcessLink.getPersistInfo().setVerified(true);
} catch (WTPropertyVetoException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PersistenceHelper.manager.modify(changeProcessLink);
}
}
}
CustomLinkConverterDelegate 类的注册过程如下:
<Service context="default" name="wt.change2.flexible.FlexibleChangeLinkConverterDelegate">
<Option selector="wt.change2.FormalizedBy" cardinality="singleton"
serviceClass="com.myCompany.CustomLinkConverterDelegate"
requestor="null"/>
</Service>


自定义链接类型转换器规则文件
必须为系统中每个自定义链接创建自定义链接转换器规则文件。
例如,com.myCompany.CustomFormalizedBy 的链接转换器规则文件的位置和名称如下:
<Windchill>/codebase/wt/change2/flexible/LinkConverterRule.com.myCompany.CustomFormalizedBy.csv
有关详细信息,请参阅配置链接转换器规则


自定义就绪委派
就绪委派用于确定更改对象是否已准备就绪,可根据您的要求进行转换。
Windchill 提供了以下默认委派:
WorkflowReadinessDelegate
ResolutionDateReadinessDelegate
TerminalStateReadinessDelegate
* 
TerminalStateReadinessDelegate 虽未在出厂设置中注册,但可供使用。有关详细信息,请参阅更改管理对象的终端状态管理
默认就绪委派可确定更改对象是否处于转换就绪状态。如果对象通过一次评估,则无论该对象在另一就绪委派中是否失败,均视为该对象处于转换就绪状态。
要针对更改对象类型更改此行为,请针对 ReadinessInfo 对象调用以下 API:setShouldContinueProcessing()。如果此 API 设置为 false,则对象标记为转换未就绪时,该实用程序将停止检查其他委派。
Windchill 提供了以下更改对象就绪委派。每个委派均必须使用大于零的唯一 selector 整数值进行注册。如果注册了两个或多个就绪委派,则将按照选择器值递增的顺序使用这些委派。
对于更改对象,出厂设置注册将先调用 ResolutionDateReadinessDelegate。如果确定更改对象未处于转换就绪状态,则会调用 WorkflowReadinessDelegate
<!-- Delegates for computing readiness state for converting legacy change items.
The selector attribute must be unique and must be an integer as the delegates
are called in order based on the selector value -->
<Service context="default" name="wt.change2.flexible.FlexibleChangeItemReadinessDelegate">
<Option serviceClass="wt.change2.flexible.ResolutionDateReadinessDelegate"
selector="10"
requestor="wt.change2.FlexibleChangeItem"
cardinality="singleton"/>
<Option serviceClass="wt.change2.flexible.WorkflowReadinessDelegate"
selector="20"
requestor="wt.change2.FlexibleChangeItem"
cardinality="singleton"/>
</Service>
要注册新委派,请参阅 Properties and Property Files
以下示例委派演示了两种操作:
检查更改对象是否处于“实施”状态。
如果对象处于错误状态,则会忽略所有其他委派。
package com.myCompany;
public class CustomReadinessDelegate extends FlexibleChangeItemReadinessDelegate {

protected static final String CUSTOM_RESOURCE = CustomConverterResource.class.getName();
private static final Logger logger = Logger.getLogger(CustomReadinessDelegate.class.getName());
@Override
public WTKeyedMap determineReadiness(WTCollection changeItems) throws WTException {
WTKeyedMap changeItemToReadinessMap = new WTKeyedHashMap();
Map<FlexibleChangeItem, Boolean> shouldContinueMap = new HashMap<FlexibleChangeItem, Boolean>();
for (Object object : changeItems) {
ObjectReference changeItemRef = (ObjectReference) object;
ChangeRequest2Custom changeItem = (ChangeRequest2Custom) changeItemRef.getObject();
ReadinessInfo readinessInfo = null;
WTMessage reasonMsg;
boolean isReady = true;
boolean shouldContinue = true;
if (((VersionableChangeItem) changeItem).getState().getState() != State.toState("IMPLEMENTATION")) {
reasonMsg = new WTMessage(CUSTOM_RESOURCE, CustomConverterResource.INCORRECT_STATE,
new Object[] { FlexibleChangeConverterHelper.getDisplayIdentity(changeItem) });
isReady = false;
shouldContinue = false;
} else {
reasonMsg = new WTMessage(CUSTOM_RESOURCE, CustomConverterResource.CORRECT_STATE,
new Object[] { FlexibleChangeConverterHelper.getDisplayIdentity(changeItem) });
}
readinessInfo = new ReadinessInfo(isReady, changeItemRef, reasonMsg);
readinessInfo.setShouldContinueProcessing(shouldContinue);
changeItemToReadinessMap.put(changeItem, readinessInfo);
}
return changeItemToReadinessMap;
}
}
要在出厂设置委派前执行 CustomReadinessDelegate,请使用较小的 selector 值进行注册:
<Service context="default" name="wt.change2.flexible.FlexibleChangeItemReadinessDelegate">
<Option serviceClass=" com.myCompany.CustomReadinessDelegate"
selector="5"
requestor="wt.change2.FlexibleChangeItem"
cardinality="singleton"/>
</Service>