Mapping date xCP Designer
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.
Votre avis
Nobody voted on this yet
|
|
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.
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.
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.