其他 Windchill 功能 > 服务信息管理 > 自定义 Windchill Service Information Manager 和 Windchill Service Parts > 自定义挂接以生成或重新生成新服务结构
  
自定义挂接以生成或重新生成新服务结构
背景
当从模板结构生成或重新生成服务结构时,OOTB 业务逻辑将确定应将模板结构中的哪些节点移除、重新使用或复制到生成的服务结构。用以确定移除、重新使用或节点复制的 OOTB 业务逻辑如下所示:
当从模板结构生成或重新生成服务结构时,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 逻辑进行解析。
注册表
1. 使用 xconfmanager 实用程序以编辑 site.xconf。有关使用 xconfmanager 实用程序的详细信息,请参阅关于 xconfmanager 实用程序
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. 重新启动方法服务器。
帮助程序方法
我们提供了一些受保护的帮助程序方法,可用于检索相关节点和帮助解析节点。可从 resolveNodeForGenerationresolveNodeForRegeneration 方法中调用这些帮助程序方法,办法是将其参数传递到帮助程序方法。您可以使用 super 关键字访问新类中的这些帮助程序方法。
这些帮助程序方法可返回表示模板结构中给定节点的父项和子项之间关系的导航单位的数组。导航单位包含父项、子项及它们之间的链接。
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)
外部帮助程序方法: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);