Возможности управления данными > Управление изменениями > Администрирование управления изменениями > Администрирование правил связывания изменения > Преобразование гибкой связи изменения > Преобразование пользовательских связей в гибкие связи изменения
  
Преобразование пользовательских связей в гибкие связи изменения
При наличии пользовательских объектов изменения или связей необходимо выполнить дополнительные действия для их преобразования в гибкие объекты изменения.
Обновите связи процесса управления изменениями - требуется только при наличии пользовательских связей изменения, которые включают дополнительные атрибуты.
Создайте делегат преобразователя для каждого типа пользовательской связи.
Создайте файл правил преобразователя для каждого типа пользовательской связи.
Создайте пользовательский делегат готовности - требуется только в том случае, если предоставленные делегаты готовности не соответствуют требованиям.


Обновление связи процесса управления изменениями
Если пользовательская связь имеет дополнительные атрибуты, ее нельзя преобразовать в связь процесса управления изменениями.
Это можно сделать с помощью утилиты AddColumns. Дополнительные сведения см. в разделе Running the AddColumns Tool (Выполнение инструмента 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 не зарегистрирован как стандартная функция, но доступен. Дополнительные сведения см. в разделе Администрирование состояний завершения для объектов управления изменениями.
Делегаты готовности по умолчанию определяют, готов ли объект изменения к преобразованию. Если объект передает одну оценку, то этот объект считается готовым к преобразованию независимо от наличия ошибок при проверке других делегатов готовности.
Чтобы изменить это поведение для типа объекта изменения, вызовите следующий интерфейс API для объекта ReadinessInfo: 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>