Using Custom Records to Pass Group Items

The CustomRecord interface in com.microfocus.cobol.lang enables you to pass group items to a legacy COBOL program, when using cobCall() and cobrcall().

The CustomRecord interface is:

package com.microfocus.cobol.lang;  
public interface CustomRecord  
{  
  public Object[] getParameters();  
  public void setParameters(Object[] parms);  
}

In the demo , the data item customerDetails is defined as follows:

  
  01 customerDetails.  
         03 customerName       pic x(30).  
         03 customerAddress    pic x(30).  
         03 customerRef        pic 9(6).

A Java implementation could be:

import com.microfocus.cobol.lang.*;  
import java.text.*; 

public class RecordData implements 
             com.microfocus.cobol.lang.CustomRecord  
{  
    private String customerName;  
    private StringBuffer customerAddress;  
    private int customerRef;
    RecordData(String name, String address, int ref)  
    {  
      customerName = name;  
      customerAddress = new StringBuffer(address);  
      customerRef = ref;  
    }
    public String getCustomerName()  
    {  
      return this.customerName;  
    }
    public String getCustomerAddress()  
    {  
      return this.customerAddress.toString();  
    }
    public int getCustomerRef()  
    {  
      return this.customerRef;  
    }
    public Object[] getParameters()
    {  
      String strCustomerRef = 
		          Integer.toString(this.customerRef);    	  
      while(strCustomerRef.length() <  6)  
      {  
         strCustomerRef = "0"+strCustomerRef;  
      }
      customerAddress.setLength(30);       
		          /* must ensure length is right! */  
      customerAddress.ensureCapacity(30);
      return new ParameterList()  
        .add(new Pointer(this.customerName,30))  
        .add(this.customerAddress)  
        .add(strCustomerRef.getBytes())  
        .getArguments();  
    }
    public void setParameters(Object[] parms)  
    {  
      Pointer ptr = (Pointer)parms[0];  
      this.customerName = ptr.toString();   
      this.customerAddress = (StringBuffer)parms[1];  
      byte[] byteCustomerRef = (byte[])parms[2];  
      this.customerRef = 
		      Integer.parseInt(new String(byteCustomerRef));  
    }
    public String toString()  
    {  
      return "Customer Name : "+this.customerName+"\n"+  
          "Customer Address : "+this.customerAddress+"\n"+  
          "Customer Ref     : "+this.customerRef;  
    }  
}

The Java program could call the COBOL program as follows:

cobcall("RecordDemo",new ParameterList().add(
              new RecordData(myname, myaddress, myref)));

See also Adding Parameters Using ParameterList() in the chapter Java Data Types.