2. Plate forme utilisée pour le POC
Serveur Linux
Kernel 2.6.9-67.0 (RedHat)
Base de données
Ingres 2006 Release 3 Linux Version II 9.2.0 (int.lnx/118)NPTL
Serveur d’application J2EE
JONAS Application Server 4.8.6
Client OpenROAD
OpenROAD 4.1
Développement Java
Eclipse 3.2
Copyright ECL IP’S Software & Services - 1998-2008 Présentation ECL IP’S Software
3. Démo
Portable
Virtual Machine
Serveur Linux
Clients riches
Ingres SGBD
JOnAS AS
Clients légers
Copyright ECL IP’S Software & Services - 1998-2008 Présentation ECL IP’S Software
4. Architecture du POC
JoNAS Application Server
Web Container EJB Container
Web components Entreprise Java Beans
- JSPs
- Servlets
OpenROAD
Client Databases
kerosene_java.ear
Copyright ECL IP’S Software & Services - 1998-2008 Présentation ECL IP’S Software
5. Architecture Projet EJB : kerosene_java
Package ker_ligne_devis_t
ker_ligne_devis_t : Interface Distante
ker_ligne_devis_tEJB : StateLess Session bean
ker_ligne_devis_tHome : Home Interface pour le bean
ker_ligne_devis_t
Classes
ker_ligne_devis : Identique en déclaration à la classe OR
Servlets
WebLoadEdBud : Génération des résultats en HTML
XmlLoadEdBud : Générationdes résultats en XML
JSPs
loadedbud.jsp : Génération des résultats en HTML
ORLoadEdBud.jsp : Génération des résultats en raw HTTP
Copyright ECL IP’S Software & Services - 1998-2008 Présentation ECL IP’S Software
6. ker_ligne_devis_tEJB
Implémentation
public static Vector loadEdBud
Connexion à la base de données
Via JDBC
Construction de la requête
PrepareStatement
Execution de la requête
executeQuery
Stockage des données issues de la requête
Dans un vecteur
Copyright ECL IP’S Software & Services - 1998-2008 Présentation ECL IP’S Software
7. ker_ligne_devis_tHome
Role
Permet de réaliser les appels de l’EJB
Tous les servlets et JSP utilisent cette interface
Un bean est créé à partir de cette interface
Ce bean lance la méthode loadEdBud
Le vecteur est traité dans le servlet ou le jsp utilisant ce bean
Copyright ECL IP’S Software & Services - 1998-2008 Présentation ECL IP’S Software
11. Classe OR : cls_k_ligne_devis_t
Rassemble toutes les méthodes de chargement
Implémentation classique
– load_ed_bud()
Implémentation via Xml
– load_ed_bud_xml()
Implémentation via raw http
– load_ed_bud_rawhttp()
Implémentation JNI
– load_ed_bud_jni()
Les appels pour les pages html sont fait directement
dans l’écran
Copyright ECL IP’S Software & Services - 1998-2008 Présentation ECL IP’S Software
17. Implémentation Browser intégré (5)
Utilisation du JSP loadedbud.jsp dans un navigateur
Copyright ECL IP’S Software & Services - 1998-2008 Présentation ECL IP’S Software
18. Implémentation Browser intégré (6)
Attention à la gestion des erreurs
Copyright ECL IP’S Software & Services - 1998-2008 Présentation ECL IP’S Software
19. Implémentation via raw HTTP (1)
cls_k_lignedevis_t
External
Library Class
Microsoft XMLHTTP
Vector
EJBs
url='http://192.168.0.6:9000/kerosene_java/ORLoadEdBud.jsp?cdentite='+g_etude.cdentite+'&cdetude='+g_etude.cdetude+'&cdsel='+varchar(g_etude.cdsel)+'&flgfc='+varchar(cs_ker_cou
res.load_ed_bud_rawhttp(url=url);
Copyright ECL IP’S Software & Services - 1998-2008 Présentation ECL IP’S Software
20. Implémentation via raw HTTP (2)
Utilisation du JSP ORLoadEdBud.jsp dans un navigateur
Copyright ECL IP’S Software & Services - 1998-2008 Présentation ECL IP’S Software
21. Implémentation via raw HTTP (3)
Extrait du Code de la classe cls_k_ligne_devis_t methode load_ed_bud_rawhttp
method load_ed_bud_rawhttp(url=varchar(2000) not null)
=
declare
i=integer not null;j=integer not null;
tok=u_token_str_t;resp=u_token_str_t;
str=stringobject;resp_str=stringobject;
xm=xml!xmlhttp; External library class MSXMLHTTP
tmp=stringobject;
{
xm.open('GET',url,false);
xm.send(); Construction, Appel, stockage du retour dans un stringobject
resp_str=xm.responseText;
resp.explode(l=resp_str,token=hc_newline);
for i=1 to resp.t.lastrow do
tmp.value=resp.t[i].token;
tok._clear();
tok.explode(l=tmp,token=';');
if(tok.t.lastrow!=10)then
continue;
endif; Transformation
j=j+1;
:$c.t[j].flgfc=int4(tok.t[1].token);
:$c.t[j].cdres=tok.t[2].token;
:$c.t[j].cdrubnt=tok.t[3].token;
…
endfor;
}
Copyright ECL IP’S Software & Services - 1998-2008 Présentation ECL IP’S Software
22. Implémentation via Xml (1)
cls_k_lignedevis_t
ExtLib
MSXmlHttp
XML
Vector XML External
Library Class
EJBs Microsoft XMLHTTP
url='http://192.168.0.6:9000/kerosene_java/XmlLoadEdBud.jsp?cdentite='+g_etude.cdentite+'&cdetude='+g_etude.cdetude+'&cdsel='+varchar(g_etude.cdsel)+'&flgfc='+varchar(cs_ker_co
res.load_ed_bud_xml(url=url);
Copyright ECL IP’S Software & Services - 1998-2008 Présentation ECL IP’S Software
23. Implémentation via Xml (2)
Utilisation du servlet XmlLoadEdBud dans un navigateur -> Xml Output
Copyright ECL IP’S Software & Services - 1998-2008 Présentation ECL IP’S Software
24. Implémentation via Xml (3)
Extrait du Code de la classe cls_k_ligne_devis_t methode load_ed_bud_xml
method load_ed_bud_xml(url=varchar(2000) not null)
=
declare
xm=xml!xmlhttp;
nodelist = ixmldomnodelist default null;
dxml=xml!domdocument;
External library class MSXMLHTTP
i=integer not null;j=integer not null;k=integer not null;
resp_str=stringobject;
{
xm.open('GET',url,false);
xm.send(); Construction, Appel, stockage du retour dans un stringobject puis dans object xml
resp_str=xm.responseText;
dxml.loadXML(resp_str);
Traitement du flux XML
k=dxml.selectnodes('/records/record').length;
nodelist=dxml.selectnodes('//records/record');
for i=0 to k-1 do
j=j+1;
:$c.t[j].flgfc=int4(nodelist.item(i).SelectSingleNode('flgfc').text);
:$c.t[j].cdres=nodelist.item(i).SelectSingleNode('cdres').text;
:$c.t[j].cdrubnt=nodelist.item(i).SelectSingleNode('cdrubnt').text;
:$c.t[j].lbres=nodelist.item(i).SelectSingleNode('lbres').text; Affectation
:$c.t[j].cduo=nodelist.item(i).SelectSingleNode('cduo').text;
:$c.t[j].qtres=float8(nodelist.item(i).SelectSingleNode('qtres').text);
:$c.t[j].mtres=float8(nodelist.item(i).SelectSingleNode('mtres').text);
:$c.t[j].mttotal=float8(nodelist.item(i).SelectSingleNode('mttotal').text);
endfor;
}
Copyright ECL IP’S Software & Services - 1998-2008 Présentation ECL IP’S Software
26. Implémentation via JNI (2)
Extrait du Code de la classe cls_k_ligne_devis_t methode load_ed_bud_jni
method load_ed_bud_jni(url=varchar(2000) not null)
=
declare
i=integer not null;
j=integer not null;
tok=u_token_str_t;
tmp=stringobject;
{
callproc p4_loadedbud(t=byref(t)); Appel de la l3g encapsulée par une l4gl
for i=1 to t.lastrow do
tmp.value=t[i].lg;
tok._clear();
tok.explode(l=tmp,token='|');
curmethod.trace(text=varchar(tok.t.lastrow));
if(tok.t.lastrow!=9)then
continue;
endif;
j=j+1;
:$c.t[j].flgfc=int4(tok.t[1].token);
:$c.t[j].cdres=tok.t[2].token;
:$c.t[j].cdrubnt=tok.t[3].token;
:$c.t[j].lbres=tok.t[4].token;
:$c.t[j].cduo=tok.t[5].token; Affectation
:$c.t[j].qtres=float8(tok.t[6].token);
:$c.t[j].mtres=float8(tok.t[7].token);
:$c.t[j].resdivcoef=float8(tok.t[8].token);
:$c.t[j].mttotal=float8(tok.t[9].token);
endfor;
}
Copyright ECL IP’S Software & Services - 1998-2008 Présentation ECL IP’S Software
27. Implémentation via JNI (3)
Extrait du Code de la dll
DLLIMPORT int p3_loadedbud (ah)
long ah;
{
int i,j;
JNIEnv * env;
JavaVM * jvm;
jclass clsH=NULL;
jmethodID midGet=NULL;
jobject jobjRetData = NULL;
jsize len;
const char *str;
jobject myobj;
env = create_vm(&jvm); Création de la machine virtuelle
if (env == NULL)
return 1;
clsH = (*env)->FindClass(env,"ker_ligne_devis_t/ker_ligne_devis_tClient"); Recherche de la classe à appeler
if (clsH != NULL)
midGet= (*env)->GetStaticMethodID(env,clsH, "ReturnBud", "()Ljava/lang/Object;"); Recherche de la méthode à appeler
if(midGet != NULL){
jobjRetData = (jobject)(*env)->CallStaticObjectMethod(env,clsH, midGet, NULL);
len=(*env)->GetArrayLength(env,jobjRetData);
Appel de la méthode
for(j=0;i<len;j++) {
i++;
myobj = (*env)->GetObjectArrayElement(env, jobjRetData,j);
str = (*env)->GetStringUTFChars(env, myobj, 0);
Communication vers OpenROAD
IIG4irInsRow(ah,i,0,0,0); Chargement direct d’un tableau
if (IIG4chkobj(ah,3,i,2) == 0) {
IIG4saSetAttr("lg",(short *)0,1,32,0,str);
}
}
}
int n = (*jvm)->DestroyJavaVM(jvm);
return (0);
}
Copyright ECL IP’S Software & Services - 1998-2008 Présentation ECL IP’S Software
28. Conclusions (1)
POC réussi
Plusieurs solutions possibles
Solutions techniquement viables
Temps pour adapter les écrans Kérosène faible
Architecture des dev kérosène ~= « java like »
Implémentation Xml vraiment très élégante
Communications bi directionnelle (param/data)
Copyright ECL IP’S Software & Services - 1998-2008 Présentation ECL IP’S Software
29. Conclusions (2)
JNI possible pour les traitements complexes
Pas de modification des écrans dans les
implémentation rawhttp, xml, et JNI
Attention à la gestion des erreurs -> écrans avec
navigateurs intégrés
Performances des SA, clustering impératif
Préparation des applications OpenROAD impératif
Copyright ECL IP’S Software & Services - 1998-2008 Présentation ECL IP’S Software