Vous êtes sur la page 1sur 16

Utilisation de JAVA cot Application serveur

coupl avec Oracle Forms


Hafed Benteftifa

www.degenio.com Novembre 2008

Introduction
Forms 10g permet lutilisation du JAVA ct client et ct application serveur. Lutilisation
du JAVA au niveau serveur nest pas aise car on doit recourir lutilisation dun bridge natif
PLS/SQL vers JAVA au niveau de Oracle Forms.

& '

Java cot AS

!"#$%

Java cot client

Java cot BD

Dans ce tutoriel, on reprend un exemple dcrit au niveau dOTN et concerne lutilisation dun
web service commercial (StrikeIron.com) pour lenvoi dun SMS. Le tutoriel Oracle peut tre
trouv sur :
http://www.oracle.com/technology/products/forms/htdocs/10gr2/howto/webservicefromforms
/ws_10_1_3_from_forms.html

Java avec Oracle Forms


Pour la plupart des dveloppeurs Oracle Forms, il existe un problme pour situer exactement
le tier o lon peut utiliser une classe JAVA. Comme le montre la figure ci-dessus, on peut
faire appel une classe JAVA tous les niveaux de larchitecture Forms 9i-10g.
Client
Au niveau client, on fera appel aux classes JAVA grce lutilisation des PJC/Javabeans.
Lavantage de cette approche est que lexcution se fait au niveau du client et ainsi les
ressources serveur seront disponibles pour dautres tches.

Hafed Benteftifa- Envoi SMS partir de module Oracle Forms-

Serveur dapplications
Dans le cas o il est impossible de dlocaliser les classes JAVA au niveau des clients, comme
par exemple le cas des services web, on sera dans lobligation de fournir ces classes ct
serveur dapplications.
Cette approche ncessite la mise en place de wrappers PL/SQL-JAVA au niveau du module
Forms. Ceci permettra au module daccder aux classes JAVA par lintermdiaire de
packages-procdures PL/SQL.
La dlocalisation cot serveur dapplications implique le lancement de la JVM au niveau de
ce tier. Limpact de cette approche est que le serveur sera trs sollicit et de ce fait un rglage
en termes de pooling JVM est requis.
Dans ce tutoriel, on utilisera des classes JAVA ct serveur dapplications.
Serveur Bases de donnes
Comme pour les procdures stockes, on sera aussi amen crer des classes JAVA ct BD.
Des appels similaires que pour les appels PL/SQL seront utiliss pour accder aux
fonctionnalits des classes stockes.
Nanmoins, cette approche semble ne pas tre trs utilise.

Hafed Benteftifa- Envoi SMS partir de module Oracle Forms-

Prparation des classes gestion des envois au niveau AS


Dans la section suivante, on montre les tapes ncessaires pour prparer les classes (JAR)
ncessaires pour lenvoi dun SMS.
Il faut noter quun certain nombre de classes seront cres mais ne seront pas ncessaires pour
cet exemple. Ceci est d au fait que lors de la cration, on fait appel au WSDL1 du web
service.
On utilise loutil de dveloppement JDeveloper fourni par Oracle. La version utilise dans ce
tutoriel est 10.1.3

WSDL : web service definition language. Permet de dfinir les mthodes ncessaires mettre en uvre pour
exploiter ce web service. Cette tape est mise en place par le fournisseur de service.

Hafed Benteftifa- Envoi SMS partir de module Oracle Forms-

On choisira un nom dapplication adquat. Dans notre cas, on a appel cette application
SMSApp.
Au niveau de cette application et selon la terminologie JDeveloper, on crera un certain
nombre de projets. Pour le moment, le projet qui contiendra les classes denvoi SMS sera
appel SMSGateway

Hafed Benteftifa- Envoi SMS partir de module Oracle Forms-

Pour spcifier le type de projet, on changera quelques options au niveau des proprits comme
le montre la figure ci-dessus.

Hafed Benteftifa- Envoi SMS partir de module Oracle Forms-

Dans le cas qui nous concerne et spcialement en raison du fait que nous allons importer les
classes cres au niveau de Forms developer, il est important de spcifier la JDK utilise pour
lexcution de nos FMX. tant donn que la version actuelle de Forms est 10.1.2, la JDK
utiliser est 1.4

