Cilia/Workshop/TP5/Système d'Information

From Wiki Adele Team
< Cilia‎ | Workshop‎ | TP5
Jump to: navigation, search

Objectif du TP

L'objectif de ce TP est de présenter une application de médiation utilisant le pattern split/aggregate. Dans cette application, nous réutilisons des composants issus de la bibliothèque Cilia et développons des composants spécifiques au projet.

Description de l'application

L'application permet à un client de suivre l'évolution de sa consommation sur son forfait internet, mobile ou fixe. Elle possède un front end web qui permet l'identification du client et affiche la réponse.

Ce front end enverra une requête à trois services de facturation (Back-Ends) en passant par une chaîne de médiation laquelle :

  • 1) Transforme le message dans le but de créer un message composite
  • 2) Découpe la requête et crée des sous messages à destination des back end, puis route les sous message selon le contenu
  • 3) Traduit le contenu de chaque sous message (pour chaque BE)
  • 4) Transforme le contenu de chaque sous message (pour chaque BE)
  • 5) Appelle un service (pour chaque BE)
  • 6) Regroupe les réponses associées à la requête, crée une réponse unique qui contient la consommation pour chaque forfait et le cumul des consommations.


Usecase-split-aggregate.png

Composants issus de la bibliothèque

xmlSplitterWithCorrelation

Translator

xsltTransformer

Le médiateur xsltTransformer transforme un contenu XML en appliquant une feuille de style XSL. Le développeur doit donc créer la feuille de style XSL spécifique à la transformation souhaité.

feuille de style XSL, pour la création d'une requête composite.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	version="1.0">

	<xsl:output indent="yes" method="xml" />

	<xsl:template match="/">
		<requete>
			<xsl:call-template name="output-tokens">
				<xsl:with-param name="list">
					<xsl:value-of select="//suiviconso-requete/produit" />
				</xsl:with-param>
			</xsl:call-template>
		</requete>
	</xsl:template>

	<xsl:template name="output-tokens">

		<xsl:param name="list" />
		<xsl:variable name="first" select="substring-before($list, ',')" />
		<xsl:variable name="remaining" select="substring-after($list, ',')" />

		<xsl:choose>
			<xsl:when test="$remaining">
				<suiviconso-requete produit="{$first}">
					<xsl:element name="idclient">
						<xsl:value-of select="//suiviconso-requete/idclient" />
					</xsl:element>
					<xsl:element name="debut">
						<xsl:value-of select="//suiviconso-requete/debut" />
					</xsl:element>
					<xsl:element name="fin">
						<xsl:value-of select="//suiviconso-requete/fin" />
					</xsl:element>
				</suiviconso-requete>
				<xsl:call-template name="output-tokens">
					<xsl:with-param name="list" select="$remaining" />
				</xsl:call-template>
			</xsl:when>
			<xsl:otherwise>

				<suiviconso-requete produit="{$list}">
					<xsl:element name="idclient">
						<xsl:value-of select="//suiviconso-requete/idclient" />
					</xsl:element>
					<xsl:element name="debut">
						<xsl:value-of select="//suiviconso-requete/debut" />
					</xsl:element>
					<xsl:element name="fin">
						<xsl:value-of select="//suiviconso-requete/fin" />
					</xsl:element>
				</suiviconso-requete>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>

</xsl:stylesheet>

Composants spécifiques au projet

FacturationInternet, FacturationFixe, FacturationMobile

POJO, processor du médiateur FacturationInternet

package fr.liglab.adele.cilia.demo.components;

import fr.liglab.adele.cilia.Data;
import fr.liglab.adele.cilia.demo.application.FacturationInternetService;

public class FacturationInternetProcessor {

	private FacturationInternetService service;

	public Data process(Data data) {
		
	
		String content = (String) data.getContent();
		String responseContent =  service.getConsommation(content);
		data.setContent(responseContent);
		return data;
	}

		
}

Déclaration du type Facturation Internet sous forme de composant iPOJO:

