Laurent Perez wrote:
Hello
Je cherche à pouvoir toucher Cocoon à partir de ma couche de
composants Spring : quelque chose de très basique, c'est à dire
pouvoir récupérer la sortie XML d'un <map:match pattern="xx">. Tous
mes composants Spring sont déclarés dans mon applicationContext.xml,
qui est chargé par le web.xml de la webapp Cocoon.
Le block spring-app dans le trunk (1) ressemble à ce que je cherche à
faire : org.apache.cocoon.core.Core apparait comme un bean
"cocoon-core" dans l'applicationContext.xml. Je suppose qu'à partir du
moment où je peux toucher au Core, il doit bien y avoir un moyen de
toucher une sitemap ensuite (?).
Seulement spring-app n'est pas du tout documenté, et je ne sais pas
s'il est plutôt fait pour toucher Spring à partir de Cocoon, ou
l'inverse. Ensuite je me demande si exposer directement le Core n'est
pas overkill pour ce que je cherche à faire.
Quelqu'un pourrait-il m'éclairer sur ce point ?
Le block spring-app tire parti de la réarchitecture de la gestion des
composants qui a été faite dans la future version 2.2.
L'idée de initiale part du constat que Avalon, à la base de Cocoon,
n'est plus le seul conteneur léger sur le marché et qu'il est nécéssaire
d'intégrer les conteneurs plus modernes comme Spring, Hivemind ou Pico.
Dans la version 2.1, il est facile d'intégrer ces conteneurs "à
l'intérieur" de Cocoon, mais en gardant une barrière relativement
étanche entre les différents mondes. Voir le bricks-cms de Bertrand [1]
ou la présentation de Ugo Cei à la GetTogether 2004 [2].
Dans la version 2.2, il y a un pont entre des conteneurs divers hébergés
par Cocoon. Concrètement, cela signifie qu'un composant géré par Avalon
pourra voir un composant Spring comme s'il était géré par Avalon, et
réciproquement.
Pour revenir à ton problème, il devrait suffire que tu puisses accéder
au SourceResolver pour appeler un pipeline avec "cocoon://xxx", et il
faut donc "l'injecter" dans l'ApplicationContext Spring. Je suppose que
tu utilises le ServletContextListener déclaré dans web.xml, ce qui
malheureusement va instancier tous les beans avant que Cocoon aie créé
ses composants, dont le SourceResolver.
Une solution est de déclarer dans le contexte Spring une implémentation
"fantôme" de SourceResolver, prête à déléguer au "vrai" resolver
lorsqu'il sera disponible, et qui sera utilisée par les autres beans.
Dans la partie Cocoon de l'appli, soit via un petit composant
ThreadSafe, soit juste avant d'appeler les beans Spring, tu donnes le
"vrai" resolver au fantôme, ce qui permet aux beans d'accéder aux
pipelines Cocoon.
C'est du design en direct et je ne l'ai pas testé, mais ça devrait faire
l'affaire !
Sylvain
[1]
http://svn.apache.org/repos/asf/cocoon/whiteboard/example-apps/bricks-cms/
[2] http://www.apache.org/dist/cocoon/events/gt2004/presentations/
--
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:[EMAIL PROTECTED]
Autres commandes : mailto:[EMAIL PROTECTED]