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
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
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 delegati di disponibilità dell'oggetto di modifica riportati di seguito. 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.
Le registrazioni predefinite chiamano prima ResolutionDateReadinessDelegate per un oggetto di modifica. Se stabilisce che l'oggetto di modifica non è pronto per conversione, viene chiamato 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>
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>