Funzionalità per la gestione dei dati > Gestione delle modifiche > Amministrazione della gestione delle modifiche > Amministrazione delle regole di associazione modifiche > Conversione dei link di modifica flessibili > Conversione di link personalizzati in link di modifica flessibili
  
Conversione di link personalizzati in link di modifica flessibili
In presenza di link o oggetti di modifica personalizzati, è necessario attenersi ai passi aggiuntivi riportati di seguito per convertirli in oggetti di modifica flessibili.
Aggiornare i link di processo di modifica - Obbligatorio solo in presenza di link di modifica personalizzati che includono attributi aggiuntivi.
Creare un delegato del convertitore per ogni tipo di link personalizzato.
Creare un file di regole del convertitore per ogni tipo di link personalizzato.
Creare un delegato di disponibilità personalizzato - Necessario solo se i delegati di disponibilità forniti non soddisfano le esigenze specifiche.

Aggiornamento del link processo di modifica
Se un link personalizzato presenta attributi aggiuntivi, non può essere convertito in un link processo di modifica.
È possibile eseguire questa operazione mediante l'utilità AddColumns. Per ulteriori informazioni, vedere Running the AddColumns Tool.
Vedere la sezione successiva per un esempio di link personalizzato con un attributo aggiuntivo.

Delegato del convertitore per il tipo di link personalizzato
Questo delegato consente di aggiornare il link di processo di modifica con uno dei valori univoci del link legacy personalizzato. Per registrare il nuovo delegato, vedere Properties and Property Files.
Windchill fornisce le registrazioni del delegato del convertitore di link riportate di seguito.
<!-- 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>
Nell'esempio riportato di seguito un attributo aggiuntivo sul link legacy personalizzato deve essere aggiunto al link processo di modifica. In questo esempio si presuppone che l'utilità AddColumns sia stata già eseguita.
Il delegato recupera l'attributo dal link legacy personalizzato e lo aggiunge al link processo di modifica.
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);
}
}
}
La classe CustomLinkConverterDelegate verrebbe registrata come segue.
<Service context="default" name="wt.change2.flexible.FlexibleChangeLinkConverterDelegate">
<Option selector="wt.change2.FormalizedBy" cardinality="singleton"
serviceClass="com.myCompany.CustomLinkConverterDelegate"
requestor="null"/>
</Service>

File di regole del convertitore del tipo di link personalizzato
I file di regole del convertitore di link personalizzati devono essere creati per ogni link personalizzato nel sistema.
Ad esempio un file di regole del convertitore di link per com.myCompany.CustomFormalizedBy si troverebbe nel percorso seguente con il nome indicato:
<Windchill>/codebase/wt/change2/flexible/LinkConverterRule.com.myCompany.CustomFormalizedBy.csv
Per ulteriori informazioni, vedere Configurazione delle regole del convertitore di link.

Delegato di disponibilità personalizzato
Il delegato di disponibilità determina se un oggetto di modifica è pronto per conversione in base ai requisiti specifici.
Windchill fornisce i delegati di default riportati di seguito.
WorkflowReadinessDelegate
ResolutionDateReadinessDelegate
TerminalStateReadinessDelegate
AdministrativeLockReadinessDelegate
* 
TerminalStateReadinessDelegate non è registrato in modo predefinito. Per ulteriori informazioni, vedere Amministrazione di stati terminali per gli oggetti di gestione modifiche.
Il delegato di disponibilità di default determina se un oggetto di modifica è pronto per la conversione. Se l'oggetto passa una valutazione, viene considerato pronto per la conversione indipendentemente dall'esito di un altro delegato di disponibilità.
Per modificare questo comportamento per un tipo di oggetto di modifica, chiamare la seguente API sull'oggetto ReadinessInfo: setShouldContinueProcessing(). Se questa API è impostata su false, l'utilità interrompe il controllo degli altri delegati se un oggetto è contrassegnato come non pronto per la conversione.
Windchill fornisce i servizi riportati di seguito per la configurazione dei delegati di disponibilità.
wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertLinks
wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertReplicatedLinks
Ogni delegato deve essere registrato con un valore selector intero univoco maggiore di zero. Quando due o più i delegati di disponibilità vengono registrati, vengono utilizzati in base all'ordine crescente del valore del selettore.
Il servizio wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertLinks chiama prima AdministrativeLockReadinessDelegate per controllare se l'oggetto di modifica è bloccato a livello amministrativo. Se è bloccato, il delegato restituisce un oggetto ReadinessInfo contenente i valori riportati di seguito.
Flag isReady impostato su false
Flag shouldContinueProcessing impostato su false
Vengono impediti ulteriori controlli di disponibilità da parte dell'elaborazione dell'oggetto corrente bloccato a livello amministrativo.
Se l'oggetto non è bloccato, viene chiamato ResolutionDateReadinessDelegate per determinare se l'oggetto di modifica è pronto per la conversione. Se non è pronto, viene chiamato WorkflowReadinessDelegate.
Il servizio wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertReplicatedLinks non chiama AdministrativeLockReadinessDelegate.
L'esempio riportato di seguito fornisce la configurazione per i delegati di disponibilità predefiniti.
<!-- 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>
Per registrare il nuovo delegato, vedere Properties and Property Files.
Il delegato di esempio riportato di seguito svolge le due azioni indicate.
Verifica se l'oggetto di modifica si trova nello stato del ciclo di vita Implementazione.
Ignora tutti gli altri delegati se l'oggetto si trova nello stato del ciclo di vita sbagliato.
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;
}
}
Per eseguire CustomReadinessDelegate prima dei delegati predefiniti, registrarlo con un valore selector più basso.
<Service context="default" name="wt.change2.flexible.FlexibleChangeItemReadinessDelegate">
<Option serviceClass=" com.myCompany.CustomReadinessDelegate"
selector="5"
requestor="wt.change2.FlexibleChangeItem"
cardinality="singleton"/>
</Service>