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 plus d'informations, consultez la rubrique 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
AdministrativeLockReadinessDelegate
* 
Le délégué TerminalStateReadinessDelegate n'est pas enregistré en standard. Pour plus d'informations, consultez la rubrique 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 services suivants pour configurer les délégués de disponibilité :
wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertLinks
wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertReplicatedLinks
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.
Le service wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertLinks appelle d'abord le délégué AdministrativeLockReadinessDelegate pour vérifier si l'objet de modification est verrouillé au niveau administratif. S'il est verrouillé, le délégué retourne un objet ReadinessInfo contenant les valeurs suivantes :
Drapeau isReady défini sur faux
Drapeau shouldContinueProcessing défini sur faux
Le traitement de l'objet actuel verrouillé au niveau administratif est arrêté à partir des vérifications de disponibilité complémentaires.
Si l'objet n'est pas verrouillé, le délégué ResolutionDateReadinessDelegate est appelé pour déterminer si l'objet de modification est prêt pour la conversion. S'il n'est pas prêt, le délégué WorkflowReadinessDelegate est appelé.
Le service wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertReplicatedLinks n'appelle pas le délégué AdministrativeLockReadinessDelegate.
L'exemple suivant fournit la configuration de délégués de disponibilité standard :
<!-- 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>
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>