Personnalisation du hook pour générer ou régénérer une nouvelle structure de service
Arrière-plan
Lorsque vous générez ou régénérez une structure de service à partir d'une structure de modèle, la logique métier prête à l'emploi identifie les noeuds de la structure de modèle à supprimer, à réutiliser ou à copier sur la structure de service résultante.
La logique métier prête à l'emploi utilisée pour déterminer la suppression, la réutilisation ou la copie des noeuds se présente comme suit :
• Le noeud a été supprimé de la structure de modèle.
• Le noeud a été extrait de la structure de modèle.
• Le noeud est un groupe ou une section vide, et la préférence Include Empty Nodes est définie sur false.
• La liste d'articles de la structure de modèle est vide ou serait vide une fois le filtre appliqué. Dès lors, son parent sera supprimé si elle ne possède aucun frère.
• La liste d'articles de la structure de modèle est générique et ne comporte aucun article satisfaisant les critères du filtre. Dès lors, son parent sera supprimé si elle ne possède aucun frère.
• Réutiliser : les types de noeuds suivants sont réutilisés à partir de la structure de modèle et aucune nouvelle copie n'est effectuée dans la structure de service résultante :
◦ Eléments d'informations
◦ Conteneurs
◦ Eléments d'informations génériques
• Copier : les types de noeuds suivants sont copiés à partir de la structure de modèle et insérés en tant que nouveaux objets dans la structure de service résultante :
◦ Groupes d'information
◦ Sections de publication
◦ Structures d'information imbriquées
◦ Structures de publication imbriquées
◦ Documents dynamiques : lorsqu'un document dynamique est copié, seul le document lui-même est copié et tous les documents dynamiques liés sont réutilisés.
◦ Eléments d'information texte
◦ Eléments d'informations graphique
Objectif
Remplacez la logique métier prête à l'emploi et ajoutez des règles d'algorithme personnalisées pour déterminer si des noeuds doivent être supprimés, réutilisés ou copiés.
Solution
Un hook de personnalisation a été créé. Dès lors, vous pouvez générer votre propre logique métier afin de déterminer les noeuds à supprimer, à réutiliser ou à copier lors de la génération ou de la régénération d'une structure de service. Par défaut, la logique prête à l'emploi est suivie. Ce service peut être étendu par une implémentation personnalisée remplaçant la logique métier prête à l'emploi. L'interface par défaut et l'API publique pour le service sont décrites ci-dessous.
Interface
L'interface NodeResolutionService prend en charge la comparaison des noeuds, utilisée pour identifier les noeuds à supprimer, à réutiliser ou à copier. Vous pouvez personnaliser le service StandardNodeResolutionService en l'étendant et un intégrant l'implémentation personnalisée du service dans le fichier wt.properties à l'aide de l'utilitaire xconfmanager.
Deux méthodes peuvent être remplacées pour prendre en charge les implémentations logiques personnalisées, l'une pour la génération et l'autre pour la régénération des structures de service. Les méthodes sont les suivantes :
• 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)
Chaque noeud de la structure source est transmis à la méthode via une NavigationUnit, qui contient le noeud, son parent et le UsageLink intermédiaire.
ResolutionKey est une énumération identifiant les résolutions pour les objets renvoyés du service. Les clés valides pour ResolutionKey sont les suivantes :
• REMOVE : liste des noeuds de la structure cible qui seront supprimés de la structure de service générée ou régénérée.
• REUSE : liste ou plage de nouveaux noeuds à réutiliser dans la structure cible, comme des nouveaux éléments d'informations. En cas de régénération de structure, cette clé répertorie uniquement les noeuds ou les éléments non générés auparavant, dans la mesure où ils seront réutilisés par défaut, sauf s'ils sont identifiés pour la suppression ou la copie.
• COPY : liste ou plage des noeuds de la structure source qui nécessitent la création de copies associées dans la structure cible.
• UNRESOLVED : le noeud n'a pas été résolu par la logique du hook personnalisé ; il est renvoyé au système pour résolution par la logique prête à l'emploi.
Registre
1. L'utilitaire xconfmanager permet de modifier site.xconf.
2. Ajoutez la propriété suivante :
Property name=" wt.services.service.10399"
overridable="true"
targetFile="codebase/wt.properties"
value="com.ptc.arbortext.windchill.siscore.services.NodeResolutionService/<classe personnalisée complète"/>
où, <classe personnalisée complète> est l'adresse complète du lot, à savoir com.ptc.arbortext.sis.MyServiceImplementation.
3. Enregistrez le fichier.
4. Propagez vos modifications à l'aide de l'utilitaire xconfmanager. A partir du répertoire <Windchill>\bin, entrez la commande suivante :
xconfmanager -pF
5. Redémarrez le serveur de méthodes.
Méthodes d'assistance
Certaines méthodes d'assistance protégées disponibles permettent de récupérer les noeuds associées et contribuent à la résolution des noeuds. Ces méthodes d'assistance peuvent être appelées à partir des méthodes resolveNodeForGeneration et resolveNodeForRegeneration ; les paramètres de ces dernières sont transmis. Pour accéder à ces méthodes d'assistance dans la nouvelle classe, utilisez le mot-clé super.
Ces méthodes d'assistance renvoient des baies d'unités de navigations représentant la relation existant entre les parents et l'enfant dans un noeud donné de la structure de modèle. Une unité de navigation contient un parent, l'enfant et les liens établis entre eux.
• 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)
• Méthode d'assistance externe : 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);