Skip to content

jmsanzg/BufferDescriptor

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

COBOL Buffers for Java

Define a Buffer the same way you define it with COBOL and you’ll be able to manage the byte[] returned by COBOL in a really easy way

Sample of use

Given the following Buffer as you’d declare it with COBOL:

1  CLIENT
5  NAME                   PIC X(50)
5  SURNAME                PIC X(50)
5  BIRTHDAY               PIC X(10)
5  MAX_PURCHASE_ALLOWED   PIC 9(10)
5  CONTACT OCCURS 3
10 DESCRIPTION            PIC X(20)
10 PHONE                  PIC X(20)

To define the previous Buffer in Java using BufferDescriptor:

BufferDescriptor bd = new BufferBuilder()
    .addDataDescription(1, "CLIENT")
        .addDataDescription(5, "NAME", "X(50)")
        .addDataDescription(5, "SURNAME", "X(50)")
        .addDataDescription(5, "BIRTHDAY", "X(10)")
        .addDataDescription(5, "MAX_PURCHASE_ALLOWED", "9(10)")
        .addDataDescription(5, "CONTACT", 3);
            .addDataDescription(10, "DESCRIPTION", "X(20)")
            .addDataDescription(10, "PHONE", "X(20)")
            .endDataDescription();

And, after that, fill it with the byte[] received from COBOL:

bd.setBuffer(byteArrayReceived);

//...

String name = bd.getString("NAME");
String surname = bd.getString("SURNAME");
Calendar birthday = bd.getDate("BIRTHDAY", "dd/MM/yyyy");
long maxPurchaseAllowed = bd.getLong("MAX_PURCHASE_ALLOWED");
String description1 = bd.getString("DESCRIPTION(1)");
String phone1 = bd.getString("PHONE(1)");
String description2 = bd.getString("DESCRIPTION(2)");
String phone2 = bd.getString("PHONE(2)");
String description3 = bd.getString("DESCRIPTION(3)");
String phone3 = bd.getString("PHONE(3)");

Or set the values and then get a byte[] so it can be sent to your COBOL program

bd.setString("NAME", "JOSE");
bd.setString("SURNAME", "SANZ");
Calendar birthday = Calendar.getInstance();
bd.setDate("BIRTHDAY", birthday);
bd.setLong("MAX_PURCHASE_ALLOWED", 10000);
bd.setString("DESCRIPTION(1)", "LANDLINE");
bd.setString("PHONE(1)", "555-5555555);
bd.setString("DESCRIPTION(2)", "MOBILE");
bd.setString("PHONE(2)", "555-111111");

byte[] buffer = bd.getBuffer();

As an extra, if you have some nested fields each one with an OCCURS like the following buffer:

BufferDescriptor bd = new BufferBuilder()
    .addDataDescription(1, "CLIENT")
        .addDataDescription(5, "A", 3)
            .addDataDescription(10, "B", 4)
                .addDataDescription(15, "C", 5)
                    .addDataDescription(20, "D", "X")
                    .endDataDescription();

To access to the D field you have two ways:


// First way
String d = bd.getString(“D(3)(4)(5)”);

// Second way
String d = bd.getString(“D”, 3, 4, 5);

The second way is best when you want to put that inside loops or have a variable that holds the value of the index. This way you don’t have to compose the String of the field name. This solution allows an unlimited amount of nested fields.