Созданное приложение Java работает на платформе (например, Windows, AIX и Solaris), отличной от платформы информационной системы предприятия (EIS). Администратор транзакций IMS(IMS TM) является прикладной программой IMS в z/OS). Из-за использования разных платформ текстовые данные в сообщениях следует преобразовать из стандарта UNICODE на стороне клиента в стандарт EBCDIC, используемый в приложении IMS.
В зависимости от значения Endian для платформы, на которой работает целевое приложение хоста, и страницы кода, которая используется системой хоста IMS, может понадобиться преобразование формата. По умолчанию это US English (037).
IMS требует добавлять в начало всех сообщений транзакции двухбайтовое поле LL, двухбайтовое поле ZZ и код транзакции, в указанном порядке. Поле LL задает длину сообщения. Поле ZZ содержит двоичный нуль. При вставке входных сообщений в IMS вы должны задать в поле LL размер входного сообщения, а в поле ZZ - 0.
Если приложение IMS возвращает многосегментный вывод или вывод переменной длины, то с помощью определения OUTPUT-MSG языка COBOL можно определить вывод транзакции или создать для него выходное сообщение.
LINKAGE SECTION.
01 INPUT-MSG.
02 IN-LL PICTURE S9(3) COMP.
02 IN-ZZ PICTURE S9(3) COMP.
02 IN-TRCD PICTURE X(5).
02 IN-DATA1 PICTURE X(6).
02 IN-DATA2 PICTURE X(6).
01 OUTPUT-MSG.
02 OUT-ALLSEGS PICTURE X(99) VALUE SPACES.
01 OUTPUT-SEG1.
02 OUT-LL PICTURE S9(3) COMP VALUE +0.
02 OUT-ZZ PICTURE S9(3) COMP VALUE +0.
02 OUT-DATA1 PICTURE X(12) VALUE SPACES.
01 OUTPUT-SEG2.
02 OUT-LL PICTURE S9(3) COMP VALUE +0.
02 OUT-ZZ PICTURE S9(3) COMP VALUE +0.
02 OUT-DATA1 PICTURE X(13) VALUE SPACES.
02 OUT-DATA2 PICTURE X(14) VALUE SPACES.
01 OUTPUT-SEG3.
02 OUT-LL PICTURE S9(3) COMP VALUE +0.
02 OUT-ZZ PICTURE S9(3) COMP VALUE +0.
02 OUT-DATA1 PICTURE X(15) VALUE SPACES.
02 OUT-DATA2 PICTURE X(16) VALUE SPACES.
02 OUT-DATA3 PICTURE X(17) VALUE SPACES.
package sample.ims;
import com.ibm.etools.marshall.util.MarshallIntegerUtils;
import sample.ims.data.*;
public class TestMultiSeg
{
public static void main (String[] args)
{
byte[] segBytes = null;
int srcPos = 0;
int dstPos = 0;
int totalLen = 0;
int remainLen = 0;
byte[] buff;
short LL = 0;
short ZZ = 0;
try {
// ---------------------------------------------------
// Входящее сообщение транзакции IMS заполняется
// данными. Поле LL входящего сообщения задается с
// помощью метода getSize() обработчика формата
// входящего сообщения.
// ---------------------------------------------------
InputMsg input = new InputMsg();
input.setIn__ll((short) input.getSize());
input.setIn__zz((short) 0);
//----------------------------------------------
// за кодом транзакции обратитесь к вашему
// администратору IMS
//-----------------------------------------------
input.setIn__trcd("SKS6 ");
input.setIn__data1("M2 SI1");
input.setIn__data2("M3 SI1");
// ---------------------------------------------------
// Запустите транзакцию IMS. Будет возвращено многосегментное
// выходное сообщение.
// ---------------------------------------------------
MSOImpl proxy = new MSOImpl();
sample.ims.CCIBuffer output = proxy.runMultiSegOutput(input);
// ---------------------------------------------------
// Извлечение многосегментного выходного сообщения
// в качестве массива байтов с помощью метода
// getBytes() обработчика формата выходного
// сообщения.
// ---------------------------------------------------
System.out.println(
"\nSize of output message is: " + output.getSize());
segBytes = output.getBytes();
srcPos = 0;
dstPos = 0;
totalLen = segBytes.length;
remainLen = totalLen;
// ---------------------------------------------------
// Заполнение первого сегмента объекта из буфера.
// ---------------------------------------
buff = null;
// Получение длины сегмента.
LL =
MarshallIntegerUtils.unmarshallTwoByteIntegerFromBuffer(
segBytes,
srcPos,
true,
MarshallIntegerUtils.SIGN_CODING_TWOS_COMPLEMENT);
// Поместить сегмент в байтовый массив.
buff = new byte[LL];
System.arraycopy(segBytes, srcPos, buff, dstPos, LL);
remainLen -= LL;
// Создание и заполнение объекта сегмента из массива байтов.
OutputSeg1 S1 = new OutputSeg1();
S1.setBytes(buff);
System.out.println(
"\nOutSeg1 LL is: "
+ S1.getOut__ll()
+ "\nOutSeg1 ZZ is: "
+ S1.getOut__zz()
+ "\nOutSeg1_DATA1 is: "
+ S1.getOut__data1());
// ---------------------------------------------------
// Заполнение второго сегмента объекта из буфера.
// ---------------------------------------------------
srcPos += LL;
buff = null;
// Получение длины сегмента.
LL =
MarshallIntegerUtils.unmarshallTwoByteIntegerFromBuffer(
segBytes,
srcPos,
true,
MarshallIntegerUtils.SIGN_CODING_TWOS_COMPLEMENT);
// Поместить сегмент в байтовый массив.
buff = new byte[LL];
System.arraycopy(segBytes, srcPos, buff, dstPos, LL);
remainLen -= LL;
// Создание и заполнение объекта сегмента из массива байтов.
OutputSeg2 S2 = new OutputSeg2();
S2.setBytes(buff);
System.out.println(
"\nOutSeg2 LL is: "
+ S2.getOut__ll()
+ "\nOutSeg2 ZZ is: "
+ S2.getOut__zz()
+ "\nOutSeg2_DATA1 is: "
+ S2.getOut__data1()
+ "\nOutSeg2_DATA2 is: "
+ S2.getOut__data2());
// ---------------------------------------------------
// Заполнение третьего сегмента объекта из буфера.
// ---------------------------------------------------
srcPos += LL;
buff = null;
// Получение длины сегмента.
LL =
MarshallIntegerUtils.unmarshallTwoByteIntegerFromBuffer(
segBytes,
srcPos,
true,
MarshallIntegerUtils.SIGN_CODING_TWOS_COMPLEMENT);
// Поместить сегмент в байтовый массив.
buff = new byte[LL];
System.arraycopy(segBytes, srcPos, buff, dstPos, LL);
remainLen -= LL;
// Создание и заполнение объекта сегмента из массива байтов.
OutputSeg3 S3 = new OutputSeg3();
S3.setBytes(buff);
System.out.println(
"\nOutSeg3 LL is: "
+ S3.getOut__ll()
+ "\nOutSeg3 ZZ is: "
+ S3.getOut__zz()
+ "\nOutSeg3_DATA1 is: "
+ S3.getOut__data1()
+ "\nOutSeg3_DATA2 is: "
+ S3.getOut__data2()
+ "\nOutSeg3_DATA3 is: "
+ S3.getOut__data3());
}
catch (Exception e)
{
System.out.println("\nCaught exception is: " + e);
}
}
}