自訂勾點以產生或再生新服務結構
背景
透過範本結構產生或再生服務結構時,OOTB 企業邏輯會決定範本結構中的哪些節點應移除、重新使用,或複製到產生的服務結構。
用於確定將移除、重新使用還是複製節點的 OOTB 企業邏輯如下所示︰
• 節點已從範本結構中移除。
• 節點已從範本結構中篩選出來。
• 節點是空白群組或部份,且 Include Empty Nodes 偏好設定設為 false。
• 範本結構中的零件清單為空,或在套用篩選器之後將變為空的。如果不存在其他同等項目,這也會導致其父項被移除。
• 範本結構中的零件清單為泛型,且沒有符合此篩選器的真實零件。如果不存在其他同等項目,這也會導致其父項被移除。
• 重新使用 - 會透過範本結構重新使用下列類型的節點,且不會在產生的服務結構中產生新副本:
◦ 資訊元素
◦ 內容持有者
◦ 泛用資訊元素
• 複製 - 下列類型的節點會從範本結構中複製,並作為新物件插入產生的服務結構中︰
◦ 資訊群組
◦ 發佈部份
◦ 巢狀資訊結構
◦ 巢狀發佈結構
◦ 動態文件 - 複製動態文件時,只會複製文件本身,並會重複使用任何連結的動態文件。
◦ 文字資訊元素
◦ 圖形資訊元素
目標
重新定義 OOTB 企業邏輯並新增自訂演算法規則,來決定是否應移除、重新使用或複製節點。
解決方案
已建立自訂勾點,可讓您建立自己的企業邏輯,來決定產生或再生服務結構時應移除、重新使用或複製哪些節點。依預設,自訂勾點會遵循 OOTB 邏輯。此服務可透過自訂實行延伸,以重新定義 OOTB 企業邏輯。服務的預設介面與公用 API 如下所述。
介面
NodeResolutionService 介面可讓您對節點進行比較,以便決定應移除、重新使用或複製哪些節點。您可以自訂 StandardNodeResolutionService 服務,方法是使用 xconfmanager 公用程式延伸服務,並在 wt.properties 檔案中掛接服務的自訂實行。
欲允許自訂邏輯實行,可對兩種方法進行重新定義,其中一種方法用於產生服務結構,而另一種用於再生服務結構。方法如下︰
• 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)
來源結構中的每個節點都會透過 NavigationUnit (包含節點本身、其父項以及它們之間的 UsageLink) 傳遞至方法。
ResolutionKey 是一個列舉,可識別從服務傳回之物件的解決方案。ResolutionKey 的有效金鑰如下所示︰
• REMOVE - 將從新產生或再生服務結構移除之目標結構中的節點清單。
• REUSE - 需要在目標結構 (例如新「資訊元素」) 中重新使用之新節點的清單或範圍。結構再生的情況下,此金鑰只會列出先前未產生的新節點或元素,因為除非將這些項目識別為移除或複製,否則預設會重新使用這些項目。
• COPY - 需要在目標結構中為節點建立新副本之來源結構中的節點清單或範圍。
• UNRESOLVED - 節點尚未由自訂勾點邏輯解析,並且會傳回系統由 OOTB 邏輯解析。
登錄
2. 新增下列內容:
Property name=" wt.services.service.10399"
overridable="true"
targetFile="codebase/wt.properties"
value="com.ptc.arbortext.windchill.siscore.services.NodeResolutionService/<完全合格的自訂類別"/>
其中,<完全合格的自訂類別> 是完全合格的封裝位址,即 com.ptc.arbortext.sis.MyServiceImplementation。
3. 儲存檔案。
4. 使用 xconfmanager 公用程式傳播變更。從 <Windchill>\bin 目錄中輸入下列指令:
xconfmanager -pF
5. 重新啟動應用伺服器。
Helper 方法
系統提供了一些受保護的 Helper 方法,可用來擷取相關節點並協助解析節點。這些 Helper 方法可從 resolveNodeForGeneration 與 resolveNodeForRegeneration 方法中調用,並且可透過將其參數傳遞至 Helper 方法來實現。您可以使用 super 關鍵字在新類別中存取這些 Helper 方法。
這些 Helper 方法會傳回表示範本結構中指定節點之父項與子項之間關係的導覽單位陣列。導覽單位包含父項、子項及其之間的連結。
• 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)
• 外部 Helper 方法︰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);