Oracle Forms JDAPI: bulk-wijzigingen vereenvoudigd
November 2005 - Iedereen die wel eens met Oracle Forms heeft gewerkt, heeft wel eens handmatig wijzigingen moeten doorvoeren in een grote hoeveelheid Forms. Een bekend voorbeeld hiervan is, het koppelen van WebUtil libraries aan elk Form bij een upgrade van een bestaande applicatie.
Een andere "bulk activiteit" is het opsporen van verouderde code bij een Forms migratie, zoals TEXT_IO en HOST commando's bij de conversie naar WebForms. Het opsporen van deze commando's is een tijdrovende en vooral saaie klus.
Een derde voorbeeld is het probleem van het wijzigen van de applicatienaam. Als een applicatie A gesplitst moet worden in B en C vanwege architectuur wensen, kan dit betekenen dat ieder object in de applicatie een andere naam krijgt (inclusief de views en tabellen). Dit betekent dus vervolgens dat alle Query Data Source en Query Data Target in de Forms moeten worden gewijzigd. Bij gebruik van de standaard functionaliteit in Designer 10g of Forms Builder 9i , kan dit per Form flink wat werk opleveren. Omdat het allemaal handwerk is, is de foutgevoeligheid ook erg hoog. Het is makkelijk om een klein stukje te vergeten, wat erg lastig terug te vinden is.
Een oplossing voor deze tijdrovende werkzaamheden wordt geboden met JDAPI, een Java 2 API waarmee snel en eenvoudig Forms kunnen worden gemanipuleerd. Verderop in dit Whitebook worden bovenstaande voorbeelden uitgewerkt en wordt aangetoond hoe JDAPI hier een snelle en goede oplossing voor kan bieden.
Wat is JDAPI
JDAPI is een Java 2 API die geschreven is om snel en makkelijk Forms te manipuleren. Eigenlijk kan er alles mee worden gedaan, dat normaal gesproken visueel met Forms Builder wordt gedaan. Hierbij kan gedacht worden aan post-generatie stappen of een geautomatiseerde migratie. De afkorting JDAPI staat voor Java Design-time API. Dit geeft aan dat er met Forms gewerkt kan worden in de Design-time fase. JDAPI is niet bedoeld om Forms run-time programmatuur te schrijven. JDAPI levert alle voordelen van JAVA 2 en API's om object-oriented programma's te schrijven die Forms aansturen. Hierdoor kunnen ontwikkelaars hun Java kennis gebruiken bij het ontwikkelen en aanpassen van Oracle Forms applicaties.
De belangrijkste kracht van JDAPI is de mogelijkheid om dit soort acties uit te voeren op grote aantallen Forms.
Wat is nodig voor JDAPI
Om JDAPI te kunnen gebruiken zijn een Oracle Forms Builder installatie nodig en een Java Runtime Environment of JDK met minimaal versie 1.3. Het .jar bestand f90jdapi.jar is te vinden in de home-directory van Oracle Developer Suite 9i of 10g onder /forms90/java/. JDAPI werkt met de Java Native Interface (JNI) om de Forms stack aan te roepen. Er is één Java package (oracle.forms.jdapi) beschikbaar in f90jdapi.jar. Deze package bevat een aantal interfaces, abstract types, utility classes en classes die voor alle Forms objecten staan. De architectuur van de package is te zien in het Class Diagram in het onderstaande figuur.

