Introducción
Durante el desarrollo de un proceso BPM con integraciones con ECM, es posible que uno de los requerimientos sea, por ejemplo, que los archivos de bitácora de los procesos sean almacenados en el ECM. Para estos casos, CMIS ofrece una operación que sirve para cumplir con esta tarea.
Para este caso en particular se trabajó con las siguientes herramientas:
- IBM BPM Standard v8.0.1.2
- Microsoft SharePoint
Creación del Integration Service "CMIS - Create WF Log"
Se creará un nuevo Integration Service, con la siguiente configuración:
Variables
Las variables del servicio involucradas son:
- fileContents (String) – Variable con el texto del archivo a almacenar.
- contentStream (ECMContentStream) – Utilizada en la creación del documento en el ECM
- fileName (String) – Nombre del archivo
- ecmProperties(List de ECMProperty) – Colección que servirá para indicar la metadata adicional que quiera cargarse para el documento.
Diagrama
A continuación, se detallará cada una de las actividades involucradas:
Set File Content
En este Server Scriptlet, asociado a la variable privada fileContents, se armará el texto del archivo a almacenar en Sharepoint. En este ejemplo en particular, se utilizan diversas variables del objeto wfInstance, propio de la solución utilizada como modelo. El resultado del scriptlet es alojado en la variable fileContents, del tipo String. Este será el texto que tendrá el archivo.
Set Up Properties
La implementación del siguiente Server Script contendrá el setteo de las variables requeridas para el alta del documento en el ECM.
fileName
Asignarle el nombre que poseerá el documento. En este ejemplo, el nombre del archivo corresponde a “WFLog_<instanceID>.txt"
tw.local.fileName = “WFLog_” + tw.system.currentProcessInstanceID.substring(tw.system.currentProcessInstanceID.indexOf(“.”)+1) + “.txt”;
contentStream
Para settear está variable, se debe incluir el siguiente bloque de código:
var bytesValue = new Packages.java.lang.String(tw.local.fileContents).getBytes(“UTF-8”); var content64 = Packages.org.apache.commons.codec.binary.Base64.encodeBase64(bytesValue); tw.local.contentStream = new tw.object.ECMContentStream(); tw.local.contentStream.contentLength = tw.local.fileContents.length; tw.local.contentStream.mimeType = “text/plain”; tw.local.contentStream.content = new Packages.java.lang.String(content64,”UTF-8”);
Nota: "UTF-8" puede cambiarse de acuerdo al encoding necesitado.
ecmProperties
El siguiente bloque de código indica cómo deben crearse las propiedades a asignarle al archivo. Dichas propiedades refieren a la metadata configurada para el tipo de documento en el ECM. El orden en el que se popula la colección de propiedades es indiferente.
tw.local.ecmProperties = new tw.object.listOf.ECMProperty(); tw.local.ecmProperties[0] = new tw.object.ECMProperty(); tw.local.ecmProperties[0].objectTypeId = “WFName”; //Nombre de la propiedad tw.local.ecmProperties[0].value = tw.local.wfInstance.wfDescription.name;
Create Document
El ultimo paso es crear el archivo en el ECM utilizando una actividad de Content Integration.
En implementation se selecciona el Server al que conectarse. (La información del servidor se configura en “Process App Settings”, solapa “Servers”). Además, debe seleccionarse la operación “Create document”.
En Data Mapping, se completarán las siguientes variables de entrada:
- Object type ID: String indicando el tipo de documento, para este ejemplo se utiliza el default de Sharepoint: “cmis:document”
- Folder ID: ID de la carpeta donde almacenar el archivo. En SharePoint, el ID de la carpeta raíz del repositorio es “-1”.
- Name: indicar tw.local.fileName
- Content stream: indicar tw.local.contentStream
- Properties: indicar tw.local.ecmProperties
Si se quisiera, podría asignarse el ID del documento creado en el ECM a una variable utilizando Document ID de la sección Output Mapping.
Completados estos pasos, el servicio está listo para ser invocado y dar de alta documentos de texto en el ECM.
Troubleshooting
-
“Quiero guardar el archivo en una carpeta que no sea la carpeta raíz. ¿Cómo averiguo el ID?”
-
La solución que no involucra desarrollo es averiguar en el ECM el ID de la carpeta, siempre que sea la misma y asignarla a una variable de entorno.
-
Si, en cambio, la carpeta varía, se puede implementar un Integration Service en el cual se obtenga la carpeta en el ECM por su path (Get folder by path) y se devuelva el ID de la carpeta buscada.
-
-
“El Servicio falla indicando que la propiedad 'x' no existe”
-
En esos casos, es posible que el display name de la propiedad que quiere settearse es distinto a su objectTypeId. La solución es averiguar en el ECM cuál es su objectTypeId.
-