XUnitWeb XUnitWeb
|
![]() |
Tout sur $web:response/@web:output... |
||||||
| ppoulard | Posté le : 19 Déc, 2006 à 00:02:58 | |||||
|
Messages :41
|
Voici quelques éléments qui permettront (je l'espère) de déboucher votre tuyauterie Java. Avant toute chose, regardez http://reflex.gforge.inria.fr/tutorial/hello/web/WEB-INF/hello-world.web vous verrez que <web:mapping> ne retourne RIEN ; c'est à l'intérieur que le développeur de l'appli Web choisit d'écrire dans un attribut de $web:response ; il faut que cet objet soit créé et mis dans le data set AVANT d'exécuter votre mapping. Accessoirement, en fonction des attributs de <web:mapping>, vous allez éventuellement mettre à jour des attributs de $web:response comme le MIME type par exemple. NOTE : Pour que des objets puissent être utilisés avec XPath, ils doivent être : -soit des DOM nodes -soit des Map ou des List -soit des XOperable -soit des XComponent (qui sont d'ailleurs des XOperable) Je propose que votre objet $web:response (et aussi $web:request) soit un XComponent parce qu'il suffit de les construire à partir de Map (pour les attributs) et de List (pour le contenu) ; vous n'avez pas à vous soucier de comment XPath fonctionne là-dessus, c'est le moteur qui s'en charge. Donc le squelette de votre propriété devrait être quelque chose comme ça : package org.inria.reflex.xunit.web public final class ResponseProperty extends XComponent { public ResponseProperty() { super( new HashMap(), new ArrayList() ); } } et donc, AVANT de faire run sur votre mapping, faites comme dans la classe ReflexServlet : // create $web:request org.inria.reflex.xunit.web.RequestProperty req = new org.inria.reflex.xunit.web.RequestProperty(); dataSet.addGlobalProperty( WebNames.REQUEST_QNAME, req ); // create $web:response dataSet.addGlobalProperty( WebNames.RESPONSE_QNAME, new org.inria.reflex.xunit.web.ResponseProperty() ); la suite devrait aussi ressembler à ce qu'il y a dans la classe, pour créer la propriété qui contient les groupes qui ont été capturés par l'expression régulière ; c'est quasiment du copier/coller, il faut juste adapter un peu le code, de telle sorte qu'il n'y ait pas de référence à javax.servlet.* (excepté pour résoudre les paths web:/// comme expliqué dans un précédent message) ; et donc, tout ce code devrait se trouver dans votre implémentation de <web:post> et <web:get> si vous avez choisi de faire comme ça... La où ça se corse, c'est que votre objet $web:request contient déjà des trucs dedans (quelques attributs et du contenu) : voir la doc du module Web http://disc.inria.fr/perso/philippe.poulard/xml/active-tags/web/web.html#x-request-TYPE donc il suffit d'initialiser cet XComponent avec les bonnes valeurs : // pour chaque attribut : req.getAttributes.add( WebNames.XXX, valeur ); // et pour chaque paramètre de la query string : req.append( new CollectionsHelper.Entry( param, value ) ); Vous voyez bien que c'est facile :) NOTE : si vous regardez le code source de RefleX de ResponseProperty et RequestProperty, vous verrez que je n'utilise pas de HashMap ni de ArrayList, mais une implémentation de Map et de List, en utilisant les squelettes fournis dans java.util.* : le problème était que quand une mise à jour était faite par exemple dans un attribut, je devais dynamiquement refléter la mise à jour dans l'objet javax.servlet.* approprié ; pareil pour la lecture des attributs, qui sont directement puisés dans ces objets. Vous pouvez aussi faire un truc similaire si vous utilisez Eclipse (because il va générer le squelette des méthodes à implémenter, je me vois mal le faire à la main). |
|||||
| ppoulard | Posté le : 14 Déc, 2006 à 15:45:24
|
|||||
|
Messages :41
|
Ha haaaa, je vois que vous allez me dire : "et pour $web:response/@web:output, qu'est-ce qu'on fait ?" C'est vrai qu'à la base, on a un io:output qu'il faut pouvoir aussi relire après... mmm, pas facile d'avoir un truc qui fasse à la fois io:output et io:input... et si on utilisait un fichier ? Moi je mettrais un paramètre à mes tags qui invoquent le service : <web:get/post ...[vos attributs]... result="tmp:///zeresult.xhtml"> et donc, quelque part : resp.getAttributes.add( new QName( ... ) , valeur ); le QName étant web:output et la valeur "tmp:///zeresult.xhtml" ensuite, on sélectionne le mapping, et on l'exécute, etc... à la fin de <web:get/post> on écrase l'attribut avec le fichier prêt à lire : XFile valeur = XFile.getXFile( "tmp:///zeresult.xhtml" ); resp.getAttributes.add( new QName( ... ) , valeur ); le QName étant toujours web:output on peut aussi éviter d'embêter l'utilisateur en créant soit-même les fichiers temporaires : "tmp:///file" + i++; Voilà. |
|||||
| aK | Posté le : 14 Déc, 2006 à 15:53:13
|
|||||
|
Messages :4
|
Yes ! Voila enfin un truc qui va nous débloquer (le web:output) Merci ! |
|||||
| edddy30 | Posté le : 15 Déc, 2006 à 09:59:14
|
|||||
|
Messages :2
|
Un tit point Je comprend pas pourquoi ca marche pas ... Je creer un XComponent : HashMap maMap = new HashMap () ; XComponent request = new XComponent ( maMap ) ; Si j'ai bien compri tous les elements de ma HashMap seront les atttributs de "web: request" Ensuite j'ajout le tout a mon dataSet : dataSet.addGlobalProperty(WebNames.REQUEST_QNAME, request) ; et j'execute le Mapping map.runActions (dataSet) ; Normalement si je rajoute dans ma HashMap un couple de valeur exemple: maMap.put( "toto" , "toto" ) ; je devrai recuperer ma valeur de cette facon : <xcl:set name="toto" value="string($web:request/toto)" /> mais ca marche pas. et meme si je fait <xcl:set name="toto" value="string($web:request/@toto)" /> ca marche pas non plus. pourtant si je fait dataSet.addGlobalProperty(new QName("request" ), request) ; et que je fait <xcl:set name="toto" value="$request" /> il m'affiche bien l'adress de mon objet XComponent . Bien sur je fait des : <xcl:echo value="$toto" /> pour afficher. Enfin voila je ne comprend pas d'ou vien mon erreur ... |
|||||
| ppoulard | Posté le : 15 Déc, 2006 à 10:14:17
|
|||||
|
Messages :41
|
"pourtant si je fait dataSet.addGlobalProperty(new QName("request" ), request) ; et que je fait <xcl:set name="toto" value="$request" /> il m'affiche bien l'adress de mon objet XComponent ." que donne alors : <xcl:echo value="string($request/@toto)" /> ? |
|||||
| ppoulard | Posté le : 15 Déc, 2006 à 10:15:22
|
|||||
|
Messages :41
|
et ceci : maMap.put( new QName( "toto" ) , "toto" ) ; ? (à mon avis c'est bien de là que vient le problème) --Message édité par ppoulard le 15-12-06 à 10:16:45-- |
|||||
| edddy30 | Posté le : 15 Déc, 2006 à 11:21:10
|
|||||
|
Messages :2
|
Quelques tests plus tard ... Alors si je fait : dataSet.addGlobalProperty(new QName("request" ), request) ; avec : maMap.put( new QName( "toto" ) , "toto" ) ; ou avec maMap.put ("toto" , "toto" ) ; et que je met : <xcl:echo value="string($request/@toto)" /> Resultatn RIEN ... parcontre sans le /@toto tj l'adress de l'objet. je me suis meme amuse a redefinir la methode toString pour etre sur que c'etait le bon XComponent. ok deuxieme point si je fait : dataSet.addGlobalProperty(WebNames.REQUEST_QNAME, request) ; avec maMap.put (new QName ("toto" ) , "toto" ) ; Resultat toujours rien avec <xcl:set name="who" value="{string($web:request/who)}" /> <xcl:set name="who" value="{string($web:request/@who)}" /> Bon sinon je garde le moral |
|||||
| ppoulard | Posté le : 15 Déc, 2006 à 14:10:34
|
|||||
|
Messages :41
|
HashMap maMap = new HashMap () ; maMap.put( new QName( "hello" ), "world" ); XComponent request = new XComponent ( maMap ) ; ProcessorInstance pi = new ProcessorInstance(); pi.unmarshal( new StringReader( "<xcl:active-sheet xmlns:xcl=\"http://www.inria.fr/xml/active-tags/xcl\">" + "<xcl:echo value=\"HELLO { string( $test/@hello ) }\"/>" + "</xcl:active-sheet>") ); DataSet dataSet = new DataSet( pi ); dataSet.addGlobalProperty( new QName( "test" ), request ); pi.callMain( dataSet ); output : HELLO world donc le problème est ailleurs... D'ailleurs je viens de le voir : <xcl:echo value="{ string($request/@toto) }"/> avec les accolades, c'est mieux |
|||||
| aK | Posté le : 15 Déc, 2006 à 21:44:12
|
|||||
|
Messages :4
|
Bonsoir, Il y a quelque chose que je ne saisis pas très bien avec XFile. Donc, avant l'exécution du mapping je créé mes web:request et web:response, en spécifiant web:output sur "tmp:///result.xml" L'execution du mapping genere bien le fichier xml (dans un ss-rep de vfs_cache/) ; ce fichier contient bien ce que j'attends. Ensuite, je fais XFile file = XFile.getXFile("tmp:///output.xml"); puis j'ajoute file à mon dataSet... (par ex sous le nom "result") : dataSet.addGlobalProperty(new QName("result"), file); Dans le jeu de test, après le affiche "tmp://output.xml" (il devrait afficher une référence non ?) également... Et il m'est impossible de "naviguer" à la XPath dedans : n'affiche rien J'avoue que je sèche un peu là... ! Merci... ;) --Message édité par aK le 15-12-06 à 21:50:44-- |
|||||
| aK | Posté le : 15 Déc, 2006 à 21:53:08
|
|||||
|
Messages :4
|
Bon, il faut lire ce qui suit, visiblement la fonction d'edit de post de ce forum n'aime pas Active Tags ;) Dans le jeu de test, après le <web:post ...> </web:post> <xcl:echo value="{$result}" /> affiche "tmp://output.xml" (il devrait afficher une référence non ?) <xcl:echo value="{value($result)}" /> également... Et il m'est impossible de "naviguer" à la XPath dedans : <xcl:echo value="{string(value($result)/personne/nom)}" /> n'affiche rien J'avoue que je sèche un peu là... ! Merci... ! |
|||||
| ppoulard | Posté le : 18 Déc, 2006 à 09:32:11
|
|||||
|
Messages :41
|
<xcl:echo value="{$result}" /> affiche la valeur string() de l'objet <xcl:echo value="{string(value($result)/personne/nom)}" /> n'affiche rien car dans la doc de l'objet io:x-file, les fils de ces objets sont les fichiers du file system contenus dans ce répertoire, or il ne s'agit pas d'un répertoire mais d'un fichier ; par définition, un fichier ne contient pas d'autres fichiers ; pour accéder au contenu XML du fichier, il faut le parser avec <xcl:parse ...> |
|||||
| aK | Posté le : 19 Déc, 2006 à 00:02:58
|
|||||
|
Messages :4
|
> Bonsoir, > Votre astuce de jeudi m'a permis d'avancer un peu, mais je me retrouve coincé à nouveau... > L'output est OK sur tmp:///output.xml mais je dois mal comprendre comment fonctionne XFile > Étant donné que c'est un XOperable, si j'ai bien compris, on doit pouvoir "naviguer" à l'aide d'XPath, mais... Je n'y arrive point :\ on peut naviguer avec XPath dans le FILE SYSTEM ; pour voir l'interieur du fichier XML, il faut faire <xcl:parse ...> tout simplement |
|||||
| Sujets complémentaires : | ||||||
| ||||||
XUnitWeb XUnitWeb
|
![]() |