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

更新更改进程链接
如果自定义链接具有任何附加属性,则无法转换为更改进程链接。
您可以使用 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
AdministrativeLockReadinessDelegate
* 
TerminalStateReadinessDelegate 不是注册的出厂设置。有关详细信息,请参阅更改管理对象的终端状态管理
默认就绪委派可确定更改对象是否处于转换就绪状态。如果对象通过一次评估,则无论该对象在另一就绪委派中是否失败,均视为该对象处于转换就绪状态。
要针对更改对象类型更改此行为,请针对 ReadinessInfo 对象调用以下 API:setShouldContinueProcessing()。如果此 API 设置为 false,则对象标记为转换未就绪时,该实用程序将停止检查其他委派。
Windchill 提供以下服务来配置就绪委派:
wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertLinks
wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertReplicatedLinks
每个委派均必须使用大于零的唯一 selector 整数值进行注册。如果注册了两个或多个就绪委派,则将按照选择器值递增的顺序使用这些委派。
wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertLinks 服务会首先调用 AdministrativeLockReadinessDelegate 以检查更改对象是否已管理锁定。如果已锁定,则委派将返回包含以下值的 ReadinessInfo 对象:
isReady 标志设置为 false
shouldContinueProcessing 标志设置为 false
将阻止当前已管理锁定的对象处理执行进一步的就绪检查。
如果对象未锁定,则将调用 ResolutionDateReadinessDelegate 以确定更改对象是否已做好转换准备。如果未准备就绪,则将调用 WorkflowReadinessDelegate
wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertReplicatedLinks 服务不会调用 AdministrativeLockReadinessDelegate
以下示例提供了出厂设置就绪委派的配置:
<!-- Delegates for computing readiness state for converting legacy change items.
The selector attribute must be unique and must be an integer because the delegates
are called in a particular order which is based on the selector value. -->
<Service context="default" name="wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertLinks">
<Option serviceClass="wt.change2.flexible.AdministrativeLockReadinessDelegate"
selector="10"
requestor="wt.change2.FlexibleChangeItem"
cardinality="singleton"/>
<Option serviceClass="wt.change2.flexible.ResolutionDateReadinessDelegate"
selector="20"
requestor="wt.change2.FlexibleChangeItem"
cardinality="singleton"/>
<Option serviceClass="wt.change2.flexible.WorkflowReadinessDelegate"
selector="30"
requestor="wt.change2.FlexibleChangeItem"
cardinality="singleton"/>
</Service>
<Service context="default" name="wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertReplicatedLinks">
<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>