An example of a structured record part with a substructured array is as follows:
Record myPart type basicRecord
10 MyTopStructure CHAR(20)[5];
20 MyStructureField01 CHAR(10);
20 MyStructureField02 CHAR(10);
end
Later descriptions refer to the wrapper classes for a given program as the program wrapper class, the parameter wrapper classes, the dynamic array wrapper classes, and the substructured-field-array wrapper classes.
EGL generates a BeanInfo class for each parameter wrapper class, dynamic array wrapper class, or substructured-field-array wrapper class. The BeanInfo class allows the related wrapper class to be used as a Java-compliant Java bean. You probably will not interact with the BeanInfo class.
When you generate a wrapper, the parameter list of the called program cannot include parameters of type BLOB, CLOB, Dictionary, ArrayDictionary, or non-structured record.
import com.ibm.javart.JavartException;
import com.ibm.javart.calls.*;
public class MyNativeClass
{
/* declare a variable for middleware */
PowerServer powerServer = null;
powerServer = new PowerServerImpl();
}
The capabilities provided by a SharedResourcePowerServer object are more extensive than those provided by a PowerServer object. For details on the former, see "SharedResourcePowerServer."
If you do not specify a PowerServer object, the EGL runtime provides one for you.
// use of a PowerServer object is optional
myProgram = new MyprogramWrapper(PowerServer);
You can provide a PowerServer object when invoking the wrapper object or by calling the wrapper-object method setPowerServer.
Mypart myParm = myProgram.getMyParm();
Mypart2 myParm2 = myProgram.getMyParm2();
myRecArrayVar myParm3 = myProgram.getMyParm3();
For details on interacting with dynamic arrays, see Dynamic array wrapper classes.
myProgram.setMyRecord(inputValue);
The userid and password are not used for database access.
myProgram.callOptions.setUserID("myID");
myProgram.callOptions.setPassword("myWord");
myUserID = myProgram.callOptions.getUserID();
myPassword = myProgram.callOptions.getPassword();
// Connect to the database
Connection con = DriverManager.getConnection( "jdbc:db2://host:50000/db", "user", "pwd" );
// Turn off auto-commit mode to enable transactions
con.setAutoCommit( false );
// Create the wrapper and give it the connection
MWrapper mw = new MWrapper();
mw.addConnection( con, "con1" );
// Run the program
mw.execute();
// Commit the work and clean up
mw.getPowerServer().commit();
mw.getPowerServer().close();
con.close();
int returnValue = myProgram.returnCode();
myProgram.execute();
myProgram.setParm1( 2 );
myProgram.setParm2( "sell" );
myProgram.execute();
myProgram.call( 2, "sell" );
powerServer.commit();
powerServer.rollBack();
When using a single PowerServer object, the EGL runtime might commit a change made with an initial connection, but might encounter a problem and fail when committing a change made with a second connection. After a failure, your data is left in an inconsistent state because the commit is a one-phase commit, rather than a two-phase commit such that all resources are committed or none of them are.
You close the middleware object to end the EGL run unit and to allow for garbage collection:
if ( powerServer != null )
{
try
{
powerServer.close();
powerServer = null;
}
catch ( JavartException error )
{
System.out.println( "Error closing middleware"
+ error.getMessage() );
System.exit( 8 );
}
}
The program wrapper class includes a private instance variable for each parameter in the generated program. If the parameter is a record or form, the variable refers to an instance of the related parameter wrapper class. If the parameter is based on a DataItem part, the variable has a primitive Java type.
A table at the end of this help page describes the conversions between EGL and Java types.
purposeParmname()
setPassword(passWord)
setUserid(userid)
getPassword()
getUserid()
The run unit can use previously specified connections, if any. However, if the run unit closes a given connection, the connection is released and cannot be reopened. That last restriction is true whether the close occurs in the EGL program or (as shown in an earlier section) by invocation of powerServer.close().
public void addConnection
(java.sql.Connection con, java.lang.String name, int disconnectOption)
throws java.lang.NullPointerException, java.lang.IllegalArgumentException, com.ibm.javart.JavartException
powerServer.close() commits work and ends the EGL run unit. For all other disconnect options, the end of the run unit closes any open connections.
All but the first of the previous values have the same meanings as values that you can specify when invoking the system function sqlLib.connect(). The equivalent values are as follows, from the EGL enumeration egl.io.sql.DisconnectKind: DisconnectKind.automatic, DisconnectKind.conditional, DisconnectKind.explicit. A value equivalent to DISCONNECT_NEVER is not valid when you invoke sqlLib.connect().
The PropertyChange event is described in the JavaBean specification of Oracle.
Mypart myRecWrapperObject = myProgram.getMyrecord();
In this case, you are using the memory allocated by the program wrapper object.
You also can use the parameter wrapper class to declare memory, as is necessary if you invoke the call method (rather than the execute method) of the program object.
purposesiName()
purposesiNameNullIndicator()
ParameterClassname.ArrayClassName
Record CompanyPart type basicRecord
10 Departments CHAR(20)[5];
20 CountryCode CHAR(10);
20 FunctionCode CHAR(10)[3];
30 FunctionCategory CHAR(4);
30 FunctionDetail CHAR(6);
end
If the parameter Company is based on CompanyPart, you use the string CompanyPart.Departments as the name of the inner class.
An inner class of an inner class extends use of a dotted syntax. In this example, you use the symbol CompanyPart.Departments.Functioncode as the name of the inner class of Departments.
For additional details on how the substructured-field-array wrapper classes are named, see Output of Java wrapper generation.
Program myProgram(intParms int[], recParms MyRec[])
The name of the dynamic array wrapper classes are IntParmsArray and MyRecArray.
IntParmsArray myIntArrayVar = myProgram.getIntParms();
MyRecArray myRecArrayVar = myProgram.getRecParms();
After declaring the variables for each dynamic array, you might add elements:
// adding to an array of Java primitives
// is a one-step process
myIntArrayVar.add(new Integer(5));
// adding to an array of records or forms
// requires multiple steps; in this case,
// begin by allocating a new record object
MyRec myLocalRec = (MyRec)myRecArrayVar.makeNewElement();
// the steps to assign values are not shown
// in this example; but after you assign values,
// add the record to the array
myRecArrayVar.add(myLocalRec);
// next, run the program
myProgram.execute();
// when the program returns, you can determine
// the number of elements in the array
int myIntArrayVarSize = myIntArrayVar.size();
// get the first element of the integer array
// and cast it to an Integer object
Integer firstIntElement = (Integer)myIntArrayVar.get(0);
// get the second element of the record array
// and cast it to a MyRec object
MyRec secondRecElement = (MyRec)myRecArrayVar.get(1);
As suggested by that example, EGL provides several methods for manipulating the variables that you declared.
Method of the dynamic array class | Purpose |
---|---|
add(int, Object) | To insert an object at the position specified by int and to shift the current and subsequent elements to the right. |
add(Object) | To append an object to the end of the dynamic array. |
addAll(ArrayList) | To append an ArrayList to the end of the dynamic array. |
get() | To retrieve the ArrayList object that contains all elements in the array |
get(int) | To retrieve the element that is in the position specified by int |
makeNewElement() | To allocate a new element of the array-specific type and to retrieve that element, without adding that element to the dynamic array. |
maxSize() | To retrieve an integer that indicates the maximum (but not actual) number of elements in the dynamic array |
remove(int) | To remove the element that is in the position specified by int |
set(ArrayList) | To use the specified ArrayList as a replacement for the dynamic array |
set(int, Object) | To use the specified object as a replacement for the element that is in the position specified by int |
size() | To retrieve the number of elements that are in the dynamic array |
The next table indicates the relationship of EGL primitive types in the generated program and the Java data types in the generated wrapper.
EGL primitive type | Length in chars or digits | Length in bytes | Decimals | Java data type | Maximum precision in Java |
---|---|---|---|---|---|
BIN, SMALLINT | 4 | 2 | 0 | short | 4 |
BIN, INT | 9 | 4 | 0 | int | 9 |
BIN, BIGINT | 18 | 8 | 0 | long | 18 |
BIN | 4 | 2 | >0 | float | 4 |
BIN | 9 | 4 | >0 | double | 15 |
BIN | 18 | 8 | >0 | double | 15 |
BOOLEAN | 1 | 1 | NA | Boolean | NA |
CHAR | 1-32767 | 2-32766 | NA | String | NA |
DBCHAR | 1-16383 | 1-32767 | NA | String | NA |
DATE | 8 | 8 | 0 | java.sql.Date | NA |
DECIMAL, MONEY, PACF | 1-3 | 1-2 | 0 | short | 4 |
DECIMAL, MONEY, PACF | 4-9 | 3-5 | 0 | int | 9 |
DECIMAL, MONEY, PACF | 10-18 | 6-10 | 0 | long | 18 |
DECIMAL, MONEY, PACF | 19-32 | 10-17 | 0 | java.math.BigInteger | 32 |
DECIMAL, MONEY, PACF | 1-5 | 1-3 | >0 | float | 6 |
DECIMAL, MONEY, PACF | 7-18 | 4-10 | >0 | double | 15 |
DECIMAL, MONEY, PACF | 19-32 | 10-17 | >0 | java.math.BigDecimal | 32 |
FLOAT | 18 | 8 | >0 | double | 15 |
HEX | 2-75534 | 1-32767 | NA | byte[] | NA |
INTERVAL (month- or second-span) | 1-21 | 2-22 | 0 | String | NA |
MBCHAR | 1-32767 | 1-32767 | NA | String | NA |
NUM, NUMC | 1-4 | 1-4 | 0 | short | 4 |
NUM, NUMC | 5-9 | 5-9 | 0 | int | 9 |
NUM, NUMC | 10-18 | 10-18 | 0 | long | 18 |
NUM, NUMC | 19-32 | 19-32 | 0 | java.math.BigInteger | 32 |
NUM, NUMC | 1-6 | 1-6 | >0 | float | 6 |
NUM, NUMC | 7-18 | 7-18 | >0 | double | 15 |
NUM, NUMC | 19-32 | 19-32 | >0 | java.math.BigDecimal | 32 |
SMALLFLOAT | 9 | 4 | >0 | float | 6 |
STRING | 1-16383 | 2-32766 | NA | String | NA |
TIME | 6 | 6 | 0 | java.sql.Time | NA |
TIMESTAMP | 1-20 | 1-20 | 0 | java.sql. Timestamp | NA |
UNICODE | 1-16383 | 2-32766 | NA | String | NA |