You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users-fr@cocoon.apache.org by Marc Salvetti <ma...@notremanou.net> on 2005/08/18 14:13:06 UTC
Comment acceder au contexte authentication depuis le flowscript
Bonjour,
j'ai cette fonction dans mon script :
function saveCartDoc(contextName, path, cartDoc){
var manager =
cocoon.getComponent(Packages.org.apache.cocoon.webapps.authentication.AuthenticationManager.ROLE);
try{
cocoon.log.debug("saving cartdoc to context " + contextName + "
at path " + path);
var frag = cartDoc.createDocumentFragment();
frag.appendChild(cartDoc.getDocumentElement());
var user = manager.isAuthenticated("cfmhandler");
var ctx = user.getContext();
ctx.setXML(path, frag);
} finally {
cocoon.releaseComponent(manager);
}
}
Et j'ai deux questions :
-Est-ce que cette approche est correcte pour écrire dans le contexte ?
-Pourquoi le code plante au moment du releaseComponent() ? d'après
l'erreur manager est toujours null car j'ai une NPE sur cette ligne.
---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
Autres commandes : mailto:users-fr-help@cocoon.apache.org
Re: Comment acceder au contexte authentication depuis le flowscript
Posted by Sylvain Wallez <sy...@apache.org>.
Aurélien DEHAY wrote:
> Hello
>
> Marc Salvetti wrote:
>
>> Bonjour,
>
> <snip/>
>
> Si j'ai bien compris, c'est un bout de code qui va écrire dans le
> contexte de l'utilisateur. Pourquoi ne pas utiliser
> http://cocoon.apache.org/2.1/userdocs/transformers/writedomsession-transformer.html
> ou http://cocoon.apache.org/2.1/developing/webapps/contexts.html ?
D'une façon générale, les composants de pipeline avec effet de bord sont
considérés comme une mauvaise pratique _sauf_ lorsqu'ils ne font pas
partie de ce qui est renvoyé au navigateur, c'est à dire lorsqu'ils sont
appelées depuis le contrôleur, comme par exemple avec
PipelineUtil.processToDOM().
Ces composants existaient avant l'arrivée de flowscript, et l'approche
de Marc est de mon point de vue plus "clean" :-)
Sylvain
--
Sylvain Wallez Anyware Technologies
http://people.apache.org/~sylvain http://www.anyware-tech.com
Apache Software Foundation Member Research & Technology Director
---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
Autres commandes : mailto:users-fr-help@cocoon.apache.org
Re: Comment acceder au contexte authentication depuis le flowscript
Posted by Marc Salvetti <ma...@notremanou.net>.
Je dois dire que j'avais eu beaucoup de mal a implementer le process du
pipeline qui ecrit ds la session et qui est appelé a partir du script.
Avec un peu de recul, ca fait quand meme beaucoup de chose a faire pour
ecrire un bout de xml ds le contexte :)
Sylvain Wallez a écrit :
> Marc Salvetti wrote:
>
>> Bonjour Aurélien,
>>
>> C'est ce que je faisait en utilisant sendPage("ma-requete-session");
>> suivi d'un redirectTo(sucessPipeline)
>> D'ailleurs je me suis toujours demandé si c'était correct de faire ça.
>> Ca marchait bien jusqu'a que j'ai besoin de faire un
>> sendPageAndWait() après avoir sauvé ce doc car ca crée une erreur
>> "pipe has already been processed for this request"
>
>
>
> Cette erreur est dûe au fait que sendPage() envoie une réponse mais ne
> suspend pas le script, et qu'on renvoie une deuxième réponse ensuite
> avec le sendPageAndWait()...
>
>> Du coup, j'ai essayé cette solution, qui marchait très bien avec le
>> SessionManager pour un contexte quelconque, mais quand j'ai voulu
>> aussi acceder au contexte authentication, je me suis heurté au fait
>> que le SessionManager ne connait pas le contexte authentication (en
>> tout cas getContext('authentication') retourne toujours null).
>>
>> Donc j'en suis là, à essayer de faire une deuxieme fonction qui ecrit
>> ds le contexte authentication en utilisant l'api cocoon.
>> Mais qq chose me dit que je me complique la vie pour pas grand chose ;)
>
>
>
> Naaan, c'est bien plus beau comme ça :-)
>
> Sylvain
>
---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
Autres commandes : mailto:users-fr-help@cocoon.apache.org
Re: Comment acceder au contexte authentication depuis le flowscript
Posted by Sylvain Wallez <sy...@apache.org>.
Marc Salvetti wrote:
> Bonjour Aurélien,
>
> C'est ce que je faisait en utilisant sendPage("ma-requete-session");
> suivi d'un redirectTo(sucessPipeline)
> D'ailleurs je me suis toujours demandé si c'était correct de faire ça.
> Ca marchait bien jusqu'a que j'ai besoin de faire un sendPageAndWait()
> après avoir sauvé ce doc car ca crée une erreur "pipe has already been
> processed for this request"
Cette erreur est dûe au fait que sendPage() envoie une réponse mais ne
suspend pas le script, et qu'on renvoie une deuxième réponse ensuite
avec le sendPageAndWait()...
> Du coup, j'ai essayé cette solution, qui marchait très bien avec le
> SessionManager pour un contexte quelconque, mais quand j'ai voulu
> aussi acceder au contexte authentication, je me suis heurté au fait
> que le SessionManager ne connait pas le contexte authentication (en
> tout cas getContext('authentication') retourne toujours null).
>
> Donc j'en suis là, à essayer de faire une deuxieme fonction qui ecrit
> ds le contexte authentication en utilisant l'api cocoon.
> Mais qq chose me dit que je me complique la vie pour pas grand chose ;)
Naaan, c'est bien plus beau comme ça :-)
Sylvain
--
Sylvain Wallez Anyware Technologies
http://people.apache.org/~sylvain http://www.anyware-tech.com
Apache Software Foundation Member Research & Technology Director
---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
Autres commandes : mailto:users-fr-help@cocoon.apache.org
Re: Comment acceder au contexte authentication depuis le flowscript
Posted by Marc Salvetti <ma...@notremanou.net>.
Bonjour Aurélien,
C'est ce que je faisait en utilisant sendPage("ma-requete-session");
suivi d'un redirectTo(sucessPipeline)
D'ailleurs je me suis toujours demandé si c'était correct de faire ça.
Ca marchait bien jusqu'a que j'ai besoin de faire un sendPageAndWait()
après avoir sauvé ce doc car ca crée une erreur "pipe has already been
processed for this request"
Du coup, j'ai essayé cette solution, qui marchait très bien avec le
SessionManager pour un contexte quelconque, mais quand j'ai voulu aussi
acceder au contexte authentication, je me suis heurté au fait que le
SessionManager ne connait pas le contexte authentication (en tout cas
getContext('authentication') retourne toujours null).
Donc j'en suis là, à essayer de faire une deuxieme fonction qui ecrit ds
le contexte authentication en utilisant l'api cocoon.
Mais qq chose me dit que je me complique la vie pour pas grand chose ;)
Marc
Aurélien DEHAY a écrit :
> Hello
>
> Marc Salvetti wrote:
>
>> Bonjour,
>
> <snip/>
>
> Si j'ai bien compris, c'est un bout de code qui va écrire dans le
> contexte de l'utilisateur. Pourquoi ne pas utiliser
> http://cocoon.apache.org/2.1/userdocs/transformers/writedomsession-transformer.html
> ou http://cocoon.apache.org/2.1/developing/webapps/contexts.html ?
>
> ---------------------------------------------------------------------
> Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
> Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
> Autres commandes : mailto:users-fr-help@cocoon.apache.org
>
>
>
> .
>
---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
Autres commandes : mailto:users-fr-help@cocoon.apache.org
Re: Comment acceder au contexte authentication depuis le flowscript
Posted by Aurélien DEHAY <ad...@zorel.org>.
Hello
Marc Salvetti wrote:
> Bonjour,
<snip/>
Si j'ai bien compris, c'est un bout de code qui va écrire dans le
contexte de l'utilisateur. Pourquoi ne pas utiliser
http://cocoon.apache.org/2.1/userdocs/transformers/writedomsession-transformer.html
ou http://cocoon.apache.org/2.1/developing/webapps/contexts.html ?
---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
Autres commandes : mailto:users-fr-help@cocoon.apache.org
Re: Comment acceder au contexte authentication depuis le flowscript
Posted by Sylvain Wallez <sy...@apache.org>.
Marc Salvetti wrote:
> <snip/>
>
> Desolé de ces mails à repetition mais je crois approcher de la solution :
>
>> Une autre chose que je ne comprend pas, c'est pourquoi et a quel
>> endroit du code setXml() est appelé au moment du releaseComponent() ?
>>
> En fait, si je met en commentaire l'appel a setXML, l'erreur
> disparait, ce qui voudrait dire que le code ne plante pas au moment du
> releaseComponent() comme le dit le n° de ligne de l'erreur initiale,
> mais bien au moment de l'appel a setXML
>
> Deuxieme chose, j'ai fait une petite fct de test :
> function test(contextName, path){
Petite remarque au passage : cette méthode pour passer les paramètres
est "deprecated" depuis qu'on a réaliser qu'il y avait une grosse
différence sémantique entre l'utilisation des paramètres par position
dans JavaScript alors qu'ils sont passés par leur nom dans la sitemap.
En gros, il n'y a pas de relation entre le nom du paramètre dans la
sitemap et le nom dans la déclaration de fonction. Changer l'ordre des
<map:parameter> dans la sitemap change l'ordre des paramètres d'appel de
la fonction.
Cet façon de procéder sera supprimée dans Cocoon 2.2 et est signalée
dans la version courant dans le fichier deprecated.log.
L'approche "future-proof" est d'utiliser "cocoon.parameters":
function test() {
var contextName = cocoon.parameters['contextName'];
var path = cocoon.parameters['path'];
> var manager =
> cocoon.getComponent(Packages.org.apache.cocoon.webapps.authentication.AuthenticationManager.ROLE);
>
> try{
> var user = manager.isAuthenticated("cfmhandler");
> var ctx = user.getContext();
> var frag = ctx.getXML(path);
> cocoon.log.debug("cart : " + frag.getChildNodes().getLength());
> } finally {
> cocoon.releaseComponent(manager);
> }
> }
>
> que j'appelle directement a partir de la sitemap comme ceci :
>
> <map:match pattern="test">
> <map:act type="auth-protect">
> <map:parameter name="handler" value="cfmhandler"/>
> <map:call function="test">
> <map:parameter name="contextName"
> value="authentication"/>
> <map:parameter name="path"
> value="authentication/cart"/>
> </map:call>
> </map:act>
> </map:match>
>
> Et ce code marche, a savoir j'ai bien un message ds le log cart : 1 et
> pas d'erreur
Bon, et si tu mets un ctx.setXML juste après le ctx.getXML, ça plante
toujours?
> Donc, ca veut dire que
> -Sylvain a bien senti le probleme ;)
> -le contexte se perd quelquepart entre l'appel la sitemap et l'appel
> de ma fonction saveCartDoc
>
> Ce qui reste a comprendre, c'est ou et pourquoi ce contexte devient
> inaccessible depuis le flow alors que l'appel a la fonction d'origine
> est bien encadré par le auth-protect ?
Ouais, that's the question...
Sylvain
--
Sylvain Wallez Anyware Technologies
http://people.apache.org/~sylvain http://www.anyware-tech.com
Apache Software Foundation Member Research & Technology Director
---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
Autres commandes : mailto:users-fr-help@cocoon.apache.org
Re: Comment acceder au contexte authentication depuis le flowscript
Posted by Marc Salvetti <ma...@notremanou.net>.
<snip/>
Desolé de ces mails à repetition mais je crois approcher de la solution :
> Une autre chose que je ne comprend pas, c'est pourquoi et a quel
> endroit du code setXml() est appelé au moment du releaseComponent() ?
>
En fait, si je met en commentaire l'appel a setXML, l'erreur disparait,
ce qui voudrait dire que le code ne plante pas au moment du
releaseComponent() comme le dit le n° de ligne de l'erreur initiale,
mais bien au moment de l'appel a setXML
Deuxieme chose, j'ai fait une petite fct de test :
function test(contextName, path){
var manager =
cocoon.getComponent(Packages.org.apache.cocoon.webapps.authentication.AuthenticationManager.ROLE);
try{
var user = manager.isAuthenticated("cfmhandler");
var ctx = user.getContext();
var frag = ctx.getXML(path);
cocoon.log.debug("cart : " + frag.getChildNodes().getLength());
} finally {
cocoon.releaseComponent(manager);
}
}
que j'appelle directement a partir de la sitemap comme ceci :
<map:match pattern="test">
<map:act type="auth-protect">
<map:parameter name="handler" value="cfmhandler"/>
<map:call function="test">
<map:parameter name="contextName"
value="authentication"/>
<map:parameter name="path" value="authentication/cart"/>
</map:call>
</map:act>
</map:match>
Et ce code marche, a savoir j'ai bien un message ds le log cart : 1 et
pas d'erreur
Donc, ca veut dire que
-Sylvain a bien senti le probleme ;)
-le contexte se perd quelquepart entre l'appel la sitemap et l'appel de
ma fonction saveCartDoc
Ce qui reste a comprendre, c'est ou et pourquoi ce contexte devient
inaccessible depuis le flow alors que l'appel a la fonction d'origine
est bien encadré par le auth-protect ?
Marc
---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
Autres commandes : mailto:users-fr-help@cocoon.apache.org
Re: Comment acceder au contexte authentication depuis le flowscript
Posted by Marc Salvetti <ma...@notremanou.net>.
Marc Salvetti a écrit :
> <snip/>
>
>>
>> Hmm... en remontant la piste depuis setXML, on trouve que
>> SessionContext.getState() renvoie null.
>
>
> Comment est-ce que tu arrive a voir ça ds la trace ???
>
Bon, en allant chercher ds les sources java, j'arrive a voir ce que tu
veux dire, sauf qu'apparement c'est AuthenticationContext.getState()
qui renvoie null.
>> Et ce "state" est n'est valué que dans
>> DefaultAuthenticationManager.login().
>>
> J'imagine que cette fonction est appelée par la login action ? Et
> dans ce cas, je n'explique toujours pas la NPE au moment du release :(
>
Une autre chose que je ne comprend pas, c'est pourquoi et a quel endroit
du code setXml() est appelé au moment du releaseComponent() ?
Marc
---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
Autres commandes : mailto:users-fr-help@cocoon.apache.org
Re: Comment acceder au contexte authentication depuis le flowscript
Posted by Aurélien DEHAY <ad...@zorel.org>.
Bonjour.
Ca serait bien le point de départ d'un design pattern sur l'agencement
des tuyaux ça.... Bon, ok, je me tais :p
--
Aurélien
---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
Autres commandes : mailto:users-fr-help@cocoon.apache.org
Re: Comment acceder au contexte authentication depuis le flowscript
Posted by Marc Salvetti <ma...@notremanou.net>.
> Ah, enfin ! Ce n'était donc pas de la magie noire :-)
>
oui, ca devenait inquietant cette histoire :D
> Est-ce qu'il ne vaudrait pas mieux englober tous tes <map:match> dans
> le <map:act type="auth-protect"> ?
>
Effectivement, ca serait beaucoup mieux, mais pour ça il faudrait
separer les matchers necessitant une authentification des autres,
idealement dans une autre sitemap, et dans l'etat actuel d'avancement du
projet (tres proche de la fin) ca devient vraiment difficile a faire.
Par contre, pour mon prochain projet, je verrai bien ce genre
d'organisation :
-une sitemap globale
-une sitemap par handler d'authentification
-une sitemap pour les acces aux données (seulement des pipes internes)
-une sitemap pour le systeme de mailing de l'application (qui risque
d'etre assez complexe)
je pense que ca simplifierait beaucoup de pipelines car dans l'etat
actuel des choses, j'ai beaucoup de repetitions dans mes pipes.
Marc
---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
Autres commandes : mailto:users-fr-help@cocoon.apache.org
Re: Comment acceder au contexte authentication depuis le flowscript
Posted by Sylvain Wallez <sy...@apache.org>.
Marc Salvetti wrote:
> Ca y est, j'ai la solution !
>
> En fait, le pb etait au niveau du matcher de la continuation :
>
> j'ai remplacé
>
> <map:match pattern="**continue.html">
> <map:call continuation="{request-param:continuation-id}"/>
> </map:match>
>
> par
>
> <map:match pattern="**continue.html">
> <map:act type="auth-loggedIn">
> <map:parameter name="handler" value="cfmhandler"/>
> <map:act type="auth-protect">
> <map:parameter name="handler" value="cfmhandler"/>
> <map:call
> continuation="{request-param:continuation-id}"/>
> </map:act>
> </map:act>
> <map:call continuation="{request-param:continuation-id}"/>
> </map:match>
>
> et ca marche très bien :)
Ah, enfin ! Ce n'était donc pas de la magie noire :-)
Est-ce qu'il ne vaudrait pas mieux englober tous tes <map:match> dans le
<map:act type="auth-protect"> ?
Sylvain
--
Sylvain Wallez Anyware Technologies
http://people.apache.org/~sylvain http://www.anyware-tech.com
Apache Software Foundation Member Research & Technology Director
---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
Autres commandes : mailto:users-fr-help@cocoon.apache.org
Re: Comment acceder au contexte authentication depuis le flowscript
Posted by Marc Salvetti <ma...@notremanou.net>.
Ca y est, j'ai la solution !
En fait, le pb etait au niveau du matcher de la continuation :
j'ai remplacé
<map:match pattern="**continue.html">
<map:call continuation="{request-param:continuation-id}"/>
</map:match>
par
<map:match pattern="**continue.html">
<map:act type="auth-loggedIn">
<map:parameter name="handler" value="cfmhandler"/>
<map:act type="auth-protect">
<map:parameter name="handler" value="cfmhandler"/>
<map:call
continuation="{request-param:continuation-id}"/>
</map:act>
</map:act>
<map:call continuation="{request-param:continuation-id}"/>
</map:match>
et ca marche très bien :)
Merci beaucoup pour ton aide précieuse !
Marc
Marc Salvetti a écrit :
>
>> Là où je ne pige pas la cause de l'erreur, c'est que
>> checkAuthentication() appelle setState() lorsque l'utilisateur a été
>> reconnu comme déjà authentifié (credentials stockés en attribut de
>> session). Et donc en principe, si on est passé dans <map:act
>> type="auth-protect"> l'état devrait être initialisé et on ne devrait
>> pas avoir cette NPE.
>>
>> Est-tu bien sûr que ta requête passe par l'action auth-protect?
>>
> Comment en etre sur ?
>
> voici globalement ce que je fait :
> matcher sitemap d'origine :
> <map:match pattern="view-cart-member-*-*">
> <map:act type="auth-protect">
> <map:parameter name="handler" value="cfmhandler"/>
> <map:call resource="view-cart">
> <map:parameter name="position" value="{../1}"/>
> <map:parameter name="page" value="{../2}"/>
> <map:parameter name="id-user" value="{ID}"/>
> <map:parameter name="id-org" value="{org}"/>
> <map:parameter name="role" value="{role}"/>
> <map:parameter name="suffix" value="member"/>
> <map:parameter name="context" value="authentication"/>
> </map:call>
> </map:act>
> </map:match>
>
> La resource view-cart :
> <map:resource name="view-cart">
> <map:call function="handleForm">
> <map:parameter name="function" value="form_cart2xml"/>
> <map:parameter name="form-definition"
> value="forms/cart-definition.xml"/>
> <map:parameter name="bindingURI"
> value="forms/cart-binding.xml"/>
> <map:parameter name="cartDocPath" value="{context}/cart"/>
> <map:parameter name="contextName" value="{context}"/>
> <map:parameter name="id-user" value="{id-user}"/>
> <map:parameter name="id-org" value="{id-org}"/>
> <map:parameter name="role" value="{role}"/>
> <map:parameter name="displayPipeline"
> value="view-cart-{suffix}.html"/>
> </map:call>
> </map:resource>
>
> Donc appel a handleForm, qui appelle ma fonction flowscript
> form_cart2xml (ds cette fonction, id-user, id-org et role st
> accessibles sans problème)
>
> La fonction form_cart2xml appelle a son tour la fct saveCartDoc.
>
> Peut etre que le pb est du au passage par handleForm ?
>
> Marc
>
>> Et est-ce vraiment lié au release?
>>
>> Sylvain
>>
>
> ---------------------------------------------------------------------
> Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
> Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
> Autres commandes : mailto:users-fr-help@cocoon.apache.org
>
>
>
>
---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
Autres commandes : mailto:users-fr-help@cocoon.apache.org
Re: Comment acceder au contexte authentication depuis le flowscript
Posted by Marc Salvetti <ma...@notremanou.net>.
> Là où je ne pige pas la cause de l'erreur, c'est que
> checkAuthentication() appelle setState() lorsque l'utilisateur a été
> reconnu comme déjà authentifié (credentials stockés en attribut de
> session). Et donc en principe, si on est passé dans <map:act
> type="auth-protect"> l'état devrait être initialisé et on ne devrait
> pas avoir cette NPE.
>
> Est-tu bien sûr que ta requête passe par l'action auth-protect?
>
Comment en etre sur ?
voici globalement ce que je fait :
matcher sitemap d'origine :
<map:match pattern="view-cart-member-*-*">
<map:act type="auth-protect">
<map:parameter name="handler" value="cfmhandler"/>
<map:call resource="view-cart">
<map:parameter name="position" value="{../1}"/>
<map:parameter name="page" value="{../2}"/>
<map:parameter name="id-user" value="{ID}"/>
<map:parameter name="id-org" value="{org}"/>
<map:parameter name="role" value="{role}"/>
<map:parameter name="suffix" value="member"/>
<map:parameter name="context" value="authentication"/>
</map:call>
</map:act>
</map:match>
La resource view-cart :
<map:resource name="view-cart">
<map:call function="handleForm">
<map:parameter name="function" value="form_cart2xml"/>
<map:parameter name="form-definition"
value="forms/cart-definition.xml"/>
<map:parameter name="bindingURI"
value="forms/cart-binding.xml"/>
<map:parameter name="cartDocPath" value="{context}/cart"/>
<map:parameter name="contextName" value="{context}"/>
<map:parameter name="id-user" value="{id-user}"/>
<map:parameter name="id-org" value="{id-org}"/>
<map:parameter name="role" value="{role}"/>
<map:parameter name="displayPipeline"
value="view-cart-{suffix}.html"/>
</map:call>
</map:resource>
Donc appel a handleForm, qui appelle ma fonction flowscript
form_cart2xml (ds cette fonction, id-user, id-org et role st accessibles
sans problème)
La fonction form_cart2xml appelle a son tour la fct saveCartDoc.
Peut etre que le pb est du au passage par handleForm ?
Marc
> Et est-ce vraiment lié au release?
>
> Sylvain
>
---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
Autres commandes : mailto:users-fr-help@cocoon.apache.org
Re: Comment acceder au contexte authentication depuis le flowscript
Posted by Sylvain Wallez <sy...@apache.org>.
Marc Salvetti wrote:
> <snip/>
>
>>
>> Hmm... en remontant la piste depuis setXML, on trouve que
>> SessionContext.getState() renvoie null.
>
>
> Comment est-ce que tu arrive a voir ça ds la trace ???
Facile, c'est comme le marc de café. Je peux bien l'avouer, je suis en
fait Mme Irma sous un pseudo :-D
Plus sérieusement, voici le chemin que j'ai suivi.
Tout d'abord, la partie intéressante de la stacktrace
Caused by: java.lang.NullPointerException
at
org.apache.cocoon.webapps.authentication.context.AuthenticationContext.setXML(AuthenticationContext.java:214)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at
org.mozilla.javascript.NativeJavaMethod.call(NativeJavaMethod.java:230)
Ce qu'on voit là, c'est que le pb est dans setXML(), à la ligne 214,
appelé depuis le flowscript (NativeMethod.call() suivi d'un appel par
réflection).
La ligne 214 de AuthenticationContext, dans sa version de la 2.1.7:
final String applicationName = this.getState().getApplicationName();
Qu'est ce qui peut provoquer une NPE là-dedans? "this" ne peut pas être
nul, c'est l'objet courant. C'est donc le résultat de getState() qui est
nul.
En remontant le code qui se déroule dans getState() jusque dans
DefaultAuthenticationManager, on trouve qu'il s'agit de la valeur de
l'attribut de requête REQUEST_STATE_KEY. Et le seul endroit où il est
renseigné est dans setState(), lui-même appelé uniquement par
DefaultAuthenticationManager dans les méthodes login() et
checkAuthentication().
Là où je ne pige pas la cause de l'erreur, c'est que
checkAuthentication() appelle setState() lorsque l'utilisateur a été
reconnu comme déjà authentifié (credentials stockés en attribut de
session). Et donc en principe, si on est passé dans <map:act
type="auth-protect"> l'état devrait être initialisé et on ne devrait pas
avoir cette NPE.
Est-tu bien sûr que ta requête passe par l'action auth-protect?
Et est-ce vraiment lié au release?
Sylvain
--
Sylvain Wallez Anyware Technologies
http://people.apache.org/~sylvain http://www.anyware-tech.com
Apache Software Foundation Member Research & Technology Director
---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
Autres commandes : mailto:users-fr-help@cocoon.apache.org
Re: Comment acceder au contexte authentication depuis le flowscript
Posted by Marc Salvetti <ma...@notremanou.net>.
<snip/>
>
> Hmm... en remontant la piste depuis setXML, on trouve que
> SessionContext.getState() renvoie null.
Comment est-ce que tu arrive a voir ça ds la trace ???
> Et ce "state" est n'est valué que dans
> DefaultAuthenticationManager.login().
>
J'imagine que cette fonction est appelée par la login action ? Et dans
ce cas, je n'explique toujours pas la NPE au moment du release :(
Marc
---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
Autres commandes : mailto:users-fr-help@cocoon.apache.org
Re: Comment acceder au contexte authentication depuis le flowscript
Posted by Marc Salvetti <ma...@notremanou.net>.
Oui, il y a une login action avant l'appel dans ce pipeline :
<map:match pattern="view-cart-member-*-*">
<map:act type="auth-protect">
<map:parameter name="handler" value="cfmhandler"/>
<map:call resource="view-cart">
<map:parameter name="position" value="{../1}"/>
<map:parameter name="page" value="{../2}"/>
<map:parameter name="id-user" value="{ID}"/>
<map:parameter name="id-org" value="{org}"/>
<map:parameter name="role" value="{role}"/>
<map:parameter name="suffix" value="member"/>
<map:parameter name="context" value="authentication"/>
</map:call>
</map:act>
</map:match>
Sylvain Wallez a écrit :
> Marc Salvetti wrote:
>
>> Merci de ta réponse,
>>
>> voila la trace :
>
>
>
>> Caused by: java.lang.NullPointerException
>> at
>> org.apache.cocoon.webapps.authentication.context.AuthenticationContext.setXML(AuthenticationContext.java:214)
>>
>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> at
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>
>> at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>
>> at java.lang.reflect.Method.invoke(Method.java:324)
>> at
>> org.mozilla.javascript.NativeJavaMethod.call(NativeJavaMethod.java:230)
>
>
>
> Hmm... en remontant la piste depuis setXML, on trouve que
> SessionContext.getState() renvoie null. Et ce "state" est n'est valué
> que dans DefaultAuthenticationManager.login().
>
> Est-ce qu'il y a une login-action ou équivalent avant l'appel du
> flowscript?
>
> Sylvain
>
---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
Autres commandes : mailto:users-fr-help@cocoon.apache.org
Re: Comment acceder au contexte authentication depuis le flowscript
Posted by Aurélien DEHAY <ad...@zorel.org>.
Sylvain Wallez wrote:
<snip/>
> Est-ce qu'il y a une login-action ou équivalent avant l'appel du
> flowscript?
Il me semble, en tout cas c'est comme ça dans le sitemap, que pour que
les contextes soient accessibles, il faut que le tuyau soit dans un
<map:act type="auth-protect"/>
>
> Sylvain
>
---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
Autres commandes : mailto:users-fr-help@cocoon.apache.org
Re: Comment acceder au contexte authentication depuis le flowscript
Posted by Sylvain Wallez <sy...@apache.org>.
Marc Salvetti wrote:
> Merci de ta réponse,
>
> voila la trace :
> Caused by: java.lang.NullPointerException
> at
> org.apache.cocoon.webapps.authentication.context.AuthenticationContext.setXML(AuthenticationContext.java:214)
>
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>
> at java.lang.reflect.Method.invoke(Method.java:324)
> at
> org.mozilla.javascript.NativeJavaMethod.call(NativeJavaMethod.java:230)
Hmm... en remontant la piste depuis setXML, on trouve que
SessionContext.getState() renvoie null. Et ce "state" est n'est valué
que dans DefaultAuthenticationManager.login().
Est-ce qu'il y a une login-action ou équivalent avant l'appel du flowscript?
Sylvain
--
Sylvain Wallez Anyware Technologies
http://people.apache.org/~sylvain http://www.anyware-tech.com
Apache Software Foundation Member Research & Technology Director
---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
Autres commandes : mailto:users-fr-help@cocoon.apache.org
Re: Comment acceder au contexte authentication depuis le flowscript
Posted by Marc Salvetti <ma...@notremanou.net>.
Merci de ta réponse,
voila la trace :
java.lang.NullPointerException
at
org.apache.cocoon.components.flow.javascript.fom.FOM_JavaScriptInterpreter.handleContinuation(FOM_JavaScriptInterpreter.java:853)
at
org.apache.cocoon.components.treeprocessor.sitemap.CallFunctionNode.invoke(CallFunctionNode.java:123)
at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:46)
at
org.apache.cocoon.components.treeprocessor.sitemap.PreparableMatchNode.invoke(PreparableMatchNode.java:130)
at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:46)
at
org.apache.cocoon.components.treeprocessor.sitemap.ActTypeNode.invoke(ActTypeNode.java:138)
at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:68)
at
org.apache.cocoon.components.treeprocessor.sitemap.PipelineNode.invoke(PipelineNode.java:138)
at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:68)
at
org.apache.cocoon.components.treeprocessor.sitemap.PipelinesNode.invoke(PipelinesNode.java:92)
at
org.apache.cocoon.components.treeprocessor.ConcreteTreeProcessor.process(ConcreteTreeProcessor.java:234)
at
org.apache.cocoon.components.treeprocessor.ConcreteTreeProcessor.process(ConcreteTreeProcessor.java:176)
at
org.apache.cocoon.components.treeprocessor.TreeProcessor.process(TreeProcessor.java:243)
at
org.apache.cocoon.components.treeprocessor.sitemap.MountNode.invoke(MountNode.java:117)
at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:46)
at
org.apache.cocoon.components.treeprocessor.sitemap.PreparableMatchNode.invoke(PreparableMatchNode.java:130)
at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:68)
at
org.apache.cocoon.components.treeprocessor.sitemap.PipelineNode.invoke(PipelineNode.java:138)
at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:68)
at
org.apache.cocoon.components.treeprocessor.sitemap.PipelinesNode.invoke(PipelinesNode.java:92)
at
org.apache.cocoon.components.treeprocessor.ConcreteTreeProcessor.process(ConcreteTreeProcessor.java:234)
at
org.apache.cocoon.components.treeprocessor.ConcreteTreeProcessor.process(ConcreteTreeProcessor.java:176)
at
org.apache.cocoon.components.treeprocessor.TreeProcessor.process(TreeProcessor.java:243)
at org.apache.cocoon.Cocoon.process(Cocoon.java:608)
at
org.apache.cocoon.servlet.CocoonServlet.service(CocoonServlet.java:1123)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at
org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at
org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:534)
Caused by: java.lang.NullPointerException
at
org.apache.cocoon.webapps.authentication.context.AuthenticationContext.setXML(AuthenticationContext.java:214)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at
org.mozilla.javascript.NativeJavaMethod.call(NativeJavaMethod.java:230)
at org.mozilla.javascript.ScriptRuntime.call(ScriptRuntime.java:1244)
at
org.mozilla.javascript.continuations.ContinuationInterpreter.interpret(ContinuationInterpreter.java:1134)
at
org.mozilla.javascript.continuations.ContinuationInterpreter.interpret(ContinuationInterpreter.java:190)
at
org.mozilla.javascript.continuations.ContinuationInterpreter.interpret(ContinuationInterpreter.java:138)
at
org.mozilla.javascript.continuations.InterpretedFunctionImpl.call(InterpretedFunctionImpl.java:121)
at org.mozilla.javascript.ScriptRuntime.call(ScriptRuntime.java:1244)
at
org.mozilla.javascript.ScriptableObject.callMethod(ScriptableObject.java:1591)
at
org.apache.cocoon.components.flow.javascript.fom.FOM_JavaScriptInterpreter.handleContinuation(FOM_JavaScriptInterpreter.java:843)
... 49 more
Sylvain Wallez a écrit :
> Marc Salvetti wrote:
>
>> Bonjour,
>>
>> j'ai cette fonction dans mon script :
>> function saveCartDoc(contextName, path, cartDoc){
>>
>> var manager =
>> cocoon.getComponent(Packages.org.apache.cocoon.webapps.authentication.AuthenticationManager.ROLE);
>>
>> try{
>> cocoon.log.debug("saving cartdoc to context " + contextName +
>> " at path " + path);
>> var frag = cartDoc.createDocumentFragment();
>> frag.appendChild(cartDoc.getDocumentElement());
>> var user = manager.isAuthenticated("cfmhandler");
>> var ctx = user.getContext();
>> ctx.setXML(path, frag); } finally {
>> cocoon.releaseComponent(manager);
>> }
>> }
>>
>> Et j'ai deux questions :
>> -Est-ce que cette approche est correcte pour écrire dans le contexte ?
>
>
>
> Je ne sais pas trop dire, parce que je n'utilise pas
> l'authentication-fw... (et au passage, cette API qui réclame un
> DocumentFragment n'est pas vraiment sympathique...)
>
>> -Pourquoi le code plante au moment du releaseComponent() ? d'après
>> l'erreur manager est toujours null car j'ai une NPE sur cette ligne.
>
>
>
> Tu peux nous donner la trace de la NPE ?
>
> Sylvain
>
---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
Autres commandes : mailto:users-fr-help@cocoon.apache.org
Re: Comment acceder au contexte authentication depuis le flowscript
Posted by Sylvain Wallez <sy...@apache.org>.
Marc Salvetti wrote:
> Bonjour,
>
> j'ai cette fonction dans mon script :
> function saveCartDoc(contextName, path, cartDoc){
>
> var manager =
> cocoon.getComponent(Packages.org.apache.cocoon.webapps.authentication.AuthenticationManager.ROLE);
>
> try{
> cocoon.log.debug("saving cartdoc to context " + contextName + "
> at path " + path);
> var frag = cartDoc.createDocumentFragment();
> frag.appendChild(cartDoc.getDocumentElement());
> var user = manager.isAuthenticated("cfmhandler");
> var ctx = user.getContext();
> ctx.setXML(path, frag); } finally {
> cocoon.releaseComponent(manager);
> }
> }
>
> Et j'ai deux questions :
> -Est-ce que cette approche est correcte pour écrire dans le contexte ?
Je ne sais pas trop dire, parce que je n'utilise pas
l'authentication-fw... (et au passage, cette API qui réclame un
DocumentFragment n'est pas vraiment sympathique...)
> -Pourquoi le code plante au moment du releaseComponent() ? d'après
> l'erreur manager est toujours null car j'ai une NPE sur cette ligne.
Tu peux nous donner la trace de la NPE ?
Sylvain
--
Sylvain Wallez Anyware Technologies
http://people.apache.org/~sylvain http://www.anyware-tech.com
Apache Software Foundation Member Research & Technology Director
---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
Autres commandes : mailto:users-fr-help@cocoon.apache.org