Nous allons ensuite dfinir le type de projet. Dans notre cas, cest lutilisation dun web
service commercial fourni par www.strikeiron.com. On slectionnera loption Business Tier
et spcialement loption Web servicesLitem qui nous intresse est web services proxy-

Hafed Benteftifa- Envoi SMS partir de module Oracle Forms-

Dans lcran qui suit, on renseigne lurl de description du service web. Dans notre cas, celleci est : http://ws.strikeiron.com/SMSAlerts4?WSDL
JDeveloper va se connecter pour lire le document de description du service web et par la suite
construira le modle qui sera disponible au niveau de JDeveloper. Une classe ayant un prfixe
SoapClient sera alors visible. Elle contient les mthodes ncessaires pour lenvoi du SMS.
Noter que lon peut aussi suivre la mme approche pour un autre service commercial
(www.esendex.com dcrit dans OTN).

Hafed Benteftifa- Envoi SMS partir de module Oracle Forms-

Pour tester notre setup, on peut lancer lenvoi dun SMS partir de JDeveloper. On apportera
les modifications suivantes :
Au niveau de la mthode main(), ajouter la section suivante.

Note : pour tester votre envoi, il est ncessaire de crer un compte dessai sur
www.strikeiron.com. Vous recevrez un mot de passe pour votre userID.
Une fois que vous avez valid votre envoi et tant donn que lon utilisera seulement la
mthode senMessage(), on effectuera une modification au niveau de la mthode denvoi.
Ceci est ncessaire pour sauthentifier au niveau du service web lorsquon se connectera
partir de Forms.

La dernire tape consiste spcifier le dploiement de nos classes. On cre un modle de


dploiement de JAR comme le montre la figure suivante :

Hafed Benteftifa- Envoi SMS partir de module Oracle Forms-

On veillera inclure les options ncessaires et spcialement le rpertoire de destination

Afin dobtenir le JAR utilisable au niveau de Forms, on slectionnera le modle de


dploiement.

Hafed Benteftifa- Envoi SMS partir de module Oracle Forms-

Le JAR qui a t gnr, soit sms.jar sera mis dans le repertoire de notre installation
fonctionnelle de Forms. Dans notre cas, cest /forms/java.

Afin de permettre la visibilit de nos JAR et des classes ncessaires au moment du runtime,
on devra modifier le classpath au niveau de default.env de Forms (ou de la configuration
nomme sil en existe une).
Exemple de classpath :

Cration du module Forms


tape 1 : cration du module
On devra crer un module simple au niveau de forms builder.

Hafed Benteftifa- Envoi SMS partir de module Oracle Forms-

10

tape 2 : importation des classes denvoi de SMS


Au niveau de builder, cliquer sur loption de menu, Importer classes JAVA tel que le montre
lcran suivant.

Dans lcran de slection, on veillera importer la classe adquate. Pour se reprer, on


comparera avec les classes disponibles au niveau de JDeveloper.
Il est important de veiller importer les mthodes et variables ncessaires.

Hafed Benteftifa- Envoi SMS partir de module Oracle Forms-

11

Si lon compare au niveau de JDeveloper, on voit que lon a besoin des objets LicenseInfo et
SubscriptionInfoHolder. On rpte alors la mme procdure dimportation pour ces deux
classes. Pour les localiser plus facilement, on devra au pralable noter les packages de chaque
classe et les slectionner ensuite de larbre dimportation.
Pour finaliser, on devra aussi importer deux autres classes ncessaires au niveau de notre
module, savoir String et Exception.
Lcran suivant montre limportation de la classe Exception.

Suite cette importation, on inspecte les units de programmes de notre module.

La classe qui nous intresse et savoir GlobalSMSProSoapClient contient lappel vers la


mthode JAVA qui se charge de lenvoi proprement dit.

Hafed Benteftifa- Envoi SMS partir de module Oracle Forms-

12

A partir du bouton, on peut inspecter le When-Validate-Item et on a :

Hafed Benteftifa- Envoi SMS partir de module Oracle Forms-

13

tape 3 : compilation et excution

