Ce site met a disposition le build journalier de la traduction francaise du Maven: The Definitive Guide
Consultez :
  • Les documents de reference sur le projet original
  • Les sources de la traduction fr sur GitHub
  • maven


    7.4. Le module simple-weather

    Le prochain module que nous allons examiner pourrait être considéré comme un “service”. Ce module contient toute la logique nécessaire pour récupérer et parser les données provenant du flux RSS Yahoo! Météo. Bien qu'il ne contienne que trois classes Java et un test JUnit, il permet d'exposer un composant simple, WeatherService, qui sera utilisé par l'application web et par l'application en ligne de commande. Un projet d'entreprise contient très souvent plusieurs modules API permettant de centraliser la logique métier et les interactions avec des systèmes externes. Un système bancaire pourrait avoir un module qui récupère et analyse des données provenant d'un fournisseur tiers, et un système affichant des résultats sportifs pourrait interagir avec un flux XML qui fourit les scores du basket ou du football en temps réel. Dans l'Exemple 7.5, « POM du module simple-weather », ce module renferme toute l'activité réseau et le parsing du flux XML provenant du service Yahoo! Météo. Les autres modules peuvent dépendre de celui-ci et simplement appeler la méthode retrieveForecast() du service WeatherService qui prend en paramètre un code postal et retourne un objet Weather.

    Exemple 7.5. POM du module simple-weather

    <project xmlns="http://maven.apache.org/POM/4.0.0" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                          http://maven.apache.org/maven-v4_0_0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <parent>
        <groupId>org.sonatype.mavenbook.multispring</groupId>
        <artifactId>simple-parent</artifactId>
        <version>1.0</version>
      </parent>
      <artifactId>simple-weather</artifactId>
      <packaging>jar</packaging>
    
      <name>Simple Weather API</name>
    
      <dependencies>
        <dependency>
          <groupId>org.sonatype.mavenbook.multispring</groupId>
          <artifactId>simple-model</artifactId>
          <version>1.0</version>
        </dependency>
        <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.14</version>
        </dependency>
        <dependency>
          <groupId>dom4j</groupId>
          <artifactId>dom4j</artifactId>
          <version>1.6.1</version>
        </dependency>
        <dependency>
          <groupId>jaxen</groupId>
          <artifactId>jaxen</artifactId>
          <version>1.1.1</version>
        </dependency>
        <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-io</artifactId>
          <version>1.3.2</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
    </project>
    
    

    Le POM du module simple-weather étend celui du simple-parent, configure le type de packaging à jar et ajoute les dépendances suivantes :

    org.sonatype.mavenbook.multispring:simple-model:1.0

    Le module simple-weather parse et le transforme le flux RSS Yahoo! Météo en objet Weather. Il a donc une dépendance directe sur le module simple-model.

    log4j:log4j:1.2.14

    Le module simple-weather utilise Log4J pour afficher ses messages de log.

    dom4j:dom4j:1.6.1 et jaxen:jaxen:1.1.1

    Ces deux dépendances sont utilisées pour parser le XML provenant de Yahoo! Météo.

    org.apache.commons:commons-io:1.3.2 (scope=test)

    Cette dépendance dont le scope est test est utilisée par YahooParserTest.

    Analysons maintenant le service WeatherService de l'Exemple 7.6, « La classe WeatherService ». Cette classe ressemble beaucoup au service WeatherService de l'Exemple 6.3, « La classe WeatherService ». Bien qu'ils aient le même nom, le service de cet exemple comporte quelques légères différences. Dans cette version, la méthode retrieveForecast() retourne un objet Weather et le formatage est délégué à l'application appelant le service WeatherService. L'autre modification majeure concerne les classes YahooRetriever et YahooParser, qui sont maintenant des propriétés du service WeatherService.

    Exemple 7.6. La classe WeatherService

    package org.sonatype.mavenbook.weather;
    
    import java.io.InputStream;
    
    import org.sonatype.mavenbook.weather.model.Weather;
    
    public class WeatherService {
    
      private YahooRetriever yahooRetriever;
      private YahooParser yahooParser;
    
      public WeatherService() {}
    
      public Weather retrieveForecast(String zip) throws Exception {
        // Récupération des données
        InputStream dataIn = yahooRetriever.retrieve(zip);
    
        // Parsing des données
        Weather weather = yahooParser.parse(zip, dataIn);
    
        return weather;
      }
    
      public YahooRetriever getYahooRetriever() {
        return yahooRetriever;
      }
    
      public void setYahooRetriever(YahooRetriever yahooRetriever) {
        this.yahooRetriever = yahooRetriever;
      }
    
      public YahooParser getYahooParser() {
        return yahooParser;
      }
    
      public void setYahooParser(YahooParser yahooParser) {
        this.yahooParser = yahooParser;
      }
    }
    

    Pour finir, ce projet contient un fichier XML utilisé par Spring pour créer ce qu'on appelle l' ApplicationContext dont voici le fonctionnement : nos applications web et en ligne de commande ont besoin d'interagir avec le service WeatherService, pour cela elles récupèrent une instance de cette classe par l'intermédiaire de l'ApplicationContext Spring en utilisant le nom de bean weatherService. Notre application web utilise un contrôleur Spring MVC, celui-ci est associé à une instance du service WeatherService. L'application en ligne de commande charge ce même service à partir de la méthode statique main() grâce à l'ApplicationContext. Afin d'encourager la réutilisation du code, nous avons inclus le fichier applicationContext-weather.xml dans le répertoire src/main/resources, le rendant ainsi accessible dans le classpath. Les projets qui dépendent du module simple-weather peuvent donc charger ce fichier en utilisant la classe ClasspathXmlApplicationContext fournie par Spring et ainsi récupérer une instance du service WeatherService par l'intermédiaire de son nom : weatherService.

    Exemple 7.7. ApplicationContext Spring du module simple-weather

    <?xml version="1.0" encoding="UTF-8"?>
    
    <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
        default-lazy-init="true">
    
        <bean id="weatherService" 
                 class="org.sonatype.mavenbook.weather.WeatherService">
          <property name="yahooRetriever" ref="yahooRetriever"/>
          <property name="yahooParser" ref="yahooParser"/>
        </bean>    
    
        <bean id="yahooRetriever" 
                 class="org.sonatype.mavenbook.weather.YahooRetriever"/>    
    
        <bean id="yahooParser" 
                 class="org.sonatype.mavenbook.weather.YahooParser"/>
    </beans>

    Ce fichier déclare trois beans : yahooParser, yahooRetriever et weatherService. Le bean weatherService est une instance du service WeatherService. Le fichier XML configure également les propriétés de ce bean yahooParser et yahooRetriever qui référencent les noms des deux instances de classes en question. Vous pouvez comparer ce fichier applicationContext-weather.xml à la définition de l'architecture d'un sous-système de ce projet multimodule. Certains projets comme simple-webapp et simple-command peuvent référencer ce contexte et récupérer une instance du service WeatherService configurée avec des instances des classes YahooRetriever et YahooParser en propriété.