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