Fonctionnalités de gestion des données > Gestion des modifications > Administration de la gestion des modifications > Administration des règles d'association de modifications > Conversion des liens de modification flexibles > Convertir les liens personnalisés en liens de modification flexibles
  
Convertir les liens personnalisés en liens de modification flexibles
Si vous disposez d'objets ou de liens personnalisés de modification, exécutez la procédure suivante pour les convertir en objets de modification flexibles :
Mettez à jour les liens de processus de modification : action requise uniquement si vous disposez de liens de modification personnalisés incluant des attributs supplémentaires.
Créez un délégué de convertisseur pour chaque type de lien personnalisé.
Créez un fichier de règles de convertisseur pour chaque type de lien personnalisé.
Créez un délégué de disponibilité personnalisé : action requise uniquement si les délégués de disponibilité fournis ne satisfont pas vos exigences.


Mettre à jour le lien de processus de modification
Si un lien personnalisé possède des attributs supplémentaires, il ne peut pas être converti en lien de processus de modification.
Pour ce faire, recourez à l'utilitaire AddColumns. Pour en savoir plus, consultez la rubrique Running the AddColumns Tool.
Consultez la section suivante pour découvrir un exemple de lien personnalisé avec un attribut supplémentaire.


Délégué de convertisseur pour chaque type de lien personnalisé
Ce délégué permet de mettre à jour le lien du processus de modification avec les valeurs uniques du lien personnalisé hérité. Pour enregistrer votre nouveau délégué, consultez la rubrique Properties and Property Files.
Windchill fournit les enregistrements suivants de délégué de convertisseur de lien :
<!-- 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>
Dans l'exemple suivant, un attribut supplémentaire du lien personnalisé hérité doit être ajouté au lien de processus de modification. Cet exemple suppose que vous avez déjà exécuté l'utilitaire AddColums.
Le délégué récupère l'attribut du lien personnalisé hérité et l'ajoute au lien de processus de modification :
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 sera enregistrée comme suit :
<Service context="default" name="wt.change2.flexible.FlexibleChangeLinkConverterDelegate">
<Option selector="wt.change2.FormalizedBy" cardinality="singleton"
serviceClass="com.myCompany.CustomLinkConverterDelegate"
requestor="null"/>
</Service>


Fichiers de règles de convertisseur pour chaque type de lien personnalisé
Des fichiers de règles de convertisseur de lien personnalisé doivent être créés pour chaque lien personnalisé du système.
Par exemple, un fichier de règles de convertisseur de lien pour com.myCompany.CustomFormalizedBy sera stocké et désigné comme suit :
<Windchill>/codebase/wt/change2/flexible/LinkConverterRule.com.myCompany.CustomFormalizedBy.csv
Pour en savoir plus, voir Configurer les règles de convertisseur de lien.


Délégué de disponibilité personnalisé
Le délégué de disponibilité détermine si un objet de modification est prêt pour la conversion, en fonction de vos exigences.
Windchill fournit les délégués par défaut suivants :
WorkflowReadinessDelegate
ResolutionDateReadinessDelegate
TerminalStateReadinessDelegate
* 
Le TerminalStateReadinessDelegate n'est pas enregistré en standard, mais il est disponible. Pour en savoir plus, voir Administration des états Terminal des objets de gestion des modifications.
Le délégué de disponibilité par défaut détermine si un objet de modification est prêt pour la conversion. Tout objet satisfaisant une évaluation est considéré prêt pour la conversion, même s'il échoue à l'évaluation d'un autre délégué de disponibilité.
Pour modifier ce comportement pour un type spécifique d'objet de modification, appelez l'API suivante sur l'objet ReadinessInfo : setShouldContinueProcessing() Si cette API est définie sur false, l'utilitaire arrête de vérifier les autres délégués si un objet n'est pas considéré comme prêt pour la conversion.
Windchill fournit les délégués suivants de disponibilité d'objet de modification. Chaque délégué doit être enregistré avec une valeur entière unique de selector supérieure à zéro. Lorsque plusieurs délégués sont enregistrés, ils sont utilisés par valeur croissante de sélecteur.
Les enregistrements standard commencent par appeler le ResolutionDateReadinessDelegate pour un objet de modification. S'il détermine que l'objet de modification n'est pas prêt pour la conversion, alors le WorkflowReadinessDelegate est appelé :
<!-- 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>
Pour enregistrer votre nouveau délégué, consultez la rubrique Properties and Property Files.
L'exemple de délégué suivant exécute deux actions :
Vérifie si l'objet de modification présente l'état Implémentation.
Ignore les autres délégués si l'objet présente un état inapproprié.
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;
}
}
Pour exécuter le CustomReadinessDelegate avant les délégués standard, enregistrez-le avec une valeur de selector inférieure :
<Service context="default" name="wt.change2.flexible.FlexibleChangeItemReadinessDelegate">
<Option serviceClass=" com.myCompany.CustomReadinessDelegate"
selector="5"
requestor="wt.change2.FlexibleChangeItem"
cardinality="singleton"/>
</Service>