<component name="FacturationInternet"
	classname="fr.liglab.adele.cilia.demo.components.FacturationInternetProcessor">
	<requires field="service" />
	<cilia:immediate-scheduler data.type="fr.liglab.adele.cilia.Data"/>
	<cilia:multicast-dispatcher data.type="fr.liglab.adele.cilia.Data" />
</component>

L'attribut data.type des éléments multicast-dispatcher et immediate-scheduler permet de définir quel type de données seront traitées et renvoyées par le processor, ici Data ( la valeur par défaut est java.util.List ).

UC1Aggregator

POJO, processor du médiateur UC1Aggregator:

package fr.liglab.adele.cilia.demo.components;

import java.util.Collections;
import java.util.List;

import org.w3c.dom.Document;

import fr.liglab.adele.cilia.CiliaException;
import fr.liglab.adele.cilia.Data;
import fr.liglab.adele.cilia.compendium.data.manipulation.XmlTools;
import fr.liglab.adele.cilia.framework.IProcessor;

public class UC1AggregatorProcessor implements IProcessor{

        //...
    
	public List process(List dataSet) {

		String fixe = "0",mobile = "0",internet = "0";
		int total = 0;
		Document document = null;
		/**
		 * Extraction des info des sous messages
		 */
		for(int i=0;i<dataSet.size();i++){
                    document = getDocumentFromData((Data)dataSet.get(i));
                    if (isDocumentFromMobile(document)) {
                        mobile = getConsommation(document);
                    }
                    else if (isDocumentFromInternet(document)) {
                        internet = getConsommation(document);
                    }
                    else if (isDocumentFromFixe(document)) {
                        fixe = getConsommation(document);
                    }
		}
		/**
		 * calcul du total
		 */
		total=Integer.valueOf(mobile)+Integer.valueOf(fixe)+Integer.valueOf(internet);
		/**
		 * composistion de la réponse
		 */
		Data data = (Data) ((Data) dataSet.get(0)).clone();
		data.setContent(buildReponse(fixe, mobile, internet, total));
		List returnList= Collections.singletonList(data);
		return returnList;
	}

        //...
}

Déclaration du type UC1Aggregator sous forme de composant iPOJO:

<component name="UC1Aggregator"
	classname="fr.liglab.adele.cilia.demo.components.UC1AggregatorProcessor"
	immediate="true" architecture="true">
	<cilia:correlation-scheduler/>
	<cilia:multicast-dispatcher/>
</component>

Description de la chaîne de médiation

Contenu du fichier splitagregate.dscilia décrivant les instances de médiateur et les liaison entre eux.

