O que são simplificadores de dados no AWS Blu Age - AWS Modernização do mainframe

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

O que são simplificadores de dados no AWS Blu Age

Em sistemas mainframe e midrange (referidos no tópico a seguir como sistemas “antigos”), as linguagens de programação usadas com frequência, como COBOL, PL/I ou RPG, fornecem acesso de baixo nível à memória. Esse acesso se concentra no layout de memória acessado por meio de tipos nativos, como zoneados, compactados ou alfanuméricos, possivelmente também agregados por meio de grupos ou matrizes.

Uma mistura de acessos a uma determinada parte da memória, por meio de campos digitados e como acesso direto a bytes (memória bruta), coexiste em um determinado programa. Por exemplo, os programas COBOL passarão argumentos para os chamadores como conjuntos contíguos de bytes (LINKAGE) ou lerão e gravarão dados de arquivos da mesma maneira (registros), enquanto interpretam esses intervalos de memória com campos digitados organizados em cadernos.

Essas combinações de acesso bruto e estruturado à memória, a dependência de um layout de memória preciso em nível de byte e tipos antigos, como zoneados ou compactados, são recursos que não estão disponíveis de forma nativa nem facilmente no ambiente de programação Java.

Como parte da solução AWS Blu Age para modernizar programas legados para Java, a biblioteca Data Simplifier fornece essas construções para programas Java modernizados e as expõe de uma forma que seja o mais familiar possível para os desenvolvedores Java (getters/setters, matrizes de bytes, baseadas em classes). É uma dependência central do código Java modernizado gerado a partir desses programas.

Para simplificar, a maioria das explicações a seguir é baseada em construções COBOL, mas você pode usar a mesma API para ambas PL1 e para a modernização do layout de dados de RPG, já que a maioria dos conceitos é semelhante.

Classes principais

Para facilitar a leitura, este documento usa os nomes abreviados Java das interfaces e classes da API AWS Blu Age. Para obter mais informações, consulte FQN dos tipos de Java discutidos.

Representação de baixo nível

No nível mais baixo, a memória (uma faixa contígua de bytes acessível de forma rápida e aleatória) é representada pela interface Record. Essa interface é essencialmente uma abstração de uma matriz de bytes de tamanho fixo. Dessa forma, ele fornece setters e getters capazes de acessar ou modificar os bytes subjacentes.

Representação de dados estruturados

Para representar dados estruturados, como “01 itens de dados” ou “01 cadernos”, conforme encontrado em COBOL DATA DIVISION, são usadas subclasses da RecordEntity classe. Normalmente, eles não são escritos à mão, mas gerados pelas ferramentas de modernização do AWS Blu Age a partir das construções legadas correspondentes. Ainda é útil conhecer sua estrutura principal e sua API, para que você possa entender como o código em um programa modernizado as usa. No caso do COBOL, esse código é gerado em Java a partir de sua DIVISÃO DE PROCEDIMENTOS.

O código gerado representa cada “01 item de dados” com uma RecordEntity subclasse; cada campo elementar ou agregado que o compõe é representado como um campo Java privado, organizado como uma árvore (cada item tem um pai, exceto o raiz).

Para fins ilustrativos, aqui está um exemplo de item de dados COBOL, seguido pelo código correspondente gerado pelo AWS Blu Age que o 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 elementares

Os campos de classe Elementary (ou Filler, quando não nomeados) representam uma “folha” da estrutura de dados antiga. Eles estão associados a uma extensão contígua de bytes subjacentes (“intervalo”) e geralmente têm um tipo (possivelmente parametrizado) que expressa como interpretar e modificar esses bytes (“decodificando” e “codificando”, respectivamente, um valor de/para uma matriz de bytes).

Todos os tipos elementares são subclasses de RangeType. Os tipos comuns são:

Tipo COBOL Tipo de simplificador de dados

PIC X(n)

AlphanumericType

PIC 9(n)

ZonedType

PIC 9(n) COMP-3

PackedType

PIC 9(n) COMP-5

BinaryType

Agregar os campos

Os campos agregados organizam o layout de memória de seus conteúdos (outros agregados ou campos elementares). Eles próprios não têm um tipo elementar.

Campos de Group representam campos contíguos na memória. Cada um dos campos contidos é disposto na mesma ordem na memória, o primeiro campo está em deslocamento em 0 relação à posição do campo do grupo na memória, o segundo campo em deslocamento0 + (size in bytes of first field), etc. Eles são usados para representar sequências de campos COBOL sob o mesmo campo contendo.

Campos de Union representam vários campos acessando a mesma memória. Cada um dos campos contidos é disposto em deslocamento em 0 relação à posição do campo de união na memória. Eles são usados, por exemplo, para representar a estrutura COBOL “REDEFINES” (os primeiros filhos da União sendo o item de dados redefinido, os segundos filhos sendo sua primeira redefinição, etc.).

Os campos de matriz (subclasses de Repetition) representam a repetição, na memória, do layout de seu campo filho (seja um agregado em si ou um item elementar). Eles apresentam um determinado número desses layouts infantis na memória, cada um em offset index * (size in bytes of child). Eles são usados para representar estruturas COBOL “OCCURS”.

Primitivos