Architectuur Oracle Forms JDAPI package
Een veel gebruikte toepassing van JDAPI is in migratie trajecten. Hiertoe levert Oracle ook nog een f90upgrade.jar bestand mee. Deze tool is gebouwd bovenop de JDAPI en bevat de Oracle Forms Migration Assistent (OFMA). De OFMA is een krachtig stuk gereedschap om verouderde code op te sporen en te vervangen door equivalente 10g code.
De derde JDAPI gerelateerde .jar file die wordt meegeleverd is f90xmltools.jar. Deze bevat de XML-Forms Utility en is bedoeld om .fmb bestanden om te zetten naar XML formaat. Daarop kunnen dan bijvoorbeeld rapporten worden geschreven.
In de praktijk
De kracht van JDAPI is makkelijk te laten zien aan de hand van de eerder genoemde voorbeelden.
Het eerste voorbeeld is het koppelen van Webutil libraries aan bestaande Forms. Normaal gesproken betekend dit: handmatig openen van elk Form, het koppelen van de library en Form weer sluiten. Met een JDAPI en een slim stukje code kan dit proces eenvoudig worden geautomatiseerd. Met behulp van een aantal loops wordt door de code heengelopen en kunnen de noodzakelijke wijzigingen worden uitgevoerd.
Voor het tweede voorbeeld wordt de eerder kort genoemde Oracle Forms Migration Assistent gebruikt. Deze Assistent is prima geschikt om de TEXT_IO en HOST commando's te vervangen of te verwijderen. Het mooie van de OFMA is, dat de lijst van built-ins is uit te breiden door de ontwikkelaar, om ook code mee te nemen die niet standaard is ingebouwd. Hiertoe hoeft alleen het bestand search_replace.properties te worden aangepast.
Het derde voorbeeld dan tenslotte: het verplaatsen van een Form van de ene applicatie naar een andere, waarbij de namen van de tabellen wijzigen. Dit is binnen zowel de Forms Builder als Designer altijd al een lastig karwei geweest. In Designer 10g is dit enigszins mogelijk door alle Forms uit applicatie A te kopiëren naar applicatie B of C en tijdens het kopiëren de remap optie te gebruiken. In Forms Builder kan het alleen worden gedaan door elke Query Data Source en Query Data Target handmatig om te leggen naar de nieuwe tabel of view. In beide gevallen is het een erg tijdrovende klus. Daar komt nog eens bij dat alle custom code in Events en Application Logic, code in where clauses, order by clauses, etcetera, ook moet worden nagelopen.
Door slim gebruik te maken van JDAPI kan een stukje code geschreven worden om alle instanties van de tabellen en views uit applicatie A op te sporen en deze te hernoemen naar de tabellen en views van applicatie B of C. Hierdoor wordt met een kleine inspanning het werk van enkele dagen beperkt tot enkele uren. In onderstaande code wordt met behulp van JdapiIterator (wat een extend is van de standaard java.util.Iterator) een lijst gemaakt van de aanwezige Blocks in een Form.
JdapiIterator blocks =myForm.getObjectProperty(JdapiTypes.BLOCK_PTID); Block myBlock = (Block)blocks.next(); System.out.println(myBlock.getStringProperty(JdapiTypes.NAME_PTID));
De class JdapiTypes bevat een volledige set van "Property Type ID" constanten (met achtervoegsel _PTID) om specifieke Forms Object Properties weer te geven. Als aanvulling op de generieke accessor methods heeft iedere class ook meer Java-achtige accessors. Het onderstaande code voorbeeld doet hetzelfde als het vorige voorbeeld.
JdapiIterator blocks = myForm.getBlocks(); Block myBlock = (Block)blocks.next(); System.out.println(myBlock.getName());
Deze code kan dus in dit voorbeeld worden gebruikt om alle blocks uit een Form door te lopen. Door dit principe te gebruiken voor de overige inhoud van de Forms (denk hierbij aan Items, Table Usages, Events enz.), kan een krachtig zoek-hulpmiddel worden gemaakt om de tabellen van applicatie A op te sporen. Maar ook in de andere voorbeelden is dit nuttige code. Doordat JDAPI van buiten de Forms werkt, is de code toepasbaar in meerdere Forms en applicaties, zelfs tegelijkertijd. Die herbruikbaarheid is een groot voordeel en zorgt voor veel tijdwinst. De inspanning die wordt geleverd voor het bouwen van de tool, hoeft later niet nog eens te worden geleverd.
Conclusie
JDAPI biedt een interessante aanvulling op bestaande Forms technologieën. Het is een krachtig hulpmiddel die zeer complexe bewerkingen toestaat op nieuwe en bestaande Forms. Voor kenners van zowel Java als Forms is de leercurve laag, omdat het functionaliteit samenvoegt van beide werelden. JDAPI kan worden ingezet in migratie trajecten en bij uitgebreide wijzigingen in grote aantallen Forms. Het kan worden gebruikt om tijdrovende en foutgevoelige klussen te vereenvoudigen. Met andere woorden, JDAPI is een prima hulpmiddel bij het werken met Forms en kan het leven van een ontwikkelaar een stuk eenvoudiger maken.
Referenties:
- Programming Oracle Forms with JDAPI: otn.oracle.com/forms/help/
Over de auteur
Michel van Zoest is Oracle/Java consultant bij Whitehorses en heeft ruim 5 jaar ervaring in de IT. Hij houdt zich bezig met PL/SQL en Forms/Designer ontwikkeling en heeft zich ook gericht op integratietrajecten en Javaprojecten. Zijn expertise heeft hij onder andere opgedaan in projecten voor klanten in de automotive industrie, de financiële wereld, het verzekeringswezen, de pensioenenbranche en marktonderzoek.

Reacties
Nieuwe reactie inzenden