Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
¿Qué son los simplificadores de datos en AWS Blu Age?
En los sistemas mainframe y de gama media (denominados en el siguiente tema sistemas «heredados»), los lenguajes de programación de uso frecuente, como el PL/ICOBOL, o RPG proporcionan un acceso de bajo nivel a la memoria. Este acceso se centra en el diseño de la memoria, al que se accede mediante tipos nativos, como zonificados, empaquetados o alfanuméricos, y es posible que también se agreguen mediante grupos o matrices.
En un programa determinado coexiste una combinación de accesos a un determinado fragmento de memoria, a través de campos de tipos definidos y acceso directo a bytes (memoria sin procesar). Por ejemplo, los COBOL programas pasan los argumentos a las personas que llaman como conjuntos contiguos de bytes (LINKAGE) o leen y escriben los datos de los archivos de la misma manera (registros), al tiempo que interpretan dichos rangos de memoria con campos mecanografiados organizados en cuadernos.
Estas combinaciones de acceso sin proceso y estructurado a la memoria, la dependencia de un diseño de memoria preciso a nivel de bytes y los tipos heredados, como zonificados o empaquetados, son características que no están disponibles de forma nativa ni son de fácil acceso en el entorno de programación Java.
Como parte de la solución AWS Blu Age para modernizar los programas heredados a Java, la biblioteca Data Simplifier proporciona estas construcciones a los programas Java modernizados y las expone de una manera que resulta lo más familiar posible para los desarrolladores de Java (captres/setters, matrices de bytes, basadas en clases). Se trata de una dependencia fundamental para el código Java modernizado generado a partir de esos programas.
Para simplificar, la mayoría de las siguientes explicaciones se basan en COBOL construcciones, pero puede usar las mismas API para la modernización del PL1 diseño de RPG datos, ya que la mayoría de los conceptos son similares.
Clases principales
Para facilitar la lectura, en este documento se utilizan los nombres abreviados en Java de las API interfaces y clases de AWS Blu Age. Para obtener más información, consulte FQNde los tipos de Java discutidos.
Representación de la memoria de bajo nivel
En el nivel más bajo, la memoria (un rango contiguo de bytes al que se puede acceder de forma rápida y aleatoria) está representada por la interfaz de Record
. Esta interfaz es esencialmente una abstracción de una matriz de bytes de un tamaño fijo. Como tal, proporciona setters y getters capaces de acceder o modificar los bytes subyacentes.
Representación de datos estructurados
Para representar datos estructurados, como «01 elementos de datos» o «01 cuadernos», como se encuentran en COBOL DATADIVISION, se utilizan subclases de la RecordEntity
clase. Por lo general, no se escriben a mano, sino que se generan con las herramientas de modernización de la Era AWS Blu a partir de las correspondientes construcciones heredadas. Sigue siendo útil conocer su estructura principal y API entender cómo las utiliza el código de un programa modernizado. En el caso deCOBOL, ese código es Java generado a partir de sus PROCEDUREDIVISION.
El código generado representa cada “01 elemento de datos” con una subclase RecordEntity
; cada campo elemental o agregado que lo compone se representa como un campo Java privado, organizado en forma de árbol (cada elemento tiene un elemento principal, excepto el raíz).
A modo ilustrativo, aquí hay un elemento de COBOL datos de ejemplo, seguido del correspondiente código generado por AWS Blu Age que lo moderniza:
01 TST2. 02 FILLER PIC X(4). 02 F1 PIC 9(2) VALUE 42. 02 FILLER PIC X. 02 PIC 9(3) VALUE 123. 02 F2 PIC X VALUE 'A'.
public class Tst2 extends RecordEntity { private final Group root = new Group(getData()).named("TST2"); private final Filler filler = new Filler(root,new AlphanumericType(4)); private final Elementary f1 = new Elementary(root,new ZonedType(2, 0, false),new BigDecimal("42")).named("F1"); private final Filler filler1 = new Filler(root,new AlphanumericType(1)); private final Filler filler2 = new Filler(root,new ZonedType(3, 0, false),new BigDecimal("123")); private final Elementary f2 = new Elementary(root,new AlphanumericType(1),"A").named("F2"); /** * Instantiate a new Tst2 with a default record. * @param configuration the configuration */ public Tst2(Configuration configuration) { super(configuration); setupRoot(root); } /** * Instantiate a new Tst2 bound to the provided record. * @param configuration the configuration * @param record the existing record to bind */ public Tst2(Configuration configuration, RecordAdaptable record) { super(configuration); setupRoot(root, record); } /** * Gets the reference for attribute f1. * @return the f1 attribute reference */ public ElementaryRangeReference getF1Reference() { return f1.getReference(); } /* * * Getter for f1 attribute. * @return f1 attribute */ public int getF1() { return f1.getValue(); } /** * Setter for f1 attribute. * @param f1 the new value of f1 */ public void setF1(int f1) { this.f1.setValue(f1); } /** * Gets the reference for attribute f2. * @return the f2 attribute reference */ public ElementaryRangeReference getF2Reference() { return f2.getReference(); } /** * Getter for f2 attribute. * @return f2 attribute */ public String getF2() { return f2.getValue(); } /** * Setter for f2 attribute. * @param f2 the new value of f2 */ public void setF2(String f2) { this.f2.setValue(f2); } }
Campos elementales
Los campos de clase Elementary
(o Filler
, cuando no tienen nombre) representan una “hoja” de la estructura de datos heredada. Están asociados a un espacio contiguo de bytes subyacentes (“rango”) y, por lo general, tienen un tipo (posiblemente parametrizado) que expresa cómo interpretar y modificar esos bytes (mediante la “decodificación” y la “codificación”, respectivamente, de un valor desde/hacia una matriz de bytes).
Todos los tipos elementales son subclases de RangeType
. Los tipos frecuentes son:
COBOLEscriba | Tipo de Data Simplifier |
---|---|
|
|
|
|
|
|
|
|
Campos agregados
Los campos agregados organizan el diseño de memoria de sus contenidos (otros agregados o campos elementales). No tienen un tipo elemental en sí mismos.
Los campos Group
representan campos contiguos en la memoria. Cada uno de sus campos contenidos está dispuesto en el mismo orden en la memoria, el primer campo tiene un desplazamiento 0
con respecto a la posición del campo de grupo en la memoria, el segundo campo tiene un desplazamiento 0 + (size in bytes of first field)
, etc. Se utilizan para representar secuencias de COBOL campos en el mismo campo contenedor.
Los campos Union
representan varios campos que acceden a la misma memoria. Cada uno de sus campos contenidos está dispuesto con un desplazamiento 0
con respecto a la posición del campo de unión en la memoria. Por ejemplo, se utilizan para representar el constructo COBOL REDEFINES «» (el primer hijo de la Unión es el elemento de datos redefinido, el segundo hijo es su primera redefinición, etc.).
Los campos matriciales (subclases de Repetition
) representan la repetición, en la memoria, del diseño de su campo secundario (ya sea un agregado en sí mismo o un elemento elemental). Diseñan un número determinado de estos diseños secundarios en la memoria, cada uno de los cuales tiene un desplazamiento index * (size in bytes of child)
. Se utilizan para representar COBOL «OCCURS» constructos.
Elementos primitivos
En algunos casos de modernización, las «primitivas» también se pueden utilizar para presentar elementos de datos «raíz» independientes. Su uso es muy similarRecordEntity
, pero no provienen de él, ni se basan en el código generado. En cambio, el motor de ejecución de AWS Blu Age los proporciona directamente como subclases de la Primitive
interfaz. Algunos ejemplos de estas clases proporcionadas son Alphanumeric
oZonedDecimal
.
Enlace y acceso a los datos
La asociación entre los datos estructurados y los datos subyacentes se puede realizar de varias maneras.
Una interfaz importante para este propósito es RecordAdaptable
, la cual se utiliza para obtener un Record
que ofrece una “vista modificable” de los datos subyacentes de RecordAdaptable
. Como veremos a continuación, varias clases implementan RecordAdaptable
. Recíprocamente, AWS Blu Age APIs y la manipulación de código de memoria de bajo nivel (como argumentos de programas, registros de E/S de archivos, CICS área de comunicación, memoria asignada...) suelen esperar a RecordAdaptable
como identificador de esa memoria.
En el caso de la COBOL modernización, la mayoría de los elementos de datos están asociados a una memoria que permanecerá fija durante el tiempo de ejecución del programa correspondiente. Para ello, RecordEntity
las subclases se instancian una vez en un objeto principal generado (el contexto del programa) y se encargan de instanciar su subyacenteRecord
, en función del tamaño del byte. RecordEntity
En otros COBOL casos, como al asociar LINKAGE elementos a los argumentos del programa o modernizar la construcción SET ADDRESS OF, una RecordEntity
instancia debe estar asociada a una proporcionada. RecordAdaptable
Para ello, existen dos mecanismos:
-
Si la instancia de
RecordEntity
ya existe, se puede usar el métodoRecordEntity.bind(RecordAdaptable)
(heredado deBindable
) para hacer que esta instancia “apunte” a esteRecordAdaptable
. Cualquier getter o setter al que se invoque enRecordEntity
estará respaldado (lectura o escritura de bytes) por los bytes delRecordAdaptable
subyacente. -
Si se va a crear una instancia de
RecordEntity
, hay disponible un constructor generado que acepte aRecordAdaptable
.
Por el contrario, se puede acceder al Record
actualmente vinculado a los datos estructurados. Para ello, RecordEntity
implementa RecordAdaptable
, por lo que se getRecord()
puede invocar en cualquier instancia de este tipo.
Por último, muchos COBOL CICS verbos requieren acceso a un solo campo para poder leerlos o escribirlos. La clase RangeReference
se usa para representar dicho acceso. Sus instancias se pueden obtener a partir de los métodos getXXXReference()
generados para RecordEntity
(XXX
es el campo al que se accede) y pasarlas a los métodos de tiempo de ejecución. RangeReference
se utiliza normalmente para acceder a campos enteros RecordEntity
o Group
, mientras que su subclase ElementaryRangeReference
representa los accesos a los campos Elementary
.
Tenga en cuenta que la mayoría de las observaciones anteriores se aplican a Primitive
las subclases, ya que se esfuerzan por implementar un comportamiento similar al RecordEntity
que proporciona el tiempo de ejecución de AWS Blu Age (en lugar del código generado). Con este propósito, todas las subclases de Primitive
implementan las interfaces RecordAdaptable
ElementaryRangeReference
y Bindable
de modo que se puedan utilizar en lugar de las subclases RecordEntity
y los campos elementales.
FQNde los tipos de Java discutidos
La siguiente tabla muestra los nombres completos calificados de los tipos de Java analizados en esta sección.
Nombre corto | Nombre completo calificado |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|