Mapping date xCP Designer

De EjnTricks

Lors d'un projet, une communication était réalisée vers un webservice externe. Dans la signature de celui-ci, il fallait envoyer une date, mais en chaîne de caractères. Bien entendu, le format de celle-ci n'avait pas été précisé et les premiers essais ont abouti à une erreur. Il fallait envoyer par exemple 2005-08-31T15:52:57+00:00.


Heureusement, xCP Designer propose des fonctions de mappings. Cet article présente la mise en place du formatage d'une date en chaîne de caractères et un problème de tests par exécution locale.

A noter, ceci a été réalisé avec la version 2.1.1 de xCP Designer.


Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote


Configuration-icon.png Mise en place

Lors du mapping des inputs et outputs, il est possible d'utiliser un ensemble de fonction. Afin de convertir une date en chaîne de caractères, il faut utiliser la fonction DateToString.


La documentation indique l'utilisation suivante.

Function Input arguments Result
Date to String A date and a string representing a valid date pattern. The date pattern must conform to the standard Java SimpleDateFormat. For details, refer to the Java API and developer reference documentation. Date value as a string with the specified pattern.

La fonction accepte deux paramètres.

  • Le premier représente la date à formater;
  • Le second le pattern du formatage.


Pour le formatage, tous les patterns disponible en JAVA peuvent être appliqués.


Study icon.png Fonctionnement

Les fonctions de mappings sont en lien avec des classes Java, dont le jar est stocké dans la docbase. Tout se passe depuis le module xcpruntimeutils.

DQL> select object_name from dm_document where folder('/System/Modules/xcpruntimeutils', descend) order by object_name;

object_name
===============================================

antlr-3.3-complete
bpm-commons
bpm_infra
bpmutil
castor-1.1-xml 
com.emc.xcp.artifact.alert 
com.emc.xcp.artifact.appparameter
com.emc.xcp.artifact.approle 
com.emc.xcp.artifact.aspect
com.emc.xcp.artifact.contentanalytics
com.emc.xcp.artifact.dataservice 
com.emc.xcp.artifact.datasourcehistorical
com.emc.xcp.artifact.datatypes 
com.emc.xcp.artifact.emailtemplate 
com.emc.xcp.artifact.endpoint
com.emc.xcp.artifact.javamodule
com.emc.xcp.artifact.permissionset 
com.emc.xcp.artifact.picklist
com.emc.xcp.artifact.process 
com.emc.xcp.artifactmanager
com.emc.xcp.common 
com.emc.xcp.logger.jar 
com.emc.xcp.util 
commons-io-1.3.1 
expressions
org.eclipse.emf.common_2.7.0 
org.eclipse.emf.ecore.xmi_2.7.0
org.eclipse.emf.ecore_2.7.0
org.eclipse.osgi_3.8.1.v20120830-144521
org.springframework.core 
org.springframework.expression 
processengine
xcp_runtime_util 
xcp_runtime_util_impl
(34 rows affected)

Pour connaitre le fonctionnement du mapping, il suffit donc de télécharger le contenu de l'objet xcpruntimeutils et de le décompiler, en l'ouvrant avec JD GUI par exemple.

Le contenu de ce jar est vraiment très simple, et le package com.documentum.bps.functions contient le code de chacune des fonctions. Pour le mapping DateToString, le classe DateToStringFunction est identifiée, relativement simple. La fonction inintéressante est execute dont le contenu est le suivant.

  public Object execute(IDfSession session, Object[] params)
  {
    if ((params == null) || (params.length != 2)) {
      throw new IllegalArgumentException("Invalid number of arguments passed to the function. Expected 2. Actual " + (params == null ? "0" : Integer.valueOf(params.length)));
    }
    if ((params[0] == null) || (params[1] == null)) {
      return null;
    }
    if (!(params[0] instanceof Date)) {
      throw new IllegalArgumentException("Date provided is of invalid type. Expected: " + Date.class.toString() + ". Actual: " + params[0].getClass().getName());
    }
    if (!(params[1] instanceof String)) {
      throw new IllegalArgumentException("Pattern provided is of invalid type. Expected: " + String.class.toString() + ". Actual: " + params[1].getClass().getName());
    }
    Date date = (Date)params[0];
    String format = (String)params[1];
    try
    {
      SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.ENGLISH);
      return sdf.format(date);
    }
    catch (Throwable t)
    {
      throw new RuntimeException("Could not execute DateToString function for Date:" + params[0] + " with Pattern:" + params[1], t);
    }
  }

En résumé, quelques tests sont réalisés en début d'exécution afin de valider les paramètres d'appels. Seules les dernières lignes sont vraiment intéressantes et effectuent le travail. La conversion de la date en chaîne de caractère est donc réalisée à l'aide d'un simple SimpleDateFormat standard de Java. A noter que la locale est forcée à l'anglais.


Warning-icon.png Debug local

xCP Designer permet de debugger localement les process. Or dans le cadre de ces travaux, le format de la date a été paramétré avec yyyy-MM-dd'T'HH:mm:ssXXX. Or lors de l'exécution, le message suivant est affiché dans la console.

Activity Map Date's Execution failed : 'A358286120'
java.lang.RuntimeException: Could not execute DateToString function for Date:Thu Mar 17 10:36:04 CET 2016 with Pattern:yyyy-MM-dd'T'HH:mm:ssXXX
Email for Activity Map Date with Notification Type TASK_FAILED sent from dmadmin to x.x@xxx.xx  with the message null
Activity Map Date's workitem Paused : 'A358286120'

A première vue, cela est étonnant car le pattern est valide, en faisant un test dans du code Java, et qu'il respecte la documentation.

Or le debugger utilise la jre embarquée dans xCP Designer, dans le répertoire jre, et dont la version est une 1.6.

D:\xCPDesigner\2.1.11\jre\bin>java -version
java version "1.6.0_32"
Java(TM) SE Runtime Environment (build 1.6.0_32-b05)
Java HotSpot(TM) Client VM (build 20.7-b02, mixed mode)

Or, le pattern XXX pour le format d'une date n'est pas reconnu en version 1.6, mais à partir de la 1.7.

Par conséquent, il est impossible de debugger localement, mais une fois déployée le fonctionnement est correct.