<cilia>
	<chain type="split-aggregate" id="DemoSplitAggregate">
		<mediators>
		
			<mediator-instance type="XsltTransformer" id="xslt-transformer-1" >
				<processor>
					<property name="xslt-file" value="trans.xslt" />
				</processor>
			</mediator-instance>
			
			<mediator-instance type="XmlSplitterWithCorrelation" id="xml-splitter-1">
				<processor>
					<property name="separator" value="//suiviconso-requete" />
				</processor>
				<dispatcher>
				<property name="language" value="xpath" />
				<property name="conditions">
					<item key="//suiviconso-requete[@produit='fixe']"
						value="fixe" />
					<item key="//suiviconso-requete[@produit='mobile']"
						value="mobile" />
					<item key="//suiviconso-requete[@produit='internet']"
						value="internet" />
				</property>
				</dispatcher>
			</mediator-instance>
			
			<mediator-instance type="Translator" id="translator-1" >
				<processor>
					<property name="dictionary">
						<item key="CLIENT-ID" value="CLIENT-IDENT"/>
						<item key="SuiviConso" value="SuiviConsoInternet"/>
					</property>
				</processor>
			</mediator-instance>

			<mediator-instance type="Translator" id="translator-2" >
				<processor>
					<property name="dictionary">
						<item key="SuiviConso" value="SuiviConsoFixe"/>
					</property>
				</processor>
			</mediator-instance>
			<mediator-instance type="Translator" id="translator-3" >
				<processor>
					<property name="dictionary">
						<item key="SuiviConso" value="SuiviConsoMobile"/>
					</property>
				</processor>
			</mediator-instance>
			
			<mediator-instance type="XsltTransformer" id="xslt-transformer-2" >
				<processor>
					<property name="xslt-file" value="delproduitinternet.xslt" />
				</processor>
			</mediator-instance>
			
			<mediator-instance type="XsltTransformer" id="xslt-transformer-3" >
				<processor>
					<property name="xslt-file" value="delproduitfixe.xslt" />
				</processor>
			</mediator-instance>
			
			<mediator-instance type="XsltTransformer" id="xslt-transformer-4" >
				<processor>
					<property name="xslt-file" value="delproduitmobile.xslt" />
				</processor>
			</mediator-instance>
			
			<mediator-instance type="FacturationMobile" id="facturation-mobile-1" />
			<mediator-instance type="FacturationInternet" id="facturation-internet-1" />
			<mediator-instance type="FacturationFixe" id="facturation-fixe-1" />
			
			<mediator-instance type="UC1Aggregator" id="uc1-aggregator-1" />

		
			
		</mediators>
		
		<bindings>
			<binding to="xslt-transformer-1">
				<property name="topic" value="split-aggregate/MySplitAggregate/input" />
			</binding>
			<binding from="xslt-transformer-1:to-splitter" to="xml-splitter-1:from-transformer" />
			
			<binding from="xml-splitter-1:mobile" to="translator-3" />
			<binding from="xml-splitter-1:internet" to="translator-1" />
			<binding from="xml-splitter-1:fixe" to="translator-2" />

			<binding from="translator-1" to="xslt-transformer-2" />
			<binding from="translator-2" to="xslt-transformer-3" />
			<binding from="translator-3" to="xslt-transformer-4" />
			
			
			<binding from="xslt-transformer-2" to="facturation-internet-1" />
			<binding from="xslt-transformer-3" to="facturation-fixe-1" />
			<binding from="xslt-transformer-4" to="facturation-mobile-1" />
			
			
			<binding from="facturation-mobile-1" to="uc1-aggregator-1" />
			<binding from="facturation-internet-1" to="uc1-aggregator-1" />
			<binding from="facturation-fixe-1" to="uc1-aggregator-1" />
			
			<binding from="uc1-aggregator-1" >
				<property name="topic" value="split-aggregate/MySplitAggregate/result" />
			</binding>

		</bindings>

	</chain>
</cilia>

Communications avec l'extérieur

Point d'entrée et de sortie de la chaîne

Appel d'un service exterieur

La chaîne de médiation communique avec des services externes en utilisant des technologies d’importation de services (ROSE, DOSGi-CXF, …)


ExternalServices.png


Cette solution permet d’avoir des médiateurs uniquement dédiés au code métier. ces services assurant toute la partie technique ( création de proxy...).

Récupération et déploiement de l'application

Le projet complet de ce TP (y compris la passerelle) est disponible ici: File:TP5-project.tar.gz

Le répertoire TP5-project il y a 6 projets maven.

  • Le projet demo-components contiens les médiateurs développés pour cette demo.
  • Le projet demo-services-implems contiens l'implémentation des services qui seront exposées comme des Web Services (FacturationInternet, FacturationFixe, FacturationMobile).
  • Le projet demo-services-interfaces contiens les interfaces des services.
  • Le projet demo-servlet contiens le front end sous la forme d'une application Web.
  • Le projet demo-endpoint contiens le proxy de la chaîne de médiation et le ROSE endpoint qui sera exposé sous la forme de Web service pour être utilisé par le Front End.
  • Le projet gateway contiens le gateway felix pour lancer cette demo.


La passerelle avec les bundles de cet TP est disponible ici: File:TP5-gateway.tar.gz

Dans le répertoire demo.gateway-TP5-1.0.0-SNAPSHOT existe un fichier exécutable cilia.sh ou cilia.bat. Ce fichier lance la passerelle et l'application.

Le Front End se trouve à l'adresse http://localhost:8080/suiviConso