Em alguns casos de modernização, “Primitivos” também podem ser usados para apresentar itens de dados “raiz” independentes. Eles são muito semelhantes em uso a RecordEntity, mas não herdam dele, nem são baseados no código gerado. Em vez disso, eles são fornecidos diretamente pelo tempo de execução do AWS Blu Age como subclasses da Primitive interface. Exemplos dessas aulas fornecidas são Alphanumeric ou ZonedDecimal.

Vinculação e acesso a dados

A associação entre dados estruturados e dados subjacentes pode ser feita de várias maneiras.

Uma interface importante para esse propósito é RecordAdaptable a que é usada para obter Record uma “visão gravável” dos dados RecordAdaptable subjacentes. Como veremos abaixo, várias classes são implementadasRecordAdaptable. Reciprocamente, o AWS Blu Age APIs e o código que manipula a memória de baixo nível (como argumentos de programas, registros de E/S de arquivos, área de comunicação do CICS, memória alocada...) geralmente esperam um como um identificador para essa memória. RecordAdaptable

No caso de modernização do COBOL, a maioria dos itens de dados está associada à memória, que será corrigida durante a vida útil da execução do programa correspondente. Para isso, as subclasses RecordEntity são instanciadas uma vez em um objeto principal gerado (o contexto do programa) e se encarregarão de instanciar o Record subjacente, com base no tamanho do byte de RecordEntity.

Em outros casos de COBOL, como associar elementos LINKAGE a argumentos do programa ou modernizar a estrutura SET ADDRESS OF, uma instância RecordEntity deve ser associada a um RecordAdaptable fornecido. Para isso, existem dois mecanismos:

  • se a instância RecordEntity já existir, o método RecordEntity.bind(RecordAdaptable) (herdado de Bindable) pode ser usado para fazer essa instância “apontar” para RecordAdaptable. Qualquer getter ou setter chamado no RecordEntity será então apoiado (leitura ou gravação de bytes) pelos bytes RecordAdaptable subjacentes.

  • se RecordEntity for para ser instanciado, um construtor gerado aceitando a estará disponível RecordAdaptable.

Por outro lado, os dados Record atualmente vinculados aos dados estruturados podem ser acessados. Para isso, RecordEntity implementosRecordAdaptable, portanto, getRecord() podem ser chamados em qualquer instância desse tipo.

Finalmente, muitos verbos COBOL ou CICS exigem acesso a um único campo, para fins de leitura ou escrita. A RangeReference classe é usada para representar esse acesso. Suas instâncias podem ser obtidas a partir de métodos getXXXReference() gerados de RecordEntity (XXX sendo o campo acessado) e passadas para métodos de runtime. RangeReference normalmente é usado para acessar todo o RecordEntity ou Group, enquanto sua subclasse ElementaryRangeReference representa acessos aos campos Elementary.

Observe que a maioria das observações acima se aplica às Primitive subclasses, pois elas se esforçam para implementar um comportamento semelhante ao fornecido pelo RecordEntity tempo de execução do AWS Blu Age (em vez do código gerado). Para este propósito, todas as subclasses de Primitive implementam as interfaces RecordAdaptable, ElementaryRangeReference e Bindable de forma a serem utilizáveis no lugar das subclasses RecordEntity e dos campos elementares.

FQN dos tipos de Java discutidos

A tabela a seguir mostra os nomes totalmente qualificados dos tipos Java discutidos nesta seção.

Nome curto Nome totalmente qualificado

Alphanumeric

com.netfective.bluage.gapwalk.datasimplifier.elementary.Alphanumeric

AlphanumericType

com.netfective.bluage.gapwalk.datasimplifier.metadata.type.AlphanumericType

BinaryType

com.netfective.bluage.gapwalk.datasimplifier.metadata.type.BinaryType

Bindable

com.netfective.bluage.gapwalk.datasimplifier.data.Bindable

Elementary

com.netfective.bluage.gapwalk.datasimplifier.data.structure.Elementary

ElementaryRangeReference

com.netfective.bluage.gapwalk.datasimplifier.entity.ElementaryRangeReference

Filler

com.netfective.bluage.gapwalk.datasimplifier.data.structure.Filler

Group

com.netfective.bluage.gapwalk.datasimplifier.data.structure.Group

PackedType

com.netfective.bluage.gapwalk.datasimplifier.metadata.type.PackedType

Primitive

com.netfective.bluage.gapwalk.datasimplifier.elementary.Primitive

RangeReference

com.netfective.bluage.gapwalk.datasimplifier.entity.RangeReference

RangeType

com.netfective.bluage.gapwalk.datasimplifier.metadata.type.RangeType

Record

com.netfective.bluage.gapwalk.datasimplifier.data.Record

RecordAdaptable

com.netfective.bluage.gapwalk.datasimplifier.data.RecordAdaptable

RecordEntity

com.netfective.bluage.gapwalk.datasimplifier.entity.RecordEntity

Repetition

com.netfective.bluage.gapwalk.datasimplifier.data.structure.Repetition

Union

com.netfective.bluage.gapwalk.datasimplifier.data.structure.Union

ZonedDecimal

com.netfective.bluage.gapwalk.datasimplifier.elementary.ZonedDecimal

ZonedType

com.netfective.bluage.gapwalk.datasimplifier.metadata.type.ZonedType