Personalización del hook para generar o regenerar una nueva estructura de servicio
Antecedentes
Al generar o regenerar una estructura de servicio a partir de una estructura de plantilla, la lógica empresarial de fábrica determina qué nodos de la estructura de plantilla se deben quitar, reutilizar o copiar en la estructura de servicio resultante.
La lógica empresarial de fábrica que permite determinar la eliminación, la reutilización o la copia de nodos es la siguiente:
• El nodo se ha quitado de la estructura de la plantilla.
• El nodo se ha excluido de la estructura de la plantilla mediante un filtro.
• El nodo es un grupo o una sección vacíos y la preferencia Include Empty Nodes se define en false.
• La lista de artículos de la estructura de la plantilla está vacía o estaría vacía después de aplicar el filtro. De este modo, el padre también se quitará si no tuviera ningún otro elemento relacionado.
• La lista de artículos de la estructura de la plantilla es genérica y no tiene ningún artículo real que coincida con el filtro. De este modo, el padre también se quitará si no tuviera ningún otro elemento relacionado.
• Reutilizar: los tipos de nodos que se indican a continuación se reutilizan desde la estructura de la plantilla y no se crean nuevas copias en la estructura de servicio resultante.
◦ Elementos de información
◦ Soportes de contenido
◦ Elementos de información genéricos
• Copiar: los tipos de nodos que se indican a continuación se copian desde la estructura de la plantilla y se insertan como objetos nuevos en la estructura de servicio resultante.
◦ Grupos de información
◦ Secciones de publicación
◦ Estructuras de información anidadas
◦ Estructuras de publicación anidadas
◦ Documentos dinámicos: cuando se copia un documento dinámico, solo se copia el propio documento y se reutilizan los documentos dinámicos vinculados.
◦ Elementos de información textual
◦ Elementos de información gráfica
Objetivo
Sustituya la lógica empresarial de fábrica y añada reglas de algoritmo personalizadas para decidir si los nodos se deben quitar, reutilizar o copiar.
Solución
Se ha creado a un hook de personalización para permitir crear una lógica empresarial propia que permita decidir qué nodos se deben quitar, reutilizar o copiar al generar o regenerar una estructura de servicio. Por defecto, se sigue la lógica de fábrica. Este servicio puede extenderse mediante una implementación personalizada para sustituir la lógica empresarial de fábrica. La interfaz por defecto y la API pública del servicio se describen a continuación.
Interfaz:
La interfaz de NodeResolutionService permite realizar una comparación de los nodos con el fin de determinar cuáles se deben quitar, reutilizar o copiar. El servicio de StandardNodeResolutionService se puede personalizar extendiéndolo y creando un hook de la implementación del servicio en el fichero wt.properties mediante la utilidad xconfmanager.
Hay dos métodos que se pueden sustituir para permitir las implementaciones lógicas personalizadas, un método para la generación y otro para la regeneración de estructuras de servicio. Los métodos son los siguientes:
• 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)
Cada nodo de la estructura de origen se entregará al método a través de un objeto NavigationUnit, que contiene el nodo en sí, su padre y el objeto UsageLink entre ellos.
ResolutionKey es una enumeración que identifica las resoluciones de los objetos que se devuelven del servicio. Las claves válidas para ResolutionKey son las siguientes:
• REMOVE: lista de nodos desde la estructura de destino que se quitarán de la estructura de servicio recién generada o regenerada.
• REUSE: lista o rango de nuevos nodos que deben reutilizarse en la estructura de destino como elementos de información nuevos. En caso de la regeneración de la estructura, esta clave muestra solo los nuevos nodos o elementos que no se hubieran generado anteriormente debido a que se reutilizarán por defecto, a menos que se identifiquen para quitar o copiar.
• COPY: lista o rango de nodos de la estructura de origen que necesitan la creación de nuevas copias en la estructura de destino.
• UNRESOLVED: el nodo no se ha resuelto por la lógica de hook de personalización y debe devolverse al sistema para resolverse mediante la lógica de fábrica.
Registro
1. Use la utilidad xconfmanager para editar site.xconf.
2. Añada la siguiente propiedad:
Property name=" wt.services.service.10399"
overridable="true"
targetFile="codebase/wt.properties"
value="com.ptc.arbortext.windchill.siscore.services.NodeResolutionService/<clase personalizada completa"/>
donde, <clase personalizada completa> es la dirección completa del paquete; es decir, com.ptc.arbortext.sis.MyServiceImplementation.
3. Guarde el fichero.
4. Propague los cambios mediante la utilidad xconfmanager. En el directorio <Windchill>\bin, introduzca el siguiente comando:
xconfmanager -pF
5. Reinicie el servidor de métodos.
Métodos de asistente
Se proporcionan algunos métodos de asistente protegidos que se pueden utilizar para recuperar nodos relacionados y para ayudar a resolver nodos. Estos métodos de asistente se pueden llamar desde los métodos resolveNodeForGeneration y resolveNodeForRegeneration entregando los parámetros correspondientes a los métodos de asistente. Es posible acceder a estos métodos de asistente en la nueva clase mediante la palabra clave super.
Estos métodos de asistente devuelven matrices de unidades de navegación que representan la relación entre el padre y el hijo de un determinado nodo en la estructura de la plantilla. Una unidad de navegación contiene un padre, el hijo y los vínculos entre ellos.
• 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étodo de asistente externo: 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);