새 서비스 구조를 생성 또는 재생성하도록 후크 사용자 정의
배경 정보
템플릿 구조에서 서비스 구조를 생성하거나 재생성할 때 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)
소스 구조의 각 노드가 자체 노드, 해당 상위 노드 및 이러한 노드 간 UsageLink를 포함하는 NavigationUnit을 통해 메소드에 전달됩니다.
ResolutionKey는 서비스에서 반환된 객체에 대한 확인 방법을 식별하는 열거입니다. ResolutionKey에 대한 올바른 키는 다음과 같습니다.
• REMOVE - 새로 생성된 서비스 구조 또는 재생성된 서비스 구조에서 제거될 대상 구조의 노드 목록입니다.
• REUSE - 새 정보 요소처럼 대상 구조에서 재사용되어야 하는 새 노드의 목록 또는 범위입니다. 구조를 재생성하는 경우 이전에 생성되지 않은 새 노드 또는 요소만 이 키에 나열됩니다. 노드나 요소는 제거 또는 복사 대상으로 식별된 경우가 아니면 기본적으로 재사용되기 때문입니다.
• COPY - 대상 구조에 새 복사본이 작성되어야 하는 소스 구조의 노드 목록 또는 범위입니다.
• UNRESOLVED - 노드가 사용자 정의 후크 로직을 통해 확인되지 않았으며 OOTB 로직을 통해 확인되도록 시스템에 반환됩니다.
레지스트리
1. xconfmanager 유틸리티를 사용하여 site.xconf를 편집할 수 있습니다.
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. 메소드 서버를 다시 시작합니다.
도우미 메소드
관련 노드를 읽어들이고 노드를 확인하는 데 사용할 수 있도록 몇 가지 보호된 도우미 메소드가 제공됩니다. 이러한 도우미 메소드는 도우미 메소드에 해당 매개변수를 전달하여 resolveNodeForGeneration 및 resolveNodeForRegeneration 메소드에서 호출할 수 있습니다. 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);