Funciones de gestión de datos > Gestión de cambios > Administración de la gestión de cambios > Administración de reglas de asociación de cambio > Conversión de vínculos de cambio flexibles > Conversión de vínculos personalizados en vínculos de cambio flexibles
  
Conversión de vínculos personalizados en vínculos de cambio flexibles
En caso de tener objetos o vínculos de cambio personalizados, se deben seguir pasos adicionales para convertirlos en objetos de cambio flexibles:
Actualizar vínculos de proceso de cambio: solo es obligatorio en caso de tener vínculos de cambio personalizados que incluyen atributos adicionales.
Crear un delegado de convertidor para cada tipo de vínculo personalizado.
Crear un fichero de reglas de convertidor para cada tipo de vínculo personalizado.
Crear un delegado de disponibilidad personalizado: solo es obligatorio si los delegados de disponibilidad proporcionados no satisfacen los requisitos.

Actualización del vínculo de proceso de cambio
Si un vínculo personalizado tiene atributos adicionales, no se puede convertir en un vínculo de proceso de cambio.
Esta operación se puede realizar mediante la utilidad AddColumns. Para obtener más información, consulte Running the AddColumns Tool.
Consulte la siguiente sección para obtener un ejemplo de vínculo personalizado con un atributo adicional.

Delegado de convertidor para un tipo de vínculo personalizado
Este delegado permite actualizar el vínculo de proceso de cambio con cualquier valor único del vínculo heredado personalizado. Para registrar el nuevo delegado, consulte Properties and Property Files.
Windchill proporciona los siguientes registros de delegado de convertidor de vínculos:
<!-- 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>
En el ejemplo siguiente, hay un atributo adicional en el vínculo heredado personalizado que debe añadirse al vínculo de proceso de cambio. En este ejemplo se supone que ya se ha ejecutado la utilidad AddColumns.
El delegado recupera el atributo del vínculo heredado personalizado y lo añade al vínculo de proceso de cambio:
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 clase CustomLinkConverterDelegate se registraría de la siguiente manera:
<Service context="default" name="wt.change2.flexible.FlexibleChangeLinkConverterDelegate">
<Option selector="wt.change2.FormalizedBy" cardinality="singleton"
serviceClass="com.myCompany.CustomLinkConverterDelegate"
requestor="null"/>
</Service>

Ficheros de reglas de convertidor de tipos de vínculo personalizado
Los ficheros de reglas de convertidor de vínculos personalizados se deben crear para cada vínculo personalizado del sistema.
Por ejemplo, un fichero de reglas de convertidor de vínculos para com.myCompany.CustomFormalizedBy tendría el nombre y la ubicación que se indican a continuación:
<Windchill>/codebase/wt/change2/flexible/LinkConverterRule.com.myCompany.CustomFormalizedBy.csv
Para obtener más información, consulte Configuración de las reglas de convertidor de vínculos.

Delegado de disponibilidad personalizado
El delegado de disponibilidad determina si un objeto de cambio está listo para la conversión en función de los requisitos.
Windchill proporciona los siguientes delegados por defecto:
WorkflowReadinessDelegate
ResolutionDateReadinessDelegate
TerminalStateReadinessDelegate
AdministrativeLockReadinessDelegate
* 
TerminalStateReadinessDelegate no está registrado de fábrica. Para obtener más información, consulte Administración de los estados terminales para los objetos de la gestión de cambios.
Los delegados de disponibilidad por defecto determinan si un objeto de cambio está listo para la conversión. Si el objeto supera una evaluación, se considera listo para la conversión, independientemente de si provoca un fallo con otro delegado de disponibilidad.
Para cambiar este funcionamiento de un tipo de objeto de cambio, se debe llamar a la siguiente API en el objeto ReadinessInfo: setShouldContinueProcessing(). Si esta API se define en false, la utilidad detiene la verificación de otros delegados si un objeto se marca como no listo para la conversión.
Windchill proporciona los siguientes servicios para configurar los delegados de disponibilidad:
wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertLinks
wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertReplicatedLinks
Los delegados se deben registrar con un valor selector entero y único que sea mayor que cero. Cuando se registran dos o más delegados de disponibilidad, estos se utilizan en el orden de valor de selector incremental.
El servicio wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertLinks llama primero a AdministrativeLockReadinessDelegate para verificar si el objeto de cambio está bloqueado administrativamente. Si está bloqueado, el delegado devuelve un objeto ReadinessInfo que contiene los siguientes valores:
El señalizador isReady definido en false
El señalizador shouldContinueProcessing definido en false
Se dejan de realizar verificaciones del procesamiento del objeto bloqueado administrativamente actual.
Si el objeto no está bloqueado, se llama a ResolutionDateReadinessDelegate para determinar si el objeto de cambio está listo para la conversión. Si no está listo, se llama a WorkflowReadinessDelegate.
El servicio wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertReplicatedLinks no llama a AdministrativeLockReadinessDelegate.
En el siguiente ejemplo, se proporciona la configuración de delegados de disponibilidad de fábrica:
<!-- 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>
Para registrar el nuevo delegado, consulte Properties and Property Files.
El siguiente delegado de ejemplo muestra dos acciones:
Verifica que el objeto de cambio está en el estado Implementación.
Si el objeto está en el estado incorrecto, descarta los demás delegados.
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;
}
}
Para ejecutar CustomReadinessDelegate antes de los delegados de fábrica, se debe registrar con un valor selector inferior:
<Service context="default" name="wt.change2.flexible.FlexibleChangeItemReadinessDelegate">
<Option serviceClass=" com.myCompany.CustomReadinessDelegate"
selector="5"
requestor="wt.change2.FlexibleChangeItem"
cardinality="singleton"/>
</Service>