Personalizzazione dell'hook per generare o rigenerare una nuova struttura ricambi
Background
Quando si genera o si rigenera una struttura ricambi da una struttura modello, la logica aziendale di default determina quali nodi nella struttura modello devono essere rimossi, riutilizzati o copiati nella struttura ricambi risultante. Di seguito è riportata la logica aziendale di default per determinare la rimozione, il riutilizzo o la copia dei nodi.
• Quando si genera o si rigenera una struttura ricambi da una struttura modello, la logica aziendale di default determina quali nodi nella struttura modello devono essere rimossi, riutilizzati o copiati nella struttura ricambi risultante. Di seguito è riportata la logica aziendale di default per determinare la rimozione, il riutilizzo o la copia dei nodi.
◦ Il nodo è stato rimosso dalla struttura modello.
◦ Il nodo è stato escluso dalla struttura modello.
◦ Il nodo è una sezione o un gruppo vuoto e la preferenza "Include Empty Nodes" è impostata su false.
◦ L'elenco parti nella struttura modello è vuoto o lo sarebbe in seguito all'applicazione del filtro. Il relativo elemento padre verrebbe inoltre rimosso se privo di altri elementi di pari livello.
◦ L'elenco parti nella struttura modello è generico e non include parti realmente corrispondenti al filtro. Il relativo elemento padre verrebbe inoltre rimosso se privo di altri elementi di pari livello.
• Riutilizza - I tipi di nodi elencati di seguito vengono riutilizzati dalla struttura modello e non vengono create nuove copie nella struttura ricambi risultante.
◦ Elementi informativi
◦ Contenitori
◦ Elementi informativi generici
• Copia - I tipi di nodi elencati di seguito vengono copiati dalla struttura modello e inseriti come nuovi oggetti nella struttura ricambi risultante.
◦ Gruppi di informazioni
◦ Sezioni pubblicazione
◦ Strutture di informazioni annidate
◦ Strutture di pubblicazione annidate
Obiettivo
Sovrascrivere la logica aziendale di default e aggiungere regole di algoritmo personalizzate per decidere se rimuovere, riutilizzare o copiare i nodi.
Soluzione
È stato creato un hook di personalizzazione per consentire la creazione di una logica aziendale personalizzata con cui decidere quali nodi rimuovere, riutilizzare o copiare quando si genera o si rigenera una struttura ricambi. Per default, tale logica segue quella di default. Il servizio può essere esteso mediante un'implementazione personalizzata in modo da ignorare la logica aziendale di default. Di seguito sono descritte l'interfaccia di default e l'API pubblica del servizio.
Interfaccia
L'interfaccia NodeResolutionService consente il confronto dei nodi allo scopo di stabilire quali nodi rimuovere, riutilizzare o copiare. È possibile personalizzare il servizio StandardNodeResolutionService estendendolo e definendo un hook per l'implementazione personalizzata del servizio nel file wt.properties mediante l'utilità xconfmanager.
È possibile ignorare due metodi per consentire le implementazioni personalizzate della logica, ovvero un metodo per la generazione e un altro per la rigenerazione delle strutture ricambi. I metodi sono riportati di seguito.
• 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)
Ogni nodo nella struttura di origine viene trasmesso al metodo tramite NavigationUnit, che contiene il nodo stesso, il rispettivo padre e UsageLink tra i due elementi.
ResolutionKey è un'enumerazione che identifica le risoluzioni per gli oggetti restituiti dal servizio. Le chiavi valide per ResolutionKey sono riportate di seguito.
• REMOVE - Elenco di nodi per la struttura di destinazione che verranno rimossi dalla struttura ricambi appena generata o rigenerata.
• REUSE - Elenco o intervallo di nuovi nodi che è necessario riutilizzare nella struttura di destinazione, ad esempio nuovi elementi informativi. In caso di rigenerazione della struttura, questa chiave elenca solo i nuovi nodi o elementi che non sono stati generati in precedenza in quanto verranno riutilizzati per default, a meno che non vengano identificati per la rimozione o la copia.
• COPY - Elenco o intervallo di nodi della struttura di origine che richiedono la creazione di nuove copie nella struttura di destinazione.
• UNRESOLVED- Il nodo non è stato risolto dalla logica dell'hook di personalizzazione e deve essere restituito al sistema per poter essere risolto mediante la logica di default.
Registro
2. Aggiungere la proprietà riportata di seguito.
Property name=" wt.services.service.10399"
overridable="true"
targetFile="codebase/wt.properties"
value="com.ptc.arbortext.windchill.siscore.services.NodeResolutionService/<classe personalizzata completa"/>
dove <classe personalizzata completa> è l'indirizzo del package completo, ovvero com.ptc.arbortext.sis.MyServiceImplementation.
3. Salvare il file.
4. Propagare le modifiche utilizzando l'utilità xconfmanager. Dalla directory <Windchill>\bin, immettere il comando indicato di seguito.
xconfmanager -pF
5. Riavviare il method server.
Metodi di supporto
Sono disponibili alcuni metodi di supporto protetti, utilizzabili per recuperare i nodi correlati ed eseguire la risoluzione dei nodi. Tali metodi possono essere chiamati dai metodi resolveNodeForGeneration e resolveNodeForRegeneration passandone i parametri ai metodi di supporto. È possibile accedere ai metodi di supporto nella nuova classe utilizzando la parola chiave super.
I metodi di supporto restituiscono matrici di unità di navigazione che rappresentano la relazione tra l'elemento padre e l'elemento figlio di un determinato nodo nella struttura modello. Un'unità di navigazione contiene un elemento padre, l'elemento figlio e i link tra questi elementi.
• 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)
• Metodo di supporto esterno: 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);