<texit info> author=E. Bruno title=XML TP5 </texit>

TP5 - La mise en place d’un application Web XML s’appuyant sur Apache Cocoon

Après avoir suivi la présentation de l’outils Apache Maven, vous mettrez en place une application Apache cocoon basique.

Après avoir configuré maven pour l’utilisation à l’USTV (ajout du proxy dans ~/.m2/settings.xml cf. http://maven.apache.org/guides/mini/guide-proxies.html), suivez le tutoriel Your first Cocoon application using Maven 2 pour installer l’application de base Cocoon 2.2 (http://cocoon.apache.org/2.2/).Pas de proxy à configurer pour l’upf.

Après avoir suivi le tutoriel Your first XML pipeline, mettez en place les pipelines nécessaires pour obtenir à partir de cocoon:

  1. le document XML books.xml
  2. le document XML intermédiaire dans le format XML pivot (books_pivot.xml) après application d’une feuille de style XSLT sur le document précédents (cf. TP sur XSLT)
  3. le document XHTML books.xhtml après application d’un autre feuille de style sur le document books_pivot.xml. Votre document fera référence à une feuille CSS pour la présentation.
  4. le document SVG books_prices.svg qui affichera un histogramme SVG des prix des livres.
  5. le document png books_prices.png qui affichera une version png du diagramme précédent.

Mettez en place, une utilisation plus poussée de cocoon en :

  1. Etudiant et mettant en place les divers composants du sitemap.
  2. Mettant en place uen application modulaire à base de blocks.

Dans le pom.xml à la fin de l’élément dependencies ajouter

<dependency>
 <groupId>org.apache.cocoon</groupId>
 <artifactId>cocoon-batik-impl</artifactId>
 <version>1.0.0</version>
</dependency>
 <dependency>
 <groupId>org.apache.cocoon</groupId>
 <artifactId>cocoon-fop-impl</artifactId>
 <version>1.0.0</version>
</dependency>

Pour utiliser le SQL Transformer vous devez :

  • Ajouter dans l’élément dependencies du pom.xml les dépendances suivantes pour que maven puisse les télécharger. Elles concernent le block databases de cocoon et les drivers de postgresql.
    <dependency>
	<groupId>org.apache.cocoon</groupId>
	<artifactId>cocoon-databases-impl</artifactId>
	<version>1.0.0</version>
     </dependency>
     <dependency>
	<groupId>postgresql</groupId>
	<artifactId>postgresql</artifactId>
	<version>8.4-702.jdbc3</version>
     </dependency>

Le .jar pour oracle n’est pas dans les dépôts, il faut donc le télécharger ici (dans la suite adapter la version) : http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html et l’installer “à la main”.

mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 \
   -Dversion=11.2.0.3 -Dpackaging=jar -Dfile=ojdbc6.jar -DgeneratePom=true 

on peut ensuite ajouter la dépendance dans le pom.xml :

    <dependency>
	<groupId>com.oracle</groupId>
	<artifactId>ojdbc6</artifactId>
	<version>11.2.0.3</version>
     </dependency>
  • Ensuite configurer la ou les sources de données que vous voulez utiliser en créant un fichier src/main/resources/META-INF/cocoon/spring/datasources.xml
datasources.xml
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
 
    <bean name="org.apache.avalon.excalibur.datasource.DataSourceComponent/personnel" class="org.apache.cocoon.databases.bridge.spring.avalon.SpringToAvalonDataSourceWrapper">
 
        <property name="wrappedBean">
            <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
              <property name="driverClassName" value="org.postgresql.Driver"/>
              <property name="url" value="jdbc:postgresql://localhost/test"/>
              <property name="username" value="test"/>
              <property name="password" value="test"/>
            </bean>
        </property>
 
    </bean>
</beans>
  • Le driver class name pour oracle oracle.jdbc.OracleDriver
  • L’url pour oracle
    jdbc:oracle:thin:@//10.8.0.2:1521
  • Créer un ou plusieurs fichiers XML qui contient le squelette des documents XML à générer et surtout les requêtes SQL à exécuter. Vous pouver ranger des sous-répertoires de src/main/resources/COB-INF (attention aux chemins dans le sitemap).

La syntaxe est expliquée ici http://cocoon.apache.org/2.1/userdocs/sql-transformer.html

testsql.xml
<page>
   <title>Hello</title>
   <content>
    <para>This is my first Cocoon page filled with sql data!</para>
    <sql:execute-query xmlns:sql="http://apache.org/cocoon/SQL/2.0"> 
     <sql:query name="personne">
       select * from personne 
     </sql:query>
    </sql:execute-query>
   </content>
  </page>
  1. finalement modifier le sitemap en ajoutant dans un pipeline un match pour générer le fichier XML précédent, lui appliquer le SQL Transformer et le serialiser.
  <map:match pattern="personne.xml">
        <map:generate src="testsql.xml"/>        
        <map:transform type="sql">
         <map:parameter name="use-connection" value="personnel"/>
         <map:parameter name="show-nr-of-rows" value="true"/> 
         <map:parameter name="clob-encoding" value="UTF-8"/> 
        </map:transform>
        <map:serialize type="xml"/>
  </map:match>
 
 <!-- Exemple de lecture d'un fichier avec type MIME -->
      <!-- Remarquer l'utilisation de l'URL pour passer un parametre -->
      <map:match pattern="CSS/*.css">
         <map:read mime-type="text/css" src="CSS/{1}.css"/>
      </map:match>
 
      <map:match pattern="DTD/*.dtd">
         <map:read mime-type="text/plain" src="DTD/{1}.dtd"/>
      </map:match>
        <map:match pattern="livres/pivots_*.xml">
        <map:generate src="Books/books.xml"/>
        <map:transform src="Books/tp3.xsl" type="saxon">
          <!-- Deux solutions -->
 
          <!-- Passage directe d'un paramètre -->
          <map:parameter name="topauthor" value="{1}"/>
 
 
          <!-- La feuille de style accepte les param depuis les URL
             ?param1=valeur1&param2=valeur2....
           -->
          <map:parameter name="use-request-parameters" value="true"/>
 
        </map:transform>
        <map:serialize type="xml"/>
      </map:match>