tutorial generador bech
TRANSCRIPT
Tutorial del Generador
El sentido de la vida 2.0
• A partir de la documentación provista por el banco y Technisys se crea un archivo csv donde se codifican los mapeos entre los campos del modelo de datos de Technisys y los campos de CICS del banco.
• El generador toma esta información y genera las transformaciones Channel2Backend.xsl y Backend2Channel.xsl.
• Si bien el generador es una herramienta muy útil como kick off, a veces es necesario modificar los archivos generados, aunque se está trabajando para que no sea necesario.
Introducción:
Workflow
• Los canales llaman a CMM a través del TMF.
• A CMM le llega un xml con los datos del servicio a ejecutar.
• Una vez que se determina que se debe invocar un servicio CICS, el Workflow llama al QueryServiceFlow.
• El QueryServiceFlow, dependiendo del serviceId del mensaje ejecuta la transformación Channel2Backend.xsl y genera la traza de entrada para el CICS.
Workflow (cont.)
• La traza obtenida es enviada a CICS donde es procesada y devuelve otra traza de respuesta.
• El QueryServiceFlow obtiene la traza de respuesta y le aplica la transformación Backend2Channel.xsl para devolver un xml a TMF y este luego se lo enviará al canal que inició la transacción.
Formatos de documentos CICSHEADER-STAF X(109) Parámetros de comunicación
WS-OPCION X(0001) Opción (I= Ingreso ó E=Elimina)
WS-NRT-CLI X(0009) Rut Cliente
WS-DRT-CLI X(0001) DV Rut Cliente
WS-COD-BCO X(0003) Código Banco
WS-NUM-SEQ X(0010) Número Secuencia
......
Formato de documentos CMM
String_s CICS/PLMC1075/WS-OPCION
Opción.Valor fijo E
customerIdentification.identificationNumber
Sí String_s CICS/PLMC1075/WS-NRT-CLI
Rut Cliente
customerIdentification.identificationComplement
Sí String_s CICS/PLMC1075/WS-DRT-CLI
Digito Verificador cliente
frequentlyUsedAccount.frequentlyUsedAccountId
Sí String_s CICS/PLMC1075/WS-NUM-SEQ
Número de secuencia.
Formato del CSV
"coreType=fixed
coreHeaderLenght=109
baseXslIncludedInRequest=EstadoInvokerBaseRequest.xsl
baseXslIncludedInResponse=EstadoInvokerBaseResponse.xsl
serviceVersion=1.0"
Header:
Formato del CSV (Cont.)REQUEST
X, Empiezo a crear las variables
1,customerIdentification
,WS-DRT-CLI,X(0001),identificationComplement,,,,WS-DRT-CLI
,WS-NRT-CLI,X(0009),identificationNumber,,,,WS-NRT-CLI
,customerIdentification
1,frequentlyUsedAccount:1.0:frequentlyUsedAccount:product.financials
,WS-NUM-SEQ,9(010),frequentlyUsedAccountId,,,,WS-NUM-SEQ
,frequentlyUsedAccount:1.0:frequentlyUsedAccount:product.financials
,WS-COD-CNL,X(0003),channelId,,,"getChannelIdFromHeader2CICS{}",WS-COD-CNL
X,Empiezo a escribir el mensaje
,WS-OPCION,X(0001),WS-OPCION,,,"'E'",
,WS-NRT-CLI,X(0009),WS-NRT-CLI,,,"$WS-NRT-CLI",
,WS-DRT-CLI,X(0001),WS-DRT-CLI,,,"$WS-DRT-CLI",
,WS-COD-BCO,X(0003),WS-COD-BCO,X,,,
,WS-NUM-SEQ-N,9(0010),WS-NUM-SEQ-N,,,"$WS-NUM-SEQ",
,WS-COD-PRD-DES,X(0005),WS-COD-PRD-DES,X,,,
Formato del CSV (Cont.)RESPONSE
X,Declaracion de variables
,WS-SAL-COD-RTN,X(03),WS-SAL-COD-RTN,,,,WS-SAL-COD-RTN
,WS-SAL-GLS-RTN,X(30),WS-SAL-GLS-RTN,,,,WS-SAL-GLS-RTN
X,Comienzo a escribir el body
1,generic
,WS-SAL-COD-RTN,X(03),processResultCode,,,"$WS-SAL-COD-RTN",
,generic
Descripción del formato CSV<Quantity>,<NombreEntidad>,<DataTypeAndLength>,<PotentialEntityName>,<Ignore>,<SchemaDat
aType>,<Transformation>,<TargetVaraible>,<AssertType>
0- Quantity: Este campo tiene diferentes funciones dependiendo el valor:o 1: Representa el comienzo de una entidad.o n (con n >1 ) representa el comienzo una colección de elementos.o (vacío): Depende el resto de los parámetros puede ser tomado como la definición de una
variable, escribir un valor, aplicar un template, etc.o X: Toda la línea se ignora, sirve para agregar comentarios
Por ejemplo:
X, Empiezo a crear las variables (Es un comentario)
1,customerIdentification (comienza la entidad customerIdentification)
Descripción del formato CSV<Quantity>,<NombreEntidad>,<DataTypeAndLength>,<PotentialEntityName>,<Ignore>,<SchemaDat
aType>,<Transformation>,<TargetVaraible>,<AssertType>
1- NombreEndidad: Dependiendo el valor de Quantity tiene diferente comportamiento
• Si Quantity es > 0: Se toma comoo <nombreEntidad>:<version>:<attrName>:<attrDataModel>
• Si es vacío y es el nombre de una entidad definida anteriormente se toma como fin de dicha entidad.
• Si es vacío: En caso que no haya un valor en PotentialEntityName se toma este valor como nombre.
Por ejemplo:
1,customerIdentification:1.0:cliente -----> <customerIdentification version="1.0" name="cliente">
1,customerIdentification:::product.financials ------->
<customerIdentification dataModel="product.financials">
Descripción del formato CSV<Quantity>,<NombreEntidad>,<DataTypeAndLength>,<PotentialEntityName>,<Ignore>,<SchemaDat
aType>,<Transformation>,<TargetVaraible>,<AssertType>
2- DataTypeAndLength: Solo cuando Quantity es vacío.
• Determina el tipo y la longitud del campo. Los valores posibles son:o X(<cant>) String de <cant> caractereso 9(<cant>) Integer de <cant> caractereso 9(<cant>)V<cantDec> Real con <cant> de parte entera y <cantDec>
decimales.o B Bool. Solo se usa en los
campos de generic del responseo D Date. Solo se usa en los
campos de generic del response
Por ejemplo:,WS-NRT-CLI,X(0009),identificationNumber,,,,WS-NRT-CLI --->
Es de tipo String de longitud 9. Si el valor es menor se completa con espacios a derecha
,WS-NUM-SEQ,9(010),frequentlyUsedAccountId,,,,WS-NUM-SEQ ----->Es de tipo integer de 10 posiciones. Si el valor es menor se completa con 0 a izquierda
Descripción del formato CSV<Quantity>,<NombreEntidad>,<DataTypeAndLength>,<PotentialEntityName>,<Ignore>,<SchemaDat
aType>,<Transformation>,<TargetVaraible>,<AssertType>
3- PotentialEntityName: Solo cuando Quantity es vacío.
• En caso de estar presente se utilizará como nombre de la entidad.
Por ejemplo:,WS-NRT-CLI,X(0009),identificationNumber,,,,--->
En este caso se crea el elemento identificationNumber
Descripción del formato CSV<Quantity>,<NombreEntidad>,<DataTypeAndLength>,<PotentialEntityName>,<Ignore>,<SchemaDat
aType>,<Transformation>,<TargetVaraible>,<AssertType>
4- Ignore: Solo cuando Quantity es vacío.
• Si hay una X en este lugar se ignora el campo.
Por ejemplo:,WS-SAL-GLS-RTN,X(30),WS-SAL-GLS-RTN,X,,,
En este caso el campo WS-SAL-GLS-RTN no se utiliza en la respuesta y puede ser ignorado.
Descripción del formato CSV<Quantity>,<NombreEntidad>,<DataTypeAndLength>,<PotentialEntityName>,<Ignore>,<SchemaDat
aType>,<Transformation>,<TargetVaraible>,<AssertType>
5- SchemaDataType: No se utiliza actualmente.
Descripción del formato CSV<Quantity>,<NombreEntidad>,<DataTypeAndLength>,<PotentialEntityName>,<Ignore>,<SchemaDat
aType>,<Transformation>,<TargetVaraible>,<AssertType>
6- Transformation: Solo cuando Quantity es vacío.
• En este campo se puede poner llamadas a templates o funciones. Tener en cuenta que debe agregarse entre comillas (").
• Para escribir una variable se utiliza simplemente "$<nombreVariable>"
• En caso de ser un template los parámetros se pasan con la forma "{<key>='value', <key2>='value2',...}"
Por ejemplo:,WS-COD-CNL,X(0003),channelId,,,"getChannelIdFromHeader2CICS{}",WS-COD-CNL
El valor de channelId se obtiene del template getChannelIdFromHeader2CICS
,CA1-WN-NBLOCK,9(03),paginationInfo,,,"getPagInfoValue{infoString=%,searchString='nBlocks'}",El template getPagInfoValue toma 2 parámetros, infoString es el valor del campo que se
está leyendo, osea paginationInfo y searchString es 'nBlocks'
Descripción del formato CSV<Quantity>,<NombreEntidad>,<DataTypeAndLength>,<PotentialEntityName>,<Ignore>,<SchemaDat
aType>,<Transformation>,<TargetVaraible>,<AssertType>
7- TargetVariable: Solo cuando Quantity es vacío.
• En caso de tener algún valor, se crea una variable con ese nombre que almacena el valor.
Por ejemplo:,WS-NRT-CLI,X(0009),identificationNumber,,,,WS-NRT-CLI --->
El valor del campo identificationNumber se guarda en una variable con nombre WS-NRT-CLI.
Descripción del formato CSV<Quantity>,<NombreEntidad>,<DataTypeAndLength>,<PotentialEntityName>,<Ignore>,<SchemaDat
aType>,<Transformation>,<TargetVaraible>,<AssertType>
8- AssertType: Solo cuando Quantity es vacío. (Todavía no es muy utilizado por temas de datos)• Identifica qué elementos serán considerados para autogenerar la validación por assert, y el
tipo de assert. Los tipos de assert tolerados son:o AEqual: Validación por igualdad.o !AEqual: Validación por distinto.o ANull: Validación por igual a null.o !ANull: Validación por distinto de null.
Casos especiales
● Se permite ignorar colecciones completas. Para esto hay que agregar en la definición de la colección un :X al final. Por ejemplo:
25,accounts:X1,account:1.01,subproduct,WS-SUB-PRODUCTO,X(04),subproductId,,,,,subproduct,WS-SUB-PRODUCTO,X(04),mnemonic,,,,,account:1.0,accounts
De este modo, se actualiza la posición para el resto de los elementos, pero no se crea el tag <collection name=”accounts” /> en el resultado.
Casos especiales (cont.)
● Para los servicios que informen la cantidad de repeticiones en la colección final, es posible utilizar esa información para evitar tener elementos. con datos de más si es que el servicio agrega basura al final del mensaje. Para esto hay que agregar a la definición de la colección [<PosInicial>; <Long>] (Notar que el separador es un punto y coma, y no una coma)
25,accounts[90;02]1,account:1.01,subproduct,WS-SUB-PRODUCTO,X(04),subproductId,,,,,subproduct,WS-SUB-PRODUCTO,X(04),mnemonic,,,,,account:1.0,accounts
Casos especiales (cont.)
● Se permite generar los tags de colecciones con un nombre especificado en el CSV, para esto hay que poner:<cantidad>, <nombreTag>:<version>:<attrName> por ejemplo:
25,accounts:1.0:accountsNames1,account:1.01,subproduct,WS-SUB-PRODUCTO,X(04),subproductId,,,,,subproduct,WS-SUB-PRODUCTO,X(04),mnemonic,,,,,account:1.0,accounts
De esta forma se crea un tag <accounts name=”accountsNames”>. En caso de no especificar el :<version>:<attrName> se utilizará la forma por defecto <collection name=”<valor>”>.
Casos especiales (cont.)
● Se agrega la posibilidad de agregar condiciones al código generado. Para eso hay que poner en el CSV lo siguiente
1,choose1,when:<condición>,WC-BCC-PAR-COD-POS,X(07),mnenomic,,,,,when1,when:$juan = $pepe,WC-BCC-PAR-COD-COS,X(07),mnenomic,,,,,when1,otherwise,WC-BCC-PAR-COD-TOS,X(07),mnenomic,,,,,otherwise,choose
Casos especiales (cont.)
Se crea una entidad “choose” cuyos hijos pueden ser uno o más entidades “when” con una condición y cero o una entidad otherwise (sin condición). Hay que tener en cuenta que:
• En el RESPONSE cada rama avanza independientemente la posición, así que todas deberían leer la misma cantidad de datos para que sean consistentes los datos que vengan después.
• Las variables que se crean tienen scope local, así que si las crean dentro del choose no las podrán usar desde afuera.
• Las condiciones no deben contener los siguientes caracteres: coma, dos puntos, > (mayor) o < (menor)