- Робота з вихідними файлами PCML
- Робота з двійковими файлами PCML
- Порівняльний аналіз вихідних і двійкових файлів PCML
- повні імена
- Звернення до елементів масиву
- налагодження
Перед розробкою викликів програм IBM® i на мові PCML потрібно створити додаток на Java ™ та вихідний файл PCML.
Залежно від структури програми, створіть один або кілька вихідних файлів PCML з описом інтерфейсів для роботи з програмами IBM i. Ці інтерфейси будуть викликатися додатком Java. Детальний опис мови приведено в розділі синтаксис PCML .
Додаток на Java взаємодіє з класами PCML (в даному випадку - з класом ProgramCallDocument). клас ProgramCallDocument застосовує вихідний файл PCML для передачі інформації з програми на Java в систему IBM i і назад. Взаємодія між додатками на Java і класами PCML показано на рис. 1.
Мал. 1. Виклик програм сервера за допомогою PCML.
Коли додаток створює об'єкт ProgramCallDocument, синтаксичний аналізатор XML обробляє вихідний файл PCML. Додаткова інформація про роботу з аналізатором XML в IBM Toolbox for Java наведена в розділі Аналізатор XML і обробник XSLT .
Додаток застосовує методи створеного класу ProgramCallDocument для отримання необхідної інформації з системи IBM i за допомогою сервера викликів розподілених програм (DPC) AS / 400.
Для підвищення продуктивності програми рекомендується зберегти клас ProgramCallDocument у вигляді потоку байтів під час компіляції продукту. Згодом клас ProgramCallDocument буде відновлений з файлу, що містить цей потік байт. В цьому випадку аналізатор XML не викликатиме під час виконання. Додаткова інформація наведена в розділі Робота з двійковими файлами PCML .
Робота з вихідними файлами PCML
Під час створення об'єкта ProgramCallDocument додаток на Java звертається до вихідного файлу PCML. Об'єкт ProgramCallDocument розглядає вихідний файл PCML як ресурс Java. Додаток на Java визначає каталог вихідного файлу PCML за допомогою змінної CLASSPATH
Нижче наведено фрагмент програми на Java, в якому створюється об'єкт ProgramCallDocument:
AS400 as400 = new AS400 (); ProgramCallDocument pcmlDoc = new ProgramCallDocument (as400, "myPcmlDoc");Об'єкт ProgramCallDocument зчитує вихідний код PCML з файлу myPcmlDoc.pcml. Зверніть увагу, що в конструкторі не вказано розширення .pcml.
Якщо додаток на Java створюється у вигляді пакету Java, ви можете додати ім'я пакету до імені ресурсу PCML:
AS400 as400 = new AS400 (); ProgramCallDocument pcmlDoc = new ProgramCallDocument (as400, "com.company.package.myPcmlDoc");Робота з двійковими файлами PCML
Для підвищення продуктивності програми можна скористатися двійковим файлом PCML. Такий файл PCML містить збережені об'єкти Java, що представляють PCML. Це ті об'єкти, які були створені разом з об'єктом ProgramCallDocument на основі вихідного файлу, як це було описано вище.
Застосування довічних файлів PCML дозволяє підвищити продуктивність, так як в цьому випадку під час виконання програми не потрібно викликати аналізатор XML для обробки тегів PCML.
Об'єкти PCML можна зберегти одним із таких способів:
- З командного рядка: java com.ibm.as400.data.ProgramCallDocument -serialize mypcml
Цей спосіб рекомендується застосовувати в тому випадку, коли компоновка додатки виконується пакетним процесом.
- З програми на Java: ProgramCallDocument pcmlDoc; // Ініціалізація pcmlDoc.serialize ();
Якщо об'єкти PCML описані в вихідному файлі myDoc.pcml, то вони будуть збережені у файлі myDoc.pcml.ser.
Порівняльний аналіз вихідних і двійкових файлів PCML
Розглянемо наступний фрагмент програми, в якому створюється об'єкт ProgramCallDocument:
AS400 as400 = new AS400 (); ProgramCallDocument pcmlDoc = new ProgramCallDocument (as400, "com.mycompany.mypackage.myPcmlDoc");Спочатку конструктор ProgramCallDocument спробує знайти бінарний файл PCML з ім'ям myPcmlDoc.pcml.ser в пакеті com.mycompany.mypackage, переглядаючи каталоги, зазначені в змінної CLASSPATH Java. Якщо двійковий файл PCML не існує, то конструктор спробує знайти вихідний файл PCML з ім'ям myPcmlDoc.pcml в пакеті com.mycompany.mypackage, переглядаючи каталоги, зазначені в змінної CLASSPATH Java. Якщо вихідний файл PCML не існує, буде викликана виняткова ситуація.
повні імена
Для задання вхідних параметрів викликається програми IBM i в додатках на Java застосовується метод ProgramCallDocument.setValue (). Для отримання вихідних значень програми IBM i в додатках застосовується метод ProgramCallDocument.getValue ().
При зверненні до значень класу ProgramCallDocument необхідно вказувати повне ім'я елемента документа або тега <data>. Повне ім'я - це об'єднання імен всіх зовнішніх тегів, розділених точками.
Наприклад, для наведеного нижче вихідного коду PCML повне ім'я елемента "nbrPolygons" - "polytest.parm1.nbrPolygons". Для отримання координати "x" однією з вершин багатокутника потрібно вказати ім'я "polytest.parm1.polygon.point.x".
Якщо елементом не присвоєно ім'я, то для всіх його нащадків повне ім'я не визначено. Програма на Java не може звертатися до елементів, у яких немає повного імені.
<Pcml version = "1.0"> <program name = "polytest" path = "/ QSYS.lib / MYLIB.lib / POLYTEST.pgm"> <! - Параметр 1 містить масив і число багатокутників -> <struct name = "parm1" usage = "inputoutput"> <data name = "nbrPolygons" type = "int" length = "4" init = "5" /> <! - Кожен багатокутник містить число вершин і масив їх координат -> < struct name = "polygon" count = "nbrPolygons"> <data name = "nbrPoints" type = "int" length = "4" init = "3" /> <struct name = "point" count = "nbrPoints"> < data name = "x" type = "int" length = "4" init = "100" /> <data name = "y" type = "int" length = "4" init = "200" /> </ struct > </ struct> </ struct> </ program> </ pcml>Звернення до елементів масиву
Всі елементи <data> і <struct> можна визначити у вигляді масивів за допомогою атрибута count. Крім того, елементи <data> і <struct> можуть міститися всередині іншого елемента <struct>, також є масивом.
Більш того, елементи <data> і <struct> можуть міститися в багатовимірному масиві, якщо відразу для декількох внутрішніх елементів заданий атрибут count.
Для того щоб додаток могло звертатися до масиву і його елементів, необхідно задати індекс для кожного вимірювання масиву. Індекси масиву передаються у вигляді масиву значень типу int. Нижче наведено фрагмент програми на Java, який ілюструє роботу з описаним вище масивом багатокутників:
ProgramCallDocument polytest; // Ініціалізація Integer nbrPolygons, nbrPoints, pointX, pointY; nbrPolygons = (Integer) polytest.getValue ( "polytest.parm1.nbrPolygons"); System.out.println ( "Число багатокутників:" + nbrPolygons); indices = new int [2]; for (int polygon = 0; polygon <nbrPolygons.intValue (); polygon ++) {indices [0] = polygon; nbrPoints = (Integer) polytest.getValue ( "polytest.parm1.polygon.nbrPoints", indices); System.out.println ( "Число вершин:" + nbrPoints); for (int point = 0; point <nbrPoints.intValue (); point ++) {indices [1] = point; pointX = (Integer) polytest.getValue ( "polytest.parm1.polygon.point.x", indices); pointY = (Integer) polytest.getValue ( "polytest.parm1.polygon.point.y", indices); System.out.println ( "X:" + pointX + "Y:" + pointY); }}налагодження
При роботі зі складними структурами даних в коді PCML програмісти часто припускаються помилок, які призводять до виникнення виняткових ситуацій в класі ProgramCallDocument. Помилки, пов'язані з неправильно заданих зміщенням або розміром даних, дуже нелегко знаходити і виправляти.
Увімкніть трасування PCML за допомогою наступного методу класу Trace :
Trace.setTraceOn (true); // Включення функції трасування. Trace.setTracePCMLOn (true); // Включення трасування PCML. Прим .: Всі загальні методи класу PcmlMessageLog , Включаючи трасування, були відключені у випуску V5R2.метод трасування setFileName () дозволяє відправляти в файли протоколу або, за замовчуванням, в System.out, такі типи даних:
- Дамп шістнадцятирічних даних, якими обмінюються додаток на Java і програма IBM i. Він містить вхідні параметри програми, перетворені в формат AS / 400. Крім того, він містить вихідні параметри, ще не перетворені в формат Java.
Дані записуються в звичайному форматі, в якому шістнадцяткові значення розташовані зліва, а їх символьний інтерпретація - справа. Нижче наведено приклад цього формату дампа. (Приклад виведення був змінений для оптимального розміщення по ширині)
qgyolobj [6] Offset: 0 ....... 4 ....... 8 ....... C ....... 0 ....... 4 ... .... 8 ....... C ....... 0 ... 4 ... 8 ... C ... 0 ... 4 ... 8 ... C. .. 0: 5CE4E2D9 D7D9C640 4040 ** USRPRF * у наведеному вище прикладі в дампі показаний сьомий параметр, який містить 10 байт даних і рівний "* USRPRF". - Нижче наведено приклад 16-ричного дампа, що містить вихідні параметри, і його інтерпретація. (Приклад виведення був змінений для оптимального розміщення по ширині)