Hooks anpassen, um neue Servicestrukturen zu generieren oder zu regenerieren
Hintergrund
Beim Generieren oder Regenerieren einer Servicestruktur aus einer Vorlagenstruktur bestimmt die OOTB-Geschäftslogik, welche Knoten in der Vorlagenstruktur entfernt, wiederverwendet oder in die resultierende Dienststruktur kopiert werden sollten.
Die entsprechende OOTB-Geschäftslogik lautet wie folgt:
• Der Knoten wurde aus der Vorlagenstruktur entfernt.
• Der Knoten wurde aus der Vorlagenstruktur herausgefiltert.
• Der Knoten ist eine leere Gruppe oder ein leerer Abschnitt, und die Einstellung Include Empty Nodes ist auf false festgelegt.
• Die Teileliste in der Vorlagenstruktur ist leer oder wird leer, nachdem der Filter angewendet wird. Dies würde auch dazu führen, dass das Elternteil entfernt wird, wenn keine anderen Kinder vorhanden sind.
• Die Teileliste in der Vorlagenstruktur ist generisch und weist keine Teile auf, die dem Filter entsprechen. Dies würde auch dazu führen, dass das Elternteil entfernt wird, wenn keine anderen Kinder vorhanden sind.
• Wiederverwenden: Die folgenden Knotentypen aus der Vorlagenstruktur werden wiederverwendet, und es werden keine neuen Kopien in der resultierenden Servicestruktur erstellt:
◦ Informationselemente
◦ Mappen
◦ Generische Informationselemente
• Kopieren: Die folgenden Knotentypen aus der Vorlagenstruktur werden kopiert und als neue Objekte in die resultierende Servicestruktur eingefügt:
◦ Informationsgruppen
◦ Publikationsbereiche
◦ Verschachtelte Informationsstrukturen
◦ Verschachtelte Publikationsstrukturen
◦ Dynamische Dokumente – Wenn ein dynamisches Dokument kopiert wird, wird nur das Dokument selbst kopiert, und alle verknüpften dynamischen Dokumente werden wiederverwendet.
◦ Text-Informationselemente
◦ Grafische Informationselemente
Ziel
Überschreiben Sie die OOTB-Geschäftslogik, und fügen Sie benutzerdefinierte Algorithmusregeln hinzu, um zu entscheiden, ob Knoten entfernt, wiederverwendet oder kopiert werden sollen.
Lösung
Ein Anpassungs-Hook wurde erstellt, um Ihnen die Erzeugung einer eigenen Geschäftslogik zu ermöglichen und so zu entscheiden, welche Knoten entfernt, wiederverwendet oder kopiert werden sollten, wenn Sie eine Servicestruktur generieren oder regenerieren. Standardmäßig folgt dies der OOTB-Logik. Dieser Service kann von einer benutzerdefinierten Implementierung erweitert werden, um die OOTB-Geschäftslogik zu überschreiben. Die Standardschnittstelle und die öffentliche API für den Service werden unten beschrieben.
Schnittstelle
Die Schnittstelle NodeResolutionService ermöglicht den Vergleich von Knoten, um zu bestimmen, welche Knoten entfernt, wiederverwendet oder kopiert werden sollen. Sie können den Service StandardNodeResolutionService anpassen, indem Sie ihn erweitern und einen Hook für die benutzerdefinierte Implementierung des Service in der Datei wt.properties unter Verwendung des Dienstprogramms "xconfmanager" verwenden.
Es gibt zwei Methoden, die überschrieben werden können, um die benutzerdefinierten Logikimplementierungen zu ermöglichen: eine Methode zur Generierung und eine andere für die Regenerierung von Servicestrukturen. Die Methoden sind folgende:
• resolveNodeForGeneration
/**
* This method is called when processing nodes during structure generation to determine which child nodes should be copied, reused or omitted from the generated structure.
*
*@param sourceNode the child node which should be resolved
* @return A map of the nodes stored against the relevant resolution key (COPY, REUSE, REMOVE, UNRESOLVED)
*/
Map<NavigationUnit, ResolutionKey> resolveNodeForGeneration(NavigationUnit sourceNode)
• resolveNodeForRegeneration
/**
* This method is called when processing nodes during structure generation to determine which child nodes should be copied, reused or omitted from the generated structure. It is expected that this method will call the service helper methods to retrieve the child nodes for testing against custom logic
*
* @param isNew true if the node is a new source node being added to the structure
* @param sourceNodes the child nodes which should be resolved in the source structure
* @return A map of the nodes stored against the relevant resolution key (COPY, REUSE, REMOVE, UNRESOLVED)
*/
Map<NavigationUnit, ResolutionKey> resolveNodeForRegeneration(boolean isNew, NavigationUnit sourceNode)
Jeder Knoten in der Quellstruktur wird über eine NavigationUnit an die Methode übergeben, die den Knoten selbst, sein Elternteil und den UsageLink dazwischen enthält.
ResolutionKey ist eine Aufzählung, die Lösungen für Objekte identifiziert, die vom Service zurückgegeben werden. Die gültigen Schlüssel für ResolutionKey sind folgende:
• REMOVE: Liste von Knoten aus der Zielstruktur, die aus der neu generierten oder regenerierten Servicestruktur entfernt werden
• REUSE: Liste oder Bereich von neuen Knoten, die erforderlich sind, um in der Zielstruktur wiederverwendet zu werden (wie neue Informationselemente). Im Falle der Strukturregenerierung listet dieser Schlüssel nur neue Knoten oder Elemente auf, die zuvor nicht erstellt wurden, da diese standardmäßig wiederverwendet werden, es sei denn, sie werden entfernt oder kopiert.
• COPY: Liste oder Bereich der Knoten aus der Quellstruktur, die die Erstellung neuer Kopien in der Zielstruktur erfordern
• UNRESOLVED: Der Knoten wurde von der Logik des Anpassungs-Hooks nicht gelöst und muss an das System zurückgegeben werden, um von der standardmäßigen Logik gelöst zu werden.
Registrierung
1. Verwenden Sie das Dienstprogramm "xconfmanager", um site.xconf zu bearbeiten.
2. Fügen Sie die folgende Eigenschaft hinzu:
Property name=" wt.services.service.10399"
overridable="true"
targetFile="codebase/wt.properties"
value="com.ptc.arbortext.windchill.siscore.services.NodeResolutionService/<vollständig qualifizierte benutzerdefinierte Klasse"/>
<vollständig qualifizierte benutzerdefinierte Klasse> ist die vollständig qualifizierte Paketadresse, d.h. com.ptc.arbortext.sis.MyServiceImplementation.
3. Speichern Sie die Datei.
4. Übertragen Sie die Änderungen mit dem Dienstprogramm "xconfmanager". Geben Sie im Verzeichnis <Windchill>\bin den folgenden Befehl ein:
xconfmanager -pF
5. Starten Sie den Methodenserver neu.
Methoden des Hilfe-Assistenten
Einige geschützte Methoden des Hilfe-Assistenten werden bereitgestellt, die verwendet werden können, um zugehörige Knoten abzurufen und Knoten zu lösen. Diese Methoden des Hilfe-Assistenten können aus den Methoden resolveNodeForGeneration und resolveNodeForRegeneration aufgerufen werden, indem Sie ihre Parameter an die Methoden des Hilfe-Assistenten weiterleiten. Sie können auf diese Methoden des Hilfe-Assistenten in der neuen Klasse mit dem Schlüsselwort super zugreifen.
Diese Methoden des Hilfe-Assistenten geben Arrays mit Navigationseinheiten zurück, die die Beziehung zwischen dem Elternteil und dem Kind eines bestimmten Knotens in der Vorlagenstruktur darstellen. Eine Navigationseinheit enthält ein Elternteil, das Kind und die Links zwischen ihnen.
• getChildren
/**
* Retrieves an Array of Navigation units representing the relationship between the parent and child nodes
*
* @param parent the node to find the children for.
* @return the NavigationUnits containing the children.
*/
protected NavigationUnit [] getChildren(Persistable parent, boolean sourceNodes);
• getParents
/**
* Retrieves an Array of Navigation units for the nodes parent/s
*
* @param child the child node to find the parents of.
* @return the NavigationUnits containing the parents.
*/
protected NavigationUnit [] getParents(Persistable child, boolean sourceNodes);
/**
• findPreviousGeneratedTargetNode
* Attempts to retrieve a previously generated element and its parent for the given source node, N.B for IEs
* this will be a navigation unit containing itself since it would have been reused on any previous generation.
*
* @param sourceUnit The source element to find the target node for.
* @return The target navigation unit containing the previously generated element (or itself if an IE) as the end node
*/
protected NavigationUnit findPreviousGeneratedTargetNode(NavigationUnit sourceUnit) {
• getGeneratedPartList
/**
* Checks if the PartList param was resolved by the partlist service i.e. has changes and/or contains parts
*
* @param pList The part list to locate the generated part list for.
* @return a generated partlist, the same partlist (if reused) or null if the partlist was not resolved (is empty/filtered)
*/
protected PartList getGeneratedPartList(PartList pList)
• Externe Methode des Hilfe-Assistenten: SisCoreHelper.getContentFromHolders(holders);
getContentFromHolders
/**
* A multi object api version of getContentFromHolder to reduce number of jdbc calls.
*
* @param holders
* A WTCollection of content holders.
* @return
*/ A WTKeyedMap of content holders to a WTCollection of content.
public static WTKeyedMap getContentFromHolders(WTCollection holders);