Prestaciones adicionales > Gestión de datos de servicio > Personalización de Windchill Service Information Manager y Windchill Service Parts > Personalización de la publicación > Personalización avanzada de la publicación
  
Personalización avanzada de la publicación
Puntos de extensión para la publicación
Hay varios puntos durante el proceso de creación o procesamiento de la carga útil donde se puede implementar una personalización. También se puede implementar un delegado posterior a la conversión.
Transversal de la estructura de servicio
Este delegado ServiceStructureTraversing de uso general permite modificar las estructuras del servicio de salida que se serializan sin afectar a la estructura de servicio de entrada. Este delegado se aplica a la transversal en general, incluidas la traducción y la publicación.
Registro
Registre el delegado ServiceStructureTraversing añadiendo lo siguiente a un fichero service.properties.xconf:
<Service context="default" name="com.ptc.arbortext.windchill.siscore.
traversal.ServiceStructureTraversing">
<Option serviceClass="YourCustomTraversingClassName
requestor="wt.part.WTPart" selector="null"/>
</Service>
Interfaz ServiceStructureTraversing
package com.ptc.arbortext.windchill.siscore.traversal;
import java.util.List;
import wt.part.WTPart;
import wt.util.WTException;
/*
* Interface that allows customization of the nodes returned from
* StandardTraversalService.
* Children may be added, removed and reordered.
*/
public interface ServiceStructureTraversing {
boolean children(WTPart parent, List<pubNode> children)
throws WTException;
}
Método API children()
Se devuelve true para utilizar el valor modificado del parámetro children en la siguiente etapa del recorrido.
Este método se invoca antes de que se visiten los hijos de cada nodo. El método soporta lo siguiente:
Adición de nodos hijo
Eliminación de nodos hijo
Reorganización de nodos hijo
Parámetros:
parent
El nodo de la estructura de servicio que el código de transversal visita actualmente.
children
Los nodos hijo del parámetro parent.
Verificador que el contenido personalizado está listo
El delegado CustomContentReadyChecker inspecciona cada documento dinámico (incluidos los vínculos de miembro de documentos compuestos y gráficos a los que se hace referencia en listas de artículos) durante la publicación y determina si el contenido está listo para su publicación. Este delegado se utilizaría para determinar si las traducciones están listas, pero también puede determinar si el propio documento está listo.
En el parámetro de reglas de publicación OnContentHolderLinkFailed se define cómo debe gestionarse la solicitud de publicación cuando un documento o su traducción no están listos.
Registro
Registre el delegado CustomContentReadyChecker añadiendo lo siguiente a un fichero service.properties.xconf:
<Service name="com.ptc.arbortext.windchill.publisher.
CustomContentReadyChecker">
<Option serviceClass="CustomContentCheckerClassName"
requestor="null" selector="null"/>
</Service>
Interfaz CustomContentReadyChecker
package com.ptc.arbortext.windchill.publisher;
import wt.fc.Persistable;
import wt.util.WTException;
import com.ptc.arbortext.windchill.publisher.payload.PayloadContext;
public interface CustomContentReadyChecker {
boolean isTranslatedContentReady(
Persistable source,
Persistable trans,
PayloadContext context) throws WTException;
// if PTC_DD_TRANSLATE=="yes" && lang set
boolean isContentReady(
Persistable source,
PayloadContext context) throws WTException; // else this
}
Método API isTranslatedContentReady()
Se devuelve true si el documento está listo o false si no lo está.
Este método verifica el estado del documento y su traducción para determinar si están listos para su publicación.
Parámetros:
source
El contenido del documento.
trans
El contenido traducido del documento.
context
El contexto de la carga útil, en el que se incluyen los parámetros de reglas de publicación y otra información de publicación.
Método API isContentReady()
Se devuelve true si el documento está listo o false si no lo está.
Este método verifica el estado del documento para determinar si está listo para su publicación.
Parámetros:
source
El contenido del documento.
context
El contexto de la carga útil, en el que se incluyen los parámetros de reglas de publicación y otra información de publicación.
Agregador de rótulos de seguridad
El delegado SecurityLabelAggregator define los rótulos de seguridad para una representación publicada según los datos y sus rótulos de seguridad que se publican.
Durante el proceso de publicación, Windchill Service Information Manager recopila los rótulos de seguridad de cada uno de los elementos que se recopilan para la carga útil y aplica un atributo de rótulo de seguridad. Es posible definir la jerarquía de los rótulos de seguridad para la recopilación de elementos mediante la interfaz SecurityLabelAggregator que agrega rótulos de seguridad basados en la lógica empresarial.
La interfaz procesa los rótulos de seguridad de los siguientes elementos:
todos los WTParts de la estructura;
todos los objetos vinculados de WTDocument, EPMDocument, gráficos y lista de artículos;
todos los fragmentos vinculados de documentos;
todos los gráficos vinculados de listas de artículos y documentos;
todas las representaciones incluidas en la carga útil.
* 
Los objetos de referencia se excluyen a menos que su contenido también se incluya en la carga útil (no solo los metadatos).
Los rótulos de seguridad no se soportan para la publicación de paquetes.
Registro
Registre el delegado SecurityLabelAggregator añadiendo lo siguiente a un fichero service.properties.xconf:
<Service name="com.ptc.arbortext.windchill.publisher.
SecurityLabelAggregator">
<Option serviceClass="CustomSecurityLabelAggregatorClassName"
requestor="null" selector="null"/>
</Service>
Interfaz SecurityLabelAggregator
package com.ptc.arbortext.windchill.publisher;
import java.util.Map;
import wt.access.SecurityLabeled;
import wt.util.WTException;
public interface SecurityLabelAggregator {
/**
*
* @param mergeTo is the output. Initially it has other labels
* @param finalTarget is the object in which the final result is saved
* @param mergeFrom is a collection of labels that will be merged to
* mergeTo.
* @param mergeFromObject is the object where mergeFrom is retrieved.
* If mergeFromObject is a representation, its target object
* is used.
* @param options are the parameters that can be used to control the
* merging.
* @throws WTException, when thrown, the current publish job fails.
*/
public void aggregate(Map<String, String> mergeTo,
SecurityLabeled finalTarget, Map<String, String> mergeFrom,
SecurityLabeled mergeFromObject, Map<String, String> options)
throws WTException;
/**
*
* The method tests if the security labels need the PE alternate
* transaction archive.
* If there is a label called ITAR, an implementation could return true.
* PE would put the publish job's transaction archive in the alternate
* archive.
* @param securityLabels are the aggregated security labels
* @param options parameters
* @return true if secure and false if public
*/
public boolean isSecured(Map<String, String> securityLabels,
Map<String, String> options) throws WTException;
}
Método API aggregate()
Devuelve nulo.
Este método define el rótulo de seguridad final de la representación de destino según los rótulos de seguridad de todos los datos recopilados en una carga útil.
Parámetros:
mergeTo
Una recopilación de rótulos de seguridad para finalTarget. Cuando se llama al método, es posible que en esta variable ya se incluyan algunos rótulos de seguridad.
finalTarget
El objeto en el que se almacenan los rótulos de seguridad finales.
mergeFrom
Una recopilación de rótulos de seguridad para mergeFromObejct. Estos rótulos de seguridad ayudarán a determinar cómo se definen los rótulos de seguridad finales.
mergeFromObject
Un objeto que contiene algunos rótulos de seguridad.
options
Un mapa de los parámetros de reglas de publicación y sus valores.
Método API isSecured()
Devuelve true o false.
El método verifica los rótulos de seguridad finales agregados y determina si se debe proteger la representación publicada. Si isSecured() devuelve true, la representación publicada deberá colocarse en una carpeta protegida. El archivo de transacciones seguras debe estar configurado en el Arbortext Publishing Engine.
Parámetros
securityLabels
Los rótulos de seguridad finales que se van a aplicar para seguridad.
options
Un mapa de los parámetros de reglas de publicación y sus valores.
Filtro de elemento
El delegado ElementFilter permite al usuario excluir elementos de información de las cargas útiles de estructura de servicio. Por ejemplo, este delegado puede excluir de las cargas útiles los elementos de información con determinados rótulos de seguridad.
Un objeto de contenido (tal como un EPMDocument) o una lista de artículos se debe filtrar si alguno de sus hijos se ha filtrado o si hay riesgo de errores debidos a la publicación de un documento o una lista de artículos incompletos.
Registro
Registre el delegado ElementFilter añadiendo lo siguiente a un fichero service.properties.xconf:
<Service name="com.ptc.arbortext.windchill.publisher.payload.ElementFilter">
<Option serviceClass="CustomElementFilterClassName"
requestor="null" selector="null"/>
</Service>
Interfaz ElementFilter
package com.ptc.arbortext.windchill.publisher.payload;
import wt.fc.Persistable;
import wt.fc.collections.WTList;
import wt.util.WTException;
/**
* An interface that is used to filter information elements based on
* customized criteria. Only one instance is used for the whole payload.
*
*/
public interface ElementFilter {
/**
*
* @param context
* @param curElement it could be WTPart, PartList
* @param associated a list of Persistable objects. If the current
* element is a structured document, such as dynamic document,
* only its root dynamic document is included.
* Depending on business logic, users may need to check the children.
* @return true means we don't include the Element. Otherwise,
* include the element. If the element is not included and the
* publishing stops, an exception is expected.
* @throws WTException
*/
public boolean filter(PayloadContext context, Persistable curElement,
WTList associated) throws WTException;
}
Método API filter()
Se devuelve true para excluir curElement de la carga útil. Se devuelve false para incluir curElement.
Este método verifica cada elemento de información en la estructura de servicio para determinar si se debe filtrar.
Parámetros:
context
El contexto de carga útil, en el que se incluyen los parámetros de reglas de publicación y otra información.
curElement
Un nodo de la estructura de servicio, una lista de artículos o una ilustración de lista de artículos que se puede añadir a la carga útil.
associated
Una recopilación de objetos persistentes que está asociada con curElement. Por ejemplo, si curElement es un nodo de la estructura de información que señala a un documento dinámico, en el parámetro associated se incluye el documento dinámico.
Proveedor de origen de metadatos personalizado
El delegado CustomMetaDataSourceProvider permite al usuario suministrar orígenes de metadatos adicionales para cualquier elemento de la lista de artículos o cualquier nodo de una estructura de servicio. Los orígenes de metadatos adicionales se anexan a los orígenes de metadatos existentes y luego se serializan en ficheros XML. Habitualmente, los orígenes de metadatos se recopilan de cada nodo de la estructura y de cada elemento de la lista de artículos en función de la configuración del fichero publishable_attset.xml. Para obtener más información, consulte Configuración de atributos.
Registro
Registre el delegado CustomMetaDataSourceProvider añadiendo lo siguiente a un fichero service.properties.xconf:
<Service name="com.ptc.arbortext.windchill.siscore.operation.
CustomMetaDataSourceProvider">
<Option serviceClass="CustomMetaDataSourceProviderClassName"
requestor="null" selector="wt.part.WTPart|com.ptc.sis.Base|
com.ptc.sis.BaseDiv "/>
</Service>
Interfaz CustomMetaDataSourceProvider
package com.ptc.arbortext.windchill.siscore.operation;
import java.util.List;
import wt.fc.ObjectToObjectLink;
import wt.fc.Persistable;
import wt.util.WTException;
public interface CustomMetaDataSourceProvider {
List<SISMetaDataSource> getCustomDataSources(Persistable targetNode,
ObjectToObjectLink linkToNode,
Persistable rootNode,
SISOperationServerContext hookContext) throws WTException;
}
Método API getCustomDataSources()
Se devuelve una recopilación de orígenes de metadatos personalizados que se anexarán a los orígenes de metadatos existentes y se serializarán en el nodo de destino.
Este método recopila los metadatos adicionales para los orígenes especificados.
Parámetros:
targetNode
El valor puede ser cualquiera de los siguientes:
El nodo que se visita en la estructura de información o la estructura de publicación en el momento en que se llama al método.
El wt.part.WTPart vinculado de una lista de artículos cuando se serializa un objeto de la lista de artículos.
Un objeto de contenido que se añade a la carga útil, como un documento dinámico, cuando los metadatos de dicho objeto se necesitan en el manifiesto.
linkToNode
El vínculo para el targetNode del nodo padre en el momento en el que se llama al método. Puede ser null para el nodo raíz o para los nodos que el delegado ServiceStructureTraversing añade al árbol. En un elemento de la lista de artículos, se trata del PartListItem vinculado al wt.part.WTPart. Para objetos de contenido, puede ser un vínculo especializado, como un EPMDescribedByLink.
rootNode
La raíz de la estructura de servicio o un objeto de la lista de artículos.
hookContext
Un contexto SISOperationServerContext en el que se proporciona información sobre el tipo de operación que se está realizando y los filtros aplicados a la estructura.
Traducciones de metadatos personalizados
Si se trabaja con metadatos traducidos personalizados, se debe utilizar el método addTranslation() de la clase PropertyValue de RawMetaDataSource. Por ejemplo:
RawMetaDataSource.Property p = new RawMetaDataSource.
Property("token2", "property_type", null, authorLang);
p.setLocalizable(true);
RawMetaDataSource.PropertyValue v = new RawMetaDataSource.
PropertyValue("value12", "value_token", "value_key");
v.addTranslation("fr", "value12_fr");
v.addTranslation("de", "value12_de");
p.addValue(v);
properties.add(p);
data.setProperties(properties);
Resultados de los metadatos de francés (por defecto del paquete):
<Metadata source="RawSoftType">
<Property name="token2">
<Value xml:lang="en" transidref="...">value12</Value>
<Value xml:lang="en" transidref="...">value12_2</Value>
</Property>
</Metadata>
Resultados de los metadatos de translation.xml (por defecto de PDF):
<Target xml:lang="fr">
...
<Value transid="07ecb4cfd68fab55">value12_fr</Value>
<Value transid="07ecb4cfd68fse54">value12_2_fr</Value>
...
</Target>
El delegado puede definir Localizable en "true", lo que significa que los valores de la propiedad tienen una traducción que puede aparecer en el paquete. El método addTranslation() puede proporcionar traducciones personalizadas de un idioma concreto. Los delegados pueden tener varias traducciones para un PropertyValue. Cuando el paquete se publique para un idioma específico, en él aparecerá la traducción adecuada (si se ha proporcionado).
Si una propiedad está marcada como localizable, pero el delegado no proporciona una traducción para el idioma de destino de publicación, fallará el trabajo de publicación (si la regla de publicación CompleteTranslationCheck se ha definido en "true").
Comparación de metadatos personalizados para fechas agregadas
En los metadatos personalizados, los detalles de fechas agregadas se proporcionan mediante el atributo SIM.lastUpdated para las listas de artículos y el atributo SIM.lastUpdatedMetadata para los documentos EPM. Utilice el método getTimeStamp() de la clase AttributeMetaDataSource en RawMetadasource en el delegado CustomMetaDataSourceProvider.
En la publicación se incluirá el valor devuelto por getTimeStamp() para el contenido raíz, es decir, los documentos dinámicos del soporte de contenido y la lista de artículos, y desestimará el resto de contenido. Por ejemplo, si en los datos personalizados del documento dinámico hijo se incluye la fecha también, la publicación no incluirá este fragmento de información en la fecha calculada del padre.
La fecha se devuelve a través de RawMetadasource y se define en la clase AttributeMetaDataSource.
public class AttributeMetaDataSource implements SISMetaDataSource {
private WTReference targetRef;
protected List<Property> properties;
protected List<Object> incrementalList;
protected long timeStamp;
Proveedor de orígenes de metadatos personalizado de manifiesto
El delegado ManifestCustomMetaDataSourceProvider añade y quita orígenes de metadatos para contenido y también añade nuevos atributos a los metadatos existentes en el fichero manifest.xml en la carga útil. Los orígenes de metadatos adicionales se anexan a los orígenes de metadatos existentes y luego se serializan en ficheros XML. Un origen de metadatos existente típico sería la efectividad de servicio. Al serializar el contenido de la estructura del servicio (por ejemplo, documentos dinámicos y listas de artículos) para la carga útil, los orígenes de metadatos se recopilan según la configuración de manifest_attset.xml. Para obtener más información, consulte Configuración de atributos.
Registro
Registre el delegado ManifestCustomMetaDataSourceProvider añadiendo lo siguiente a un fichero service.properties.xconf:
<Service name="com.ptc.arbortext.windchill.siscore.operation.
ManifestCustomMetaDataSourceProvider">
<Option cardinality="singleton" serviceClass=
"ManifestCustomMetaDataSourceProviderClassName"
requestor="null" />
</Service>
El atributo de selector permite especificar el contexto. La clase se registra como singleton. Asegúrese de que el objeto se pueda reutilizar en varios subprocesos simultáneamente.
Interfaz ManifestCustomMetaDataSourceProvider
package com.ptc.arbortext.windchill.siscore.operation;
import java.util.List;
import java.util.Map;
import wt.fc.WTReference;
import wt.fc.collections.WTKeyedMap;
import wt.util.WTException;
public interface ManifestCustomMetaDataSourceProvider {
/**
*
* @param currentData
* @param hookContext
* @return
* @throws WTException
*/
Map<WTReference, List<SISMetaDataSource>> getCustomDataSources
(WTKeyedMap currentData,SISOperationServerContext hookContext)
throws WTException;
}
Método API getCustomDataSources()
Permite devolver un mapa de referencias señaladas y su información personalizada de metadatos.
Parámetros:
currentData
El valor es un mapa de referencias señaladas y sus hijos.
hookContext
Un contexto SISOperationServerContext en el que se proporciona información sobre el tipo de operación que se está realizando y los filtros aplicados a la estructura.
Ejemplo de adición de metadatos
Inicialice un objeto OperationMetaDataSource.
OperationMetaDataSource om = new OperationMetaDataSource
(OperationMetaDataSource.E_Operation.Add);
WTArrayList list = new WTArrayList();
list.add(PersistableObject);
om.setTargets(list);
Devuelva el objeto OperationMetaDataSource.
Map<WTReference, List<SISMetaDataSource>> ret = new HashMap
<WTReference, List<SISMetaDataSource>>
List<SISMetaDataSource> src = new ArrayList<SISMetaDataSource>()
src.add(om);
ret.put(targetRef, src);
Ejemplo de eliminación de metadatos
Inicialice un objeto OperationMetaDataSource.
OperationMetaDataSource om = new OperationMetaDataSource
(OperationMetaDataSource.E_Operation.Remove);
WTArrayList list = new WTArrayList();
list.add(PersistableObject);
om.setTargets(list);
Devuelva el objeto OperationMetaDataSource.
Map<WTReference, List<SISMetaDataSource>>
ret = new HashMap<WTReference,
List<SISMetaDataSource>>List<SISMetaDataSource> src = new
ArrayList<SISMetaDataSource>();
src.add(om);
ret.put(targetRef, src);
Ejemplo de adición de un atributo a los metadatos existentes
Inicialice un objeto AttributeMetaDataSource.
AttributeMetaDataSource am = new AttributeMetaDataSource(ref);
List<RawMetaDataSource.Property> properties = new ArrayList
<RawMetaDataSource.Property>();
RawMetaDataSource.Property p = new RawMetaDataSource.Property
("NewCustomAttributeId", null);
RawMetaDataSource.PropertyValue v = new RawMetaDataSource.PropertyValue
(ref.toString(), null, null);
p.addValue(v);
properties.add(p);
am.setProperties(properties);
Devuelva el objeto AttributeMetaDataSource.
Map<WTReference, List<SISMetaDataSource>>
ret = new HashMap<WTReference,
List<SISMetaDataSource>>List<SISMetaDataSource> src = new
ArrayList<SISMetaDataSource>();
src.add(am);
ret.put(targetRef, src);
Traducciones de metadatos personalizados
Si se trabaja con metadatos traducidos personalizados, se debe utilizar el método addTranslation() de la clase PropertyValue de RawMetaDataSource. Por ejemplo:
RawMetaDataSource.Property p = new RawMetaDataSource.
Property("token2", "property_type", null, authorLang);
p.setLocalizable(true);
RawMetaDataSource.PropertyValue v = new RawMetaDataSource.
PropertyValue("value12", "value_token", "value_key");
v.addTranslation("fr", "value12_fr");
v.addTranslation("de", "value12_de");
p.addValue(v);
properties.add(p);
data.setProperties(properties);
Resultados de los metadatos de francés (por defecto del paquete):
<Metadata source="RawSoftType">
<Property name="token2">
<Value xml:lang="en" transidref="...">value12</Value>
<Value xml:lang="en" transidref="...">value12_2</Value>
</Property>
</Metadata>
Resultados de los metadatos de translation.xml (por defecto de PDF):
<Target xml:lang="fr">
...
<Value transid="07ecb4cfd68fab55">value12_fr</Value>
<Value transid="07ecb4cfd68fse54">value12_2_fr</Value>
...
</Target>
El delegado puede definir Localizable en "true", lo que significa que los valores de la propiedad tienen una traducción que puede aparecer en el paquete. El método addTranslation() puede proporcionar traducciones personalizadas de un idioma concreto. Los delegados pueden tener varias traducciones para un PropertyValue. Cuando el paquete se publique para un idioma específico, en él aparecerá la traducción adecuada (si se ha proporcionado).
Si una propiedad está marcada como localizable, pero el delegado no proporciona una traducción para el idioma de destino de publicación, fallará el trabajo de publicación (si la regla de publicación CompleteTranslationCheck se ha definido en "true").
Comparación de metadatos personalizados de manifiesto para fechas agregadas
En los metadatos personalizados, los detalles de fechas agregadas se proporcionan mediante el atributo SIM.lastUpdated para las listas de artículos y el atributo SIM.lastUpdatedMetadata para los documentos EPM. Utilice el método getTimeStamp() de la clase AttributeMetaDataSource en RawMetadasource en el delegado ManifestCustomMetadataSourceProvider.
En la publicación se incluirá el valor devuelto por getTimeStamp() para el contenido raíz, es decir, los documentos dinámicos del soporte de contenido y la lista de artículos, y desestimará el resto de contenido. Por ejemplo, si en los datos personalizados del documento dinámico hijo se incluye la fecha también, la publicación no incluirá este fragmento de información en la fecha calculada del padre.
public class AttributeMetaDataSource implements SISMetaDataSource {
private WTReference targetRef;
protected List<Property> properties;
protected List<Object> incrementalList;
protected long timeStamp;
* 
Los metadatos devueltos de este hook no se supervisan para la publicación incremental.
Hook personalizado de traducción
El CustomTranslationHook puede recuperar los valores traducidos de los atributos de Windchill durante la publicación. Un valor devuelto null significa que no hay ninguna traducción disponible. La salida publicada se incluirá en translation.xml. Se deben incluir los atributos especificados en el fichero de configuración localizable_attset.xml para incluirlo en la carga útil.
Registro
Para registrar el delegado de hook de traducción personalizado, se debe añadir una entrada como la siguiente en el fichero sis.service.properties.xconf:
<Service name="com.ptc.arbortext.windchill.siscore.CustomTranslationHook">
<Option serviceClass="YourCustomTranslationHookClassName"
requestor="null" selector="null"/>
</Service>
Interfaz CustomTranslationHook
package com.ptc.arbortext.windchill.siscore.translation;
import wt.util.WTException;
public abstract class CustomTranslationHook {
/**
*
* @param softtype Windchill soft type name
* @param attributeName Windchill soft attribute name
* @param sourceLanguage source or authored language of attributeValue
* @param attributeValue attributeValue to fetch translation for
* @param targetLanguage target language of translation to fetch
* @throws WTException
*/
public abstract String translateAttribute(String softtype,
String attributeName, String sourceLanguage,
String attributeValue, String targetLanguage)
throws WTException;
}
Método API translateAttribute()
Este método especifica el atributo para el que desea recuperar un valor de atributo traducido.
El valor devuelto es una cadena traducida del atributo especificado si existe una traducción. Si el método devuelve null o lanza una excepción, significa que no hay ninguna traducción disponible y se utilizará la cadena de atributo de origen.
Parámetros:
softtype
El subtipo Windchill de la estructura de servicio
attributeName
El nombre de atributo del subtipo Windchill
sourceLanguage
El origen o idioma de creación del attributeValue
attributeValue
El valor de atributo para el que se debe recuperar una traducción
targetLanguage
El idioma de destino para el que se debe recuperar una traducción
Carpeta personalizada en carga útil
El delegado CustomArtifactProvider proporciona un enlace para incluir elementos personalizados al paquete de la carga útil.
Registro
Para registrar el delegado de CustomArtifactProvider, se debe añadir una entrada como la siguiente en el fichero sis.service.properties.xconf:
<Service name="com.ptc.arbortext.windchill.publisher.payload.CustomArtifactProvider">
<Option serviceClass="ProveedorDeArtefactosPersonalizadoImplementación"
requestor="null" selector="null"/>
</Service>
Interfaz CustomArtifactProvider
package com.ptc.arbortext.windchill.publisher.payload;
import com.ptc.wvs.common.util.VSResult;
import wt.util.WTException;
public interface CustomArtifactProvider {
/**
* This method is passed the path for a newly created empty temporary
* directory as well as the payload context object.
* @param tempDirPath : empty temporary directory
* @param context : payload context object
* @return VSResult.SUCCESSFUL or VSRESULT.FAIL
* @throws WTException
*/
public VSResult initiateCustomFolder(String tempDir, PayloadContext context) throws WTException;
/**
* If the method returns VSResult.SUCCESSFUL, then the contents of the directory
* will be copied to the custom folder in the payload.
Otherwise if the method returns VSRESULT.FAIL, the temporary directory
will be permanently deleted with including its content in the payload.
* @return VSResult.SUCCESSFUL or VSRESULT.FAIL
* @throws WTException
*/
public VSResult publishCustomFolder() throws WTException;
/**
* cleanUp is called regardless what happens to publish
* to clean up resources in customization.
*/
public void cleanUp();
Método API initiateCustomFolder()
Este método se transfiere a la ruta para un directorio temporal vacío creado recientemente, así como el objeto de contexto de carga útil. Si devuelve VSResult.FAIL, el trabajo de publicación se detiene y devuelve un error.
Parámetros:
tempDir
directorio temporal vacío
context
objeto de contexto de carga útil
Devuelve VSResult.SUCCESSFUL o VSRESULT.FAIL
Método API publishCustomFolder()
Este método modifica el contenido del directorio temporal. Por ejemplo, comprimiendo algunos elementos.
Devuelve VSResult.SUCCESSFUL o VSRESULT.FAIL. Si el método devuelve VSResult.SUCCESSFUL, el contenido del directorio se copia en la carpeta personalizada de la carga útil. Si el método devuelve VSRESULT.FAIL, el directorio temporal se borra permanentemente con su contenido en la carga útil.
Método para codificar nombres de fichero y de directorio
La utilidad encodePayloadFileName utiliza una codificación de estilo de porcentaje para codificar los caracteres especiales que pueden estar presentes en el nombre de fichero de un directorio o de elementos en la carga útil o el paquete de publicación. La utilidad reemplaza los caracteres especiales y alfanuméricos incluidos en nombres de ficheros con un carácter de guion bajo (_) seguido de los valores hexadecimales (#) de los caracteres que se están reemplazando.
Los siguientes caracteres no se escaparán durante la codificación:
A-Z (caracteres latinos en mayúsculas)
a-z (caracteres latinos en minúsculas)
0–9 (números arábigos)
. (punto)
~ (tilde)
Firma del método de la utilidad:
public static String encodePayloadFileName(String fname)
Firma completa del método de la utilidad:
com.ptc.arbortext.windchill.publisher.payload.util.FileNameUtil.encodePayloadFileName(String fname)
Donde fname es el nombre de fichero.
Publicación de nodos inactivos de la jerarquía de productos
CustomPHHook detecta los nodos de la jerarquía de productos fuera del árbol de jerarquía de productos y los publica como nodos inactivos. Si el nodo es una parte del árbol, se marca como inactivo. Si no, se inserta como hijo de la jerarquía de productos raíz y se marca como inactivo.
Registro
Para registrar el delegado de enlace de jerarquía de productos personalizado, se debe añadir una entrada como la siguiente en el fichero sis.service.properties.xconf:
<Service name="com.ptc.arbortext.windchill.publisher.payload.CustomPHHook">
<Option cardinality="singleton" serviceClass="YourCustomPHHook"
requestor="null" selector="null"/>
</Service>
Interfaz CustomPHHook
package com.ptc.arbortext.windchill.publisher.extract;
import com.ptc.arbortext.windchill.publisher.payload.PayloadContext;
import wt.fc.collections.WTCollection;
import wt.filter.NavigationCriteria;
import wt.part.WTPart;
import wt.util.WTException;
Public abstract class CustomPHHook {
public abstract WTCollection getInactivePHNodes(WTPart rootPH, NavigationCriteria phNC, PayloadContext payloadContext);
}
Método API getInactivePHNodes()
Devuelve una recopilación de WTParts que son nodos inactivos en una jerarquía de productos. Si el método devuelve un nodo que no forme parte de la jerarquía de productos o el objeto no es un WTPart, se producirá una excepción. Si el método devuelve un nodo o un artículo que está fuera del árbol de jerarquía de productos, el nodo se añade como nuevo elemento de información de la jerarquía de productos en la estructura.
Parámetros:
rootPH
raíz de la estructura de la jerarquía de productos
phNC
Criterios de navegación por la jerarquía de productos
payloadContext
Contexto
Delegado posterior a la conversión
PostConvertDelegate permite al usuario procesar con posterioridad una respuesta devuelta desde Arbortext Publishing Engine después de un trabajo de publicación. En la respuesta se incluye información del fichero composerlog.xml que contiene errores o avisos. Esta información debe activar una acción de proceso de trabajo o una notificación por correo electrónico. Se llamará al delegado independientemente de si el trabajo de publicación se aprueba o falla.
Si PostConvertDelegate emite una excepción, la excepción se anotará en el registro de WVS, pero esta excepción no cambiará el estado del trabajo de publicación.
Registro
Para registrar el delegado posterior a la conversión personalizado, añada el parámetro de publicación PostConvertDelegate de WVS a una regla de publicación y especifique el nombre de clase del delegado personalizado, por ejemplo:

<worker name="com.ptc.arbortext.wvs/PostConvertDelegate">
com.ptc.arbortext.windchill.publisher.CustomPostConvertDelegate</worker>
Interfaz PostConvertDelegate
package com.ptc.arbortext.windchill.publisher;
import java.io.InputStream;
import java.util.Map;
import com.ptc.wvs.common.util.VSResult;
import com.ptc.wvs.server.publish.PublishParams;
import wt.fc.collections.WTCollection;
import wt.representation.Representable;
import wt.representation.Representation;
import wt.util.WTException;
/**
* The abstract class is designed to invoke after the response is returned
* from PE whether the publish job fails or succeeds.
*/
public abstract class PostConvertDelegate {
/**
* The method is invoked after getting response from PE.
* Its result is displayed in the WVS monitor.
* Any exception it throws is logged in method server log,
* but doesn't affect existing publish process;
*
* @param representable is the target object
* @param targetRep is the targeted representation in the targeted object.
* It is not null only for republishing or incremental publishing.
* @param parameters are publishing parameters for this publishing job.
* @param responseStreams is the map that includes all the file names
* and file output streams
* @param publishedList is the list of content included in the payload.
* If it is null, audit is disabled.
* @return is the messages sent to WVS job monitor */
public abstract VSResult execute(Representable representable,
Representation targetRep,
PublishParams parameters,
Map<String, InputStream> responseStreams,
WTCollection publishedList) throws WTException;
}
Método API execute()
El valor devuelto se muestra en el monitor de trabajos de WVS.
Este método se invoca inmediatamente después de que la respuesta del trabajo de publicación se devuelva desde Arbortext Publishing Engine.
Parámetros:
representable
El objeto de destino que se ha publicado.
targetRep
La representación de destino en el objeto de destino. Este parámetro solo es para volver a publicar y para la publicación incremental. Cuando no es nulo, se incluye la representación anterior del objeto de destino. En todos los demás casos es nulo.
parameters
Los parámetros de reglas de publicación que se han utilizado para este trabajo de publicación.
responseStreams
Un mapa en el que se incluyen todos los nombres de fichero y las secuencias de salida de fichero para la respuesta.
publishedList
Una recopilación del contenido incluido en la carga útil. Puede ser nulo si se desactiva la auditoría.