Datenverwaltungsfunktionen > Änderungen verwalten > Änderungsmanagementverwaltung > Verwaltung von Änderungszuordnungsregeln > Konvertierung flexibler Änderungs-Links > Benutzerdefinierte Links in flexible Änderungs-Links konvertieren
  
Benutzerdefinierte Links in flexible Änderungs-Links konvertieren
Wenn Sie benutzerdefinierte Änderungsobjekte oder Links verwenden, müssen Sie zusätzliche Schritte zum Konvertieren in flexible Änderungsobjekte durchführen:
Änderungsprozess-Links aktualisieren: nur erforderlich, wenn Sie benutzerdefinierte Änderungs-Links mit zusätzlichen Attributen verwenden.
Konvertierer-Delegate für jeden benutzerdefinierten Link-Typ erstellen
Konvertierer-Regeldatei für jeden benutzerdefinierten Link-Typ erstellen
Benutzerdefinierten Bereitschafts-Delegate erstellen: nur erforderlich, wenn die angegebenen Bereitschafts-Delegates Ihre Anforderungen nicht erfüllen

Änderungsprozess-Link aktualisieren
Wenn ein benutzerdefinierter Link zusätzliche Attribute aufweist, kann er nicht in einen Änderungsprozess-Link konvertiert werden.
Sie können dazu das Dienstprogramm "AddColumns" verwenden. Weitere Informationen finden Sie unter Running the AddColumns Tool.
Im nächsten Abschnitt finden Sie ein Beispiel eines benutzerdefinierten Links mit einem zusätzlichen Attribut.

Konvertierer-Delegate für benutzerdefinierten Link-Typ
Dieser Delegate ermöglicht es Ihnen, den Änderungsprozess-Link mit allen eindeutigen Werten aus dem benutzerdefinierten Legacy-Link zu aktualisieren. Um Ihren neuen Delegate zu registrieren, informieren Sie sich unter Properties and Property Files.
Windchill bietet die folgenden Registrierungen für Link-Konvertierer-Delegates:
<!-- 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>
Im folgenden Beispiel ist ein zusätzliches Attribut im benutzerdefinierten Legacy-Link vorhanden, das dem Änderungsprozess-Link hinzugefügt werden muss. In diesem Beispiel wird davon ausgegangen, dass Sie bereits das Dienstprogramm "AddColumns" ausgeführt haben.
Der Delegate ruft das Attribut aus dem benutzerdefinierten Legacy-Link ab und fügt es dem Änderungsprozess-Link hinzu:
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);
}
}
}
Die Klasse CustomLinkConverterDelegate würde wie folgt registriert:
<Service context="default" name="wt.change2.flexible.FlexibleChangeLinkConverterDelegate">
<Option selector="wt.change2.FormalizedBy" cardinality="singleton"
serviceClass="com.myCompany.CustomLinkConverterDelegate"
requestor="null"/>
</Service>

Benutzerdefinierte Regeldateien für Link-Typ-Konvertierer
Benutzerdefinierte Regeldateien für Link-Konvertierer müssen für jeden benutzerdefinierten Link im System erstellt werden.
Beispielsweise würde eine Regeldatei für den Link-Konvertierer für com.myCompany.CustomFormalizedBy wie folgt abgelegt und benannt:
<Windchill>/codebase/wt/change2/flexible/LinkConverterRule.com.myCompany.CustomFormalizedBy.csv
Weitere Informationen finden Sie unter Link-Konvertierer-Regeln konfigurieren.

Benutzerdefinierter Bereitschafts-Delegate
Der Bereitschafts-Delegate bestimmt, ob ein Änderungsobjekt für die Konvertierung auf Grundlage Ihrer Anforderungen bereit ist.
Windchill bietet die folgenden Standard-Delegates:
WorkflowReadinessDelegate
ResolutionDateReadinessDelegate
TerminalStateReadinessDelegate
AdministrativeLockReadinessDelegate
* 
TerminalStateReadinessDelegate ist nicht standardmäßig registriert. Weitere Informationen finden Sie unter Verwaltung von abschließenden Status für Änderungsmanagement-Objekte.
Die standardmäßigen Bereitschafts-Delegates bestimmen, ob ein Änderungsobjekt für die Konvertierung bereit ist. Wenn das Objekt eine Auswertung erfolgreich durchläuft, wird das Objekt als für die Konvertierung bereit betrachtet, unabhängig davon, ob es bei einem anderen Bereitschafts-Delegate fehlschlägt.
Um dieses Verhalten für einen Änderungsobjekttyp zu ändern, rufen Sie die folgende API für das Objekt "ReadinessInfo" auf: setShouldContinueProcessing(). Wenn diese API auf false festgelegt ist, prüft das Dienstprogramm andere Delegates nicht weiter, wenn ein Objekt als nicht bereit für die Konvertierung gekennzeichnet ist.
Windchill bietet die folgenden Dienste zum Konfigurieren der Bereitschafts-Delegates:
wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertLinks
wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertReplicatedLinks
Jeder Delegate muss mit einem eindeutigen selector-Ganzzahlwert registriert werden, der größer als 0 ist. Wenn zwei oder mehr Bereitschafts-Delegates registriert sind, werden sie aufsteigend in der Reihenfolge des Selektorwerts verwendet.
Der Dienst wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertLinks ruft zuerst AdministrativeLockReadinessDelegate auf, um zu prüfen, ob das Änderungsobjekt vom Administrator gesperrt ist. Wenn es gesperrt ist, gibt der Delegate ein ReadinessInfo-Objekt mit den folgenden Werten zurück:
isReady-Flag festgelegt auf "false"
shouldContinueProcessing-Flag festgelegt auf "false"
Die Verarbeitung des aktuellen vom Administrator gesperrten Objekts wird für weitere Bereitschaftsprüfungen gestoppt.
Wenn das Objekt nicht gesperrt ist, wird ResolutionDateReadinessDelegate aufgerufen, um zu bestimmen, ob das Änderungsobjekt für die Konvertierung bereit ist. Wenn es nicht bereit ist, wird WorkflowReadinessDelegate aufgerufen.
Der Dienst wt.change2.flexible.FlexibleChangeItemReadinessDelegate.convertReplicatedLinks ruft AdministrativeLockReadinessDelegate nicht auf.
Das folgende Beispiel enthält die Konfiguration für standardmäßige Bereitschafts-Delegates:
<!-- 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>
Um Ihren neuen Delegate zu registrieren, informieren Sie sich unter Properties and Property Files.
Der folgende Beispiel-Delegate veranschaulicht zwei Aktionen:
Prüft, ob das Änderungsobjekt sich im Status Implementierung befindet.
Missachtet alle anderen Delegates, wenn sich das Objekt im falschen Status befindet.
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;
}
}
Um CustomReadinessDelegate vor den standardmäßigen Delegates auszuführen, registrieren Sie ihn mit einem niedrigeren selector-Wert:
<Service context="default" name="wt.change2.flexible.FlexibleChangeItemReadinessDelegate">
<Option serviceClass=" com.myCompany.CustomReadinessDelegate"
selector="5"
requestor="wt.change2.FlexibleChangeItem"
cardinality="singleton"/>
</Service>