데이터 관리 기능 > 변경 관리하기 > 변경 관리의 관리 > 변경 연관 규칙 관리 > 유동 변경 링크 변환 > 사용자 정의 링크를 유동 변경 링크로 변환
  
사용자 정의 링크를 유동 변경 링크로 변환
사용자 정의 변경 객체 또는 링크가 있는 경우 유동 변경 객체로 변환하려면 다음과 같은 추가 단계를 따라야 합니다.
변경 프로세스 링크 업데이트 - 추가 속성이 포함된 사용자 정의 변경 링크가 있는 경우에만 필요합니다.
각 사용자 정의 링크 유형에 대해 변환기 위임을 작성합니다.
각 사용자 정의 링크 유형에 대해 변환기 규칙 파일을 작성합니다.
사용자 정의 준비 위임 작성 - 제공된 준비 위임이 요구 사항을 충족하지 않는 경우에만 필요합니다.

변경 프로세스 링크 업데이트
사용자 정의 링크에 추가 속성이 있는 경우 해당 링크가 변경 프로세스 링크로 변환될 수 없습니다.
AddColumns 유틸리티를 사용하여 이 작업을 수행할 수 있습니다. 자세한 내용은 Running the AddColumns Tool을 참조하십시오.
추가 속성이 있는 사용자 정의 링크의 예는 다음 단원을 참조하십시오.

사용자 정의 링크 유형에 대한 변환기 위임
이 위임을 통해 사용자 정의 레거시 링크에서 고유한 값이 있는 변경 프로세스 링크를 업데이트할 수 있습니다. 새 위임을 등록하려면 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 객체의 setShouldContinueProcessing() API를 호출합니다. 이 API가 false로 설정되면 유틸리티는 다른 위임에서 객체가 변환할 준비가 되지 않음으로 표시되었는지 여부를 확인하는 작업을 중지합니다.
Windchill은 준비 위임을 구성하기 위해 다음 서비스를 제공합니다.
wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertLinks
wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertReplicatedLinks
각 위임은 0보다 큰 고유한 selector 정수 값으로 등록되어야 합니다. 준비 위임이 둘 이상 등록된 경우 해당 위임은 선택기 값이 증가하는 순서로 사용됩니다.
wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertLinks 서비스는 AdministrativeLockReadinessDelegate를 호출하여 먼저 변경 객체가 관리 잠금되어 있는지를 확인합니다. 잠긴 경우 위임에서는 다음 값이 포함된 ReadinessInfo 객체를 반환합니다.
false로 설정된 isReady 플래그
false로 설정된 shouldContinueProcessing 플래그
추가 준비 확인에서 현재 관리 잠금되어 있는 객체의 처리가 중지됩니다.
객체가 잠기지 않은 경우 변경 객체를 변환할 준비가 되었는지를 확인하기 위해 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>