Conclusion
On a prsent dans ce tutoriel les tapes ncessaires pour lutilisation dune classe JAVA ct
serveur dapplications.
Cette approche peut tre tendu dautres services web et la mise en place doit tre conue
selon les spcifications du fournisseur de services web.
Il est noter que le fait dutiliser des classes Java cot serveur dapplications implique une
tude de performance selon lutilisation escompte du service. En effet, chaque fois quun
appel de classe est fait, une instance JVM sera lance au niveau du serveur dapplications.
Dans le cas dun trs grand nombre dappel, un engorgement des capacits processeur est
prvoir et ceci peut conduire un touffement du serveur.
Dans ce cas prcis, il est indiqu de faire un pooling JVM selon le nombre de connexions
possibles. Les rglages peuvent tre faits par ladministrateur du serveur dapplications.

Hafed Benteftifa- Envoi SMS partir de module Oracle Forms-

14

Annexe
On peut se poser la question de savoir si lon peut viter dutiliser cette classe JAVA et
remplacer cette fonctionnalit par du PL/SQL.
videmment, dans le cas des services web, on peut facilement utiliser une procdure ou
fonction PL/SQL en remplacement de la mthodologie dcrite ci-dessus. Il faut noter
nanmoins que ce tutoriel dcrit les tapes pour la mise en place dune classe JAVA et de ce
fait la mme technique peut tre rutilise dans les cas o il est impossible dutiliser du
PL/SQL.
On montre dans ce qui suit comment on peut envoyer un SMS en utilisant une procdure
stocke PL/SQL (Utilisation protocole HTTP GET sur fournisseur SMS www.wadja.com).
Noter que la mme approche est dcrite dans http://www.inside-oracleapex.com/2007/05/sending-sms-to-mobile-phone.html et que lutilisation du package
UTL_HTTP facilite la mise en place de cette procdure. Le plus important est que la requte
soumise au service soit crite suivant les spcifications du fournisseur de service SMS.
create or replace PROCEDURE sendSMS
( pRecipient IN VARCHAR2
, pBody
IN VARCHAR2
)
IS
sms_key constant varchar2(40) := 'DB09D6XXXXXX';--cl obtenir sur wadja.com
-vRequest
Utl_Http.req;
vGetText
VARCHAR2(500);
vResponse
Utl_Http.resp;
vResponseText VARCHAR2(2000);
vErrorText
VARCHAR2(200);
BEGIN
----------------------------------------------------------------------------- Build text for the get action.
-- For a field description, see
-- http://sms.wadja.com/partners/sms/default.aspx
---------------------------------------------------------------------------vGetText :=
'key=' ||Utl_Url.escape(sms_key, TRUE)||CHR(38)||
'msg='
||Utl_Url.escape(pBody, TRUE) ||CHR(38)||
'to='||Utl_Url.escape(pRecipient, TRUE)||CHR(38)||
'from='||Utl_Url.escape('wadja.com',TRUE)||CHR(38)||
'unicode='||Utl_Url.escape('no', TRUE)||CHR(38)||
'send='||Utl_Url.escape('1', TRUE);
vRequest := Utl_Http.begin_request
( url
=> 'http://sms.wadja.com/partners/sms/default.aspx'
, method => 'GET'
);
Utl_Http.set_header
( r
=> vRequest
, name => 'Content-Type'
, value => 'application/x-www-form-urlencoded'
);
Utl_Http.set_header
( r
=> vRequest
, name => 'Content-Length'
, value => LENGTH(vGetText)
);
Utl_Http.write_text
( r
=> vRequest
, data => vGetText
);
vResponse := Utl_Http.get_response(vRequest);
IF vResponse.status_code = '200'
THEN

Hafed Benteftifa- Envoi SMS partir de module Oracle Forms-

15

ELSE

Utl_Http.read_text(vResponse, vResponseText);
-IF vResponseText NOT LIKE '%batchID%'
--A verifier avec specs wadja.com
THEN
vErrorText := vResponseText;
END IF;

vErrorText := 'HTTP status: '||vResponse.status_code||''||vResponse.reason_phrase;


END IF;
-Utl_Http.end_response(vResponse);
-IF vErrorText IS NOT NULL
THEN
RAISE_APPLICATION_ERROR(-20001, 'Sending SMS failed with '||vErrorText);
END IF;
END sendSMS;

Et au niveau de la form, faire lappel en utilisant le numro destinataire et texte du message.

Hafed Benteftifa- Envoi SMS partir de module Oracle Forms-

16