ObjectWeb - Wiki - Main - frsujet -1-
Transcription
ObjectWeb - Wiki - Main - frsujet -1-
ObjectWeb - Wiki - Main - frsujet Sujet en francais du projet eCOM Sommaire • Les EJB • Variantes • Les clients lourd eCOM ° Commandes ° Exemple de sortie XML • Les clients Web (Servlets et JSPs) • Gestion des exceptions • Transactions • Performances Objectifs pédagogiques du projet Le projet eCOM consiste à concevoir et développer une application de commerce électronique. Une motivation principale du projet eCOM est qu'il intègre dans sa mise en œuvre différentes thématiques étudiées dans les formations en informatique : en particulier, interfaces homme-machine, applications et architectures réparties, base de données. Les aspects relatifs au génie logiciel sont également présents puisque le projet eCOM comprend la conception et la réalisation d'un produit logiciel qui satisfait certains critères de qualité (documentation, respect des normes, etc). L'intégration de différentes thématiques présente les atouts suivants : • Valorisation des enseignements acquis dans les différentes thématiques au profit d'un projet important et réaliste. • Appréhension des (inter)dépendances entre les thématiques. • Communications entre les différents réalisateurs du projet. En outre, une deuxième motivation forte du projet eCOM est qu'il intègre des technologies et des standards récents et largement utilisés dans le domaine des applications Internet. Ce projet permet plus précisément de se placer en tant qu'utilisateurs de la technologie JavaEE (Java 2 Enterprise Edition) destinée à la réalisation de serveurs d'information ou de serveurs de commerce électronique à base de composants distribués, transactionnels et persistants. Les réalisateurs sont confrontés par ce biais à la manipulation de mécanismes et de fonctions générales d'un système distribués : gestion de la désignation de composants distribués, configuration d'une application distribuée, association de propriétés non fonctionnelles aux composants (persistance, transactions), gestion des images persistantes des composants (liaisons avec une base de données). Le projet se décompose en différentes parties intervenant dans la programmation et dans le déploiement d'une application JavaEE, classiquement qualifiée de n-tiers : • Une partie navigateur (chez le client) • Une partie serveur Web avec la programmation et le déploiement de servlets, • Une partie logique applicative avec la programmation et le déploiement des EJB ("cœur du serveur JavaEE") • Une partie Base de données. Principes d'architecture d'une application JavaEE L'application de commerce électronique est construite au moyen de servlets et de composants répartis appelés EJB (Enterprise Java Beans). Les spécifications JavaEE de SUN définissent le modèle de programmation des servlets et des EJB ainsi que leurs processus de déploiements. JavaEE (Java 2 Enterprise Edition) est un framework orienté vers le developpement d'applications d'entreprise avec le langage de programmation Java. Ce framework rassemble un certain nombre de spécifications d'API afin de faciliter la création d'applications réparties et fiable. Voici une liste (très partielle) des API inclues dans JavaEE : • EJB : API de manipulation des composants réalisant la logique applicative de l'application • Servlets : « composants » réalisant la partie présentation de l'application -1- ObjectWeb - Wiki - Main - frsujet • JSP : similaire aux ASP et aux PHP, elles permettent l'inclusion de scripts Java dans les pages générés dynamiquement. Celles ci sont en réalité compilées en objets Java lors de la première requête et exécutées par une JspServlet. • JNDI : API de connexion à des annuaires, notamment des annuaires LDAP. Elle est utilisée pour désigner les ressources et les composants dans la plateforme. • JDBC : API de connexion à des bases de données relationnelles. • JTA : API de gestion des transactions • JCA (Java Connector Architecture): API de connexion à des sources de données non relationnelles (patrimoniales, propriétaires (ERP), …). • JDO : API de persistance transparente à des sources de données relationnelles ou non (bases de données objets, …). • JMS : API de communication asynchrone au travers de MOM (Message Oriented Middleware) • JavaMail : API de connexion à des serveurs de mails (SMTP, POP3, IMAP4) • JMX : API pour l'administration des applications • JAAS (Java Authentication and Authorization Service) API d'authentification des exécutants de code Java dans la plateforme. JAAS étends ainsi le systèmes de permissions de Java Plusieurs API gravitant autour d'XML y ont été ajoutées : • JAXP (Java API for XML Parsing) : API d'unification des différents parseurs XML (parsers SAX, DOM et processeurs XSLT). • JAXB : API de sérialisation/déserialisation d'objets Java vers/depuis XML • JAX-RPC : API d'invocation synchrone de services par XML (SOAP) • JAXM : API de communication asynchrone par XML • JAXR : API d'enregistrement et de recherche de Web Services. Le projet eCOM porte sur l'utilisation des Servlets/JSP et des EJB (via le container EasyBeans qui implante la spécification EJB3.0), dont la persistence est mise en œuvre via une base relationnelle. Les clients sont deux types : application Java standalone accédant aux beans directement par RMI, et navigateur Web affichant la présentation HTML calculée par l'intermédiaire de Servlets. Concernant la couche présentation, il est demandé aux étudiants d'utiliser la technologie Ajax, qui permet d'optimiser la gestion des pages HTML, et de suivre le modèle de conception MVC. La plate-forme d'exécution JavaEE qui est utilisée dans ce projet est la plate-forme JOnAS, qui est disponible en logiciel libre au travers du consortium ObjectWeb. JOnAS intègre un container de servlet qui peut être Jakarta Tomcat ou Jetty. -2- ObjectWeb - Wiki - Main - frsujet Figure 1 : Architecture JavaEE et portée du projet eCOM L'application eCOM - Version 1 Vous aurez dans un premier temps à programmer une mini application de commerce électronique pour valider votre savoir-faire concernant le tiers EJB. Dans un deuxième temps, vous ferez complèterez cette application, après avoir finalisé votre cahier des charges et adopté un modèle de conception permettant de mettre en oeuvre un site de commerce électronique élaboré, offrant de multiples fonctions. La suite de cette section décrit l'application que vous devez produire dans un premier temps (appelée eCOM-VERSION 1). Les EJB L'application considérée utilise au minimum cinq types de beans purement applicatifs, gérant respectivement des comptes utilisateurs (type Account), des produits (type Product), des magasins (type ProductStore), des caddies virtuels (type Cart) et des couvertisseurs de devise (type EuroConvertor). Les beans de type Cart et EuroConvertor ne sont a priori pas persistants, contrairement aux autres. D'autre types de beans peuvent être ajoutés (par exemple, pour gérer un suivi des commandes). Ces beans n'interagissent pas directement avec les clients ou les administrateurs de l'application de commerce électronique. Pour des raisons d'efficacité, ils ne fournissent que des interfaces locales. La manipulation de ces beans depuis un client ou un administrateur distant est réalisée au travers de deux beans session fournissant des interfaces distribuées, appelés EcomAdmin et EcomCustomer. Le bean EcomAdmin fournit une interface d'administration de l'application (création ou destruction de comptes, de magasins, de produits, etc). Le bean EcomCustomer fournit une interface à un client désireux de connaître les magasins et les produits, et souhaitant éventuellement acheter des produits. Les beans EcomAdmin et EcomCustomer ne sont utilisables qu'au travers d'un programme externe qui communique avec eux. Ce programme peut être mis en œuvre sous la forme d'un programme Java standard, ou bien de servlets. Il est demandé de fournir les deux types de programmes dans eCOM-VERSION1. A titre indicatif, les interfaces de beans que l'on demande de programmer sont les suivantes. Ces interfaces peuvent tout à fait être modifiées. Account Un bean de type Account représente et gère le compte d'un acheteur ou celui d'un magasin. Les identifiants devront être des numéros au format IBAN. Les méthodes métier qu'il fournit sont principalement les suivantes. interface Account { void deposit(double amount); // dépose une somme d'argent sur le compte. double withdraw(double amount); // retire une somme d'argent du compte. double getBalance(); // retourne le solde disponible sur le compte. … } Product Un bean de type Product gère un produit d'un magasin. Les méthodes métier qu'il fournit sont principalement les suivantes. { interface Product { ProductPK getReference(); //retourne la référence (identificateur unique) du produit String getName(): retourne le nom du produit double getPrice(); //retourne le prix du produit int getProductStore(); //retourne la référence du magasin qui vend ce produit … } ProductStore Un bean de type ProductStore gère un magasin. Les méthodes métier qu'il fournit sont principalement les suivantes. interface ProductStore { Vector getProducts(); //retourne la liste des produits vendus par le magasin String getName(); //retourne le nom du magasin. int getReference(); //retourne la référence (identificateur unique) du magasin String getAccountId(); //retourne le numero IBAN du compte du magasin … } Cart Un bean de type Cart gère un caddie d'un client connecté à l'application. Les méthodes métier qu'il fournit sont principalement les suivantes. -3- ObjectWeb - Wiki - Main - frsujet interface Cart { void addProduct(ProductPK productPK); //ajoute un produit dans le caddie. Vector getProducts(); //retourne la liste des produits contenus dans le caddie. double getTotalPrice(); //retourne le prix total des produits contenus dans le caddie. void buy(String accountId); //achète les produits contenus dans le caddie avec un numéro de compte client. … } Les règles de gestion du caddie interdisent les cas suivants (dans lesquels l'exception CartException est levée) : • • • • l'ajout d'un produit après l'achat du contenu du caddie, l'achat d'un caddie vide, la suppression d'un produit non présent dans le caddie, le paiement du total du caddie avec un compte dont le solde n'est pas suffisant. Le caddie possède un état interne (EMPTY|FILLING|BOUGHT) permettant de vérifier ces règles. EuroConverter On fait l'hypothèse que les prix dans la base sont en Euro (EUR). Pour permettre un affichage des prix dans l'unité monétaire de l'usager de eCOM, on utilisera un bean opérant les conversions de devise. Un bean de type EuroConverter gère les conversions monétaires de plusieurs devises de la zone Euro depuis/vers l'EURO interface EuroConvertor { double convertToEuro(double amount, String currencySymbol); // conversion d'un montant dans une monnaie vers l'Euro double convertFronEuro(double amount, String currencySymbol); // conversion d'un montant depuis l'Euro vers une monnaie Vector getCurrencySymbols(); // donne la liste des symboles des monnaies disponibles String getCurrencyRealName(String currencySymbol); // donne le nom réel d'une monnaie à partir de son symbole … } Dans un premier temps, vous ne considérerez que des conversions à parité fixe entre l'Euro et les anciennes monnaies de l'Euroland. Le convertisseur de devises prend en compte les taux de conversion définitifs de l'euro fixés le 31 décembre 1998 avec 6 chiffres significatifs (pour plus d'info sur les conversions : http://fxtop.com/fr/adv.htm). Les taux de l'euro contre les devises out sont rafraîchis quotidiennement, ce sont les taux officiels diffusés par la Banque Centrale Européenne au 21 novembre 2001. Quelques constantes : 1 EUR = 1.95583 DEM = 1 BEF = 6.55957 FRF = 1936.27 ITL Les montants en euro sont arrondis avec 2 décimales (22.224 => 22.22, 22.226 => 22.23, 22.225 => 22.23). Pour convertir un montant d'une dénomination nationale de l'euro à une autre (par exemple du mark allemand au franc français), le montant intermédiaire en euro est calculé en interne avec une précision de 3 décimales. Les montants en devises sont exprimés avec la bonne précision (0 ou 2 décimales suivant le pays). Les conversions d'une devise "out" à une devise "in" se font par l'intermédiaire du montant en euro avec 2 décimales. Les conversions d'une devise "out" à une autre devise "out" se font par l'intermédiaire du montant en euro avec une précision maximale. Les montants peuvent être rentrés avec le point ou la virgule comme séparateur décimal. Remarque : la conversion pourrait se faire avec des devises dont la parité est fluctuante par rapport à l'Euro : USD, GBP, JPY, … Variantes Si vous ne disposez que de peu de temps pour faire ce projet, vous pouvez n'implanter que les beans Account, Product et Cart en supprimant ProductStore et EuroConvertor. Si vous disposez de plus de temps, vous pouvez ajouter des beans tels qu'Order, Customer, ShipmentCalculator, … Les clients lourd eCOM -4- ObjectWeb - Wiki - Main - frsujet Il y a deux principaux types de clients lourds : • celui de l'acheteur (ecom.client.ExternCustomer) • et celui de l'administrateur de l'application Ecom (ecom.client.ExternAdmin). Chaque client lourd est un programme Java qui gère la communication avec un bean dit facade (ecom.beans.CustomerBean et ecom.beans.AdminBean). L'interface utilise des lignes de commande à la manière d'un shell. Le bean ecom.beans.CustomerBean permet à un client de remplir un caddie et de l'acheter avec un compte en utilisant les commandes suivantes passées à un petit interpréteur de commandes. Le client ecom.client.ExternAdmin vous permettra également initialiser et de modifier la base de données eCOM via les beans persistents (de type Entity) représentant les comptes, les magasins et les produits. Le squelette de l'interpréteur shell vous est fourni. Commandes Les commandes des 2 clients sont les suivantes : • help|? liste une aide • output HTML|WML|XML|TEXT|JSON positionne le format de sortie (utilisable à tout moment). Par défaut : TEXT. Vous n'implémenterez que les sorties TEXT, XML et bien sur HTML et JSON ! • pause attend un CR pour continuer (utile pour tester les blocages liés aux transactions) • batch -stopOnError cmds.txt exécute la série de lignes de commande présentes dans le fichier cmds.txt (utile pour initialiser les beans, pour écourter les démonstrations, ...). L'option -stopOnError arrête l'exécution des commandes si une exception est levée. • currency EUR|FRF|DEM|BEF positionne la devise utilisée pour les sorties (utilisable à tout moment). Par défaut : EUR • language en|fr|es|it,… positionne la langue utilisée pour les sorties (utilisable à tout moment). Par défaut : en • begin démarre une transaction • commit valide la transaction courante • rollback|abort abandonne la transaction courante • account liste tous les comptes • store liste tous les magasins • product liste tous les produits • product -store 1001 liste les produits du magasin 1001 • product -name "Machine à laver" liste les produits dont le nom est celui passé en paramêtre • product -like Machin% liste les produits dont le nom est semblable • product -price 1000.00 liste les produits de prix inférieur • product -price 100.00 1000.00 liste les produits dans un intervalle de prix • cart affiche le contenu du caddie (et le prix total) • cart -add 101 ajoute le produit 101 dans le caddie • cart -add 102 ajoute le produit 102 dans le caddie • cart -add 103 ajoute le produit 103 dans le caddie • cart -remove 102 ajoute le produit 102 dans le caddie • cart -buy FR7630003003930003728602468 achète le contenu du caddie avec le compte FR7630003003930003728602468 • exit|quit quitte le client ecom (et abandonne le ou les transactions non validées) Exemple de sortie XML La sortie XML peut être générée après construction d'un objet org.w3c.dom.Document <?xml version="1.0" standalone="yes"?> <?xml-stylesheet type="text/xsl" href="cart2html.xsl" ?><cart> <state>FILLING</state> <product> <productStoreId>1001</productStoreId> <reference>101</reference> <name>Machine à laver</name> <price currency="FRF">2000.00</price> </product> <product> <productStoreId>1002</productStoreId> <reference>103</reference> <name>Machine à coudre</name> <price currency="FRF">3000.00</price> </product> <total currency="FRF">5000.00</total></cart> Les clients Web (Servlets et JSPs) Les servlets ecom.servlets.CustomerServlet et ecom.servlets.AdminServlet reprennent essentiellement les commandes des clients lourds. -5- ObjectWeb - Wiki - Main - frsujet On vous demande de programmer ces servlets ainsi que des pages HTML associées register.htm, login.htm, ...) qui utilisent respectivement les beans EcomCustomer et EcomAdmin. Dans un premier temps, ces servlets ne retournent des documents au format text/html La servlet ecom.servlets.CustomerServlet sert les opérations dont les URI sont /store, /product, /card, /add, /checkout, /orders, ... La servlet ecom.servlets.AdminServlet sert les opérations d'ajout, de suppression et de consultation des diffèrents Entity Beans. Les URI doivent avoir le format /secured/ car ces opérations ne sont autorisées qu'à l'administrateur authentifié (username : tomcat, password : tomcat). L'utilisation du patron de conception Modèle-Vue-Contrôleur (MVC) est recommandée pour la réalisation des 2 clients légers. La servlet réalise le contrôle tandis que des JSPs réalisent l'affichage des vues. Un exemple de MVC à base de servlets/JSP est fourni ici, à titre pédagogique : fichier .war déployable dans un serveur d'applications ( {attach:} model2.war ) ou arborescence complète en format tar/gzip ( model2.tar.gz ). Chaque client Web est conditionné et déployée sous la forme d'un WAR distinct : ecomcustomer.war et ecomadmin.war. Remarque: une partie du code peut être factorisé intelligemment entre les clients lourds et les clients Web. L'application eCOM - Version 2 Vous pouvez cette fois donner libre cours à votre imagination pour produire un site de commerce électronique intégrant des fonctions d'achat, de suivi de commandes, etc coté client, ainsi que des fonctions de mises à jour, de consultation de stocks, etc coté administrateur. Ce site pourra faire appel à des technologies complémentaires tels que AJAX, Struts, JSF, TagLibs personnalisés, ... Vous penserez cependant à respecter les consignes indiquées par les enseignants aussi bien du point de vue ergonomie que système. Quelques critères de qualité de l'application eCOM Gestion des exceptions En cas de levée d'exception, un client doit repartir dans un état cohérent mais en essayant de ne lui faire perdre le contenu de son caddie ! Transactions Vous testerez et validerez le bon fonctionnement des transactions, par exemple en lançant un achat et en arrêtant brutalement le serveur. Pour cela, il faudra introduire des temporisations paramétrables pour avoir le temps de provoquer des pannes en cours de transaction. N'hésitez pas à démarrer plusieurs clients en parallèle pour faire des tests de concurrence entre les transactions. Performances On s'intéresse à mesurer les performances de l'application eCOM (Servlets+EJB). Pour cela, vous mesurerez les performances de votre site au moyen d'outils comme Apache JMeter ou CLIF et vous joindrez les mesures effectuées à votre rapport final. Sujet en francais du projet eCOM (fr) Creator: xwiki:XWiki.donsez Date: 2007/08/23 07:14 Last Author: xwiki:XWiki.donsez Date: 2010/09/17 16:01 Copyright (c) 2005-2006, ObjectWeb Consortium -6- ObjectWeb - Wiki - Main - frsujet -7-