Vous venez de tlcharger le code qui accompagne "Les Cahiers du Programmeur : Java EE 5 (3e dition)".

Vous trouverez de l'aide supplmentaire sur l'application et son dploiement  l'adresse http://www.antoniogoncalves.org

!!! ATTENTION : cette application fonctionne avec le JDK 1.6.

Aprs avoir dcompress ce fichier, vous obtenez les rpertoires suivants :

===============
= Repertoires =
===============
   +
   +-readme.txt                 : le fichier que vous tes en train de lire
   |
   +-BarkBank
   |    +-src                	: code source de l'application barkbank
   |    |  +-webapp          	: fichiers constituant l'application web (html, gif...)
   |    |     +-WEB-INF         : configuration de l'application barkbank
   |    +-target
   |       +-generated-sources 	: fichiers gnrs pour les services web
   +-PetEx
   |    +-src                	: code source de l'application petex
   |    |  +-resources         	: fichiers constituant l'application web (html, gif...)
   |    |     +-WEB-INF         : configuration de l'application petex
   |    +-target
   |       +-generated-sources	: fichiers gnrs pour les services web
   +-Yaps
   |    +-Business            	: code mtier de l'application yaps (stateless, stateful, entity, MDB...)
   |    +-ear                 	: module Maven pour packager un ear
   |    +-Swing                 : code client de l'application yaps (Swing)
   |    |  +-lib              	: librairies externes permettant la compilation du projet
   |    +-Web                   : code de l'application web

Dans ce document, la variable PETSTORE_HOME fait rfrence  la racine de cette arboresence.


================
= Installation =
================
Avant de d'excuter l'application, assurez vous que vous avez les outils ncessaire installs:

-- JDK
   * Installez une version du JDK gale ou suprieure  1.6_23  partir de http://java.sun.com/javase/downloads
   * Positionnez la variable JAVA_HOME

-- Maven
   * Installez une version de Maven gale ou suprieure  3.0.1  partir de http://maven.apache.org/download.html
   * Positionnez la variable MAVEN_HOME
   * Rajoutez le rpertoire %MAVEN_HOME%\bin dans votre PATH

-- GlassFish
   * Installez une version du serveur Glassfish gale ou suprieure  v3.0.1-b22 https://glassfish.dev.java.net/public/downloadsindex.html
   * Positionnez la variable GLASSFISH_HOME
   * Rajoutez le rpertoire %GLASSFISH_HOME%\bin dans votre PATH


================
=  Configurer  =
================
!!! Si vous voulez utilisez la base de donnes MySQL au lieu de Derby, reportez-vous  la section ci-dessous (Autres bases de donnes) !!!

Il faut maintenant configurer GlassFish et la base de donnes :

    * Crez le domaine petstore dans GlassFish en tenant compte des mots de passe ci-dessous (le port d'admin est 8282)
    asadmin create-domain --adminport 8282 --instanceport 8080 --nopassword=true petstore

	Using port 8282 for Admin.
    Using port 8080 for HTTP Instance.
    Using default port 7676 for JMS.
    Using default port 3700 for IIOP.
    Using default port 8181 for HTTP_SSL.
    Using default port 3820 for IIOP_SSL.
    Using default port 3920 for IIOP_MUTUALAUTH.
    Using default port 8686 for JMX_ADMIN.
    Using default port 6666 for OSGI_SHELL.

    Vous devez alors voir apparaitre le rpertoire %GLASSFISH_HOME%\glassfish\domains\petstore

    * (Si par la suite vous voulez supprimer ce domaine, tapez la commande asadmin delete-domain petstore)

    * Dmarrez le serveur Glassfish :
      asadmin start-domain --verbose petstore

    * Vrifier que le serveur fonctionne en allant sur :
      http://localhost:8080/
      http://localhost:8282/ (pour la console d'administration)

      Si votre serveur de dmarre pas, consulter le fichier %GLASSFISH_HOME%\glassfish\domains\petstore\logs\server.log

    * Dmarrez la base de donnes
      asadmin start-database --dbhost=localhost --dbport=1527 --dbhome=%GLASSFISH_HOME%/javadb

      [exec] Database started in Network Server mode on host localhost and port 1527.
      ...
      [exec] Command start-database executed successfully.

    * Crer un pool de connection  la base de donnes :
      asadmin --port 8282 create-jdbc-connection-pool --datasourceclassname org.apache.derby.jdbc.ClientDataSource  --restype javax.sql.XADataSource  --property portNumber=1527:serverName=localhost:User=app:Password=app:databaseName=petstoreDB:connectionAttributes=\;create\=true petstorePool

    * Crer la base de donnes (en pingant la datasource)
      asadmin --port 8282 ping-connection-pool petstorePool

      nb: Vous devez voir alors apparaitre le rpertoire %GLASSFISH_HOME%\javadb\petstoreDB

    * Crer une source de donnes
      asadmin --port 8282 create-jdbc-resource --connectionpoolid petstorePool jdbc/petstoreDS

     * Crez les ressources JMS ncessaires:
       . une ConnectionFactory :
         asadmin --port 8282 create-jms-resource --restype javax.jms.ConnectionFactory jms/petstoreConnectionFactory

       . un Topic JMS :
         asadmin --port 8282 create-jms-resource --restype javax.jms.Topic --property Name=OrderTopic jms/topic/order

       . une Queue JMS :
         asadmin --port 8282 create-jms-resource --restype javax.jms.Queue --property Name=ClientQueueTopic jms/queue/client

     * Crer le logger de l'application Petstore qui utilise java.util.logging
       asadmin --port 8282 set-log-level com\.yaps\.petstore=FINEST
       asadmin --port 8282 set-log-level com\.barkbank=FINEST
       asadmin --port 8282 set-log-level com\.petex=FINEST


 ================
 = Vrification =
 ================
    * Vrifier que le pool de connection "petstorePool" a t cr soit :
        asadmin --port 8282 list-jdbc-connection-pools

         __TimerPool
         DerbyPool
         petstorePool
        . ou par la console d'admin http://localhost:8282/ (dans l'arbre, dployez le noeud Resources>JDBC>Connection Pools)
          nb: il est peut-tre ncessaire de rafrachir la page

    * Vrifier que la source de donnes "petstoreDS" a t cr :
        asadmin --port 8282 list-jdbc-resources
         jdbc/__TimerPool
         jdbc/__default
         jdbc/petstoreDS
        . ou par la console d'admin (dans l'arbre, dployez le noeud Resources>JDBC>JDBC Resources)
         nb: il est peut-tre ncessaire de rafrachir la page

    * Vrifier que les ressources JMS ont t crs :
        asadmin --port 8282 list-jms-resources
         jms/topic/order
         jms/queue/client
         jms/petstoreConnectionFactory

        . ou par la console d'admin (dans l'arbre, dployez les noeuds Resources>JMS Resources>Connection Factories et Destination Resources)

    * Pour vrifier que le logger a bien t configur
        asadmin --port 8282 list-logger-levels
        . ou par la console d'admin (dans l'arbre, dployez les noeuds Configuration>Logger Settings>Log Levels)
        . Vous devez voir aparaitre le logger com.yaps.petstore, com.barkbank et com.petex


============================
=  Deployez l'application  =
============================
Maintenant que tout est configur, il faut dployer les applications sur le serveur. Assurez-vous bien que GlassFish et Derby sont dmarrs et configurs (section prcdente)

	* Dployez l'application BarkBank

	  * Construisez l'application en tapant %PETSTORE_HOME%\Barbank> mvn clean package
	    Ceci a pour effet de compiler l'application, de gnrer les artefacts pour les services web et de la packager dans le fichier %PETSTORE_HOME%\BarkBank\target\barkbank-3.0.war

	  * Dployez l'application sur le serveur en tapant %PETSTORE_HOME%\Barbank> asadmin --port 8282 deploy --force target\barkbank-3.0.war
	    Pour vrifier que le dploiement a bien t effectu, rendez-vous  l'adresse http://localhost:8080/barkbank/

	* Dployez l'application PetEx

	  * Construisez l'application en tapant %PETSTORE_HOME%\Petex> mvn clean package
	    Ceci a pour effet de compiler l'application, de gnrer les artefacts pour les services web et de la packager dans le fichier %PETSTORE_HOME%\PexEx\target\petex-3.0.war

	  * Dployez l'application sur le serveur en tapant %PETSTORE_HOME%\Petex> asadmin --port 8282 deploy --force target\petex-3.0.war
	    Pour vrifier que le dploiement a bien t effectu, rendez-vous  l'adresse http://localhost:8080/petex/

	* Dployez l'application Yaps

	  * Installez le jar VSTM pour l'application Swing
	    %PETSTORE_HOME%\Yaps\Swing> mvn install:install-file -Dfile=lib\vstm-xscore-0.5.0.jar -DgroupId=org.vstm -DartifactId=vstm-xscore -Dversion=0.5.0 -Dpackaging=jar -DgeneratePom=true

	  * Construisez l'application en tapant %PETSTORE_HOME%\Yaps> mvn clean package
	    Ceci a pour effet de compiler l'application, de gnrer les artefacts pour les services web et de la packager dans les fichiers %PETSTORE_HOME%\Yaps\ear\target\ear-3.0.ear

	  * Dployez l'application sur le serveur en tapant %PETSTORE_HOME%\Yaps> asadmin --port 8282 deploy --force ear\target\ear-3.0.ear
	    Cette tache dploie l'application et insre des donnes en base
	    Pour vrifier que le dploiement a bien t effectu, rendez-vous  l'adresse http://localhost:8080/petstore/


============================
=  Utilisez l'application  =
============================
Une fois les trois applications dployes, vous pouvez les utiliser  l'adresse http://localhost:8080/petstore/
Consulter le catalogue, crez vous un compte ou logger vous job/job. Achetez des animaux domestiques, passez commande et vous utiliserez alors les services web des application BarkBank (pour la vrification des cartes bancaires) et PetEx (avertit le transporteur).

Pour executer l'application Swing tapez %PETSTORE_HOME%\Yaps\Swing> mvn exec:java -Dexec.mainClass="com.yaps.petstore.client.ui.PetstoreFrame"


=================================
= Demarrer/Arreter les serveurs =
=================================
-- Derby
     asadmin start-database --dbhost=localhost --dbport=1527 --dbhome=%GLASSFISH_HOME%/javadb
     asadmin stop-database --dbhost=localhost --dbport=1527
-- GlassFish
     asadmin start-domain --verbose petstore
     asadmin stop-domain petstore


=======================================
= Consulter la bases de donnes Derby =
=======================================
Une fois la base de donnes Derby dmarrs et l'application dploye, vous pouvez utiliser des commandes Derby pour consulter la structure des tables ainsi que leur contenu:
	* Ajoutez le rpertoire %GLASSFISH_HOME%\javadb\bin dans le PATH
	* Tapez la commande ij pour utiliser les lignes de commandes
	* Connectez vous  la base, consulter les tables et leurs donnes :

      ij> connect 'jdbc:derby://localhost:1527/petstoreDB';
      ij> show tables;
      ij> describe DBUSER.T_ADDRESS;
      ij> select * from DBUSER.T_CATEGORY;
      ij> disconnect;
      ij> exit;

http://db.apache.org/derby/docs/10.3/tools/
http://db.apache.org/derby/docs/dev/getstart/

Si vous utilisez un IDE pour vous connectez  la base de donnes petstoreDB, voici la configuration necessaire :

* Driver class : org.apache.derby.jdbc.ClientDriver (dans le fichier %MAVEN_REPO%\org\apache\derby\derbyclient\10.6.1.0\derbyclient-10.6.1.0.jar)
* URL de connexion : jdbc:derby://localhost:1527/petstoreDB
* User / Pwd : app / app

=================================
= Autres bases de donnes       =
=================================
Si vous voulez utiliser une autre base de donnes que Derby, voici ce qu'il faut faire.

--- MySQL ---
Avant d'excuter les scripts pour configurer les serveurs, il faut modifier certaines variables des fichiers ant (admin.xml et build.xml). Les fichiers contiennent dj ces diffrentes valeurs, il suffit donc de mettre en commentaires certaines variables et en dcommenter d'autres.

. dans admin.xml

<!--Pour Derby-->
<!--<property name="db.port" value="1527"/>-->
<!--<property name="db.datasource" value="org.apache.derby.jdbc.ClientDataSource"/>-->
<!--<property name="db.url" value="jdbc:derby://${db.host}:${db.port}/${db.sid}"/>-->

<!--Pour MySQL-->
<property name="db.port" value="3306"/>
<property name="db.datasource" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/>
<property name="db.url" value="jdbc:mysql://${db.host}:${db.port}/${db.sid}"/>

(...)
<path id="classpath">
  <!--Pour Derby-->
  <!--<pathelement location="${derby.lib}/derbytools.jar"/>-->
  <!--<pathelement location="${derby.lib}/derbyclient.jar"/>-->
  <!--<pathelement location="${derby.lib}/derby.jar"/>-->

  <!--Pour MySQL-->
  <pathelement location="${glassfish.lib}/mysql-connector-java-5.0.7-bin.jar"/>
</path>


. dans build.xml

<!--Derby-->
<!--<property name="db.port" value="1527"/>-->
<!--<property name="db.driver" value="org.apache.derby.jdbc.ClientDriver"/>-->
<!--<property name="db.url" value="jdbc:derby://${db.host}:${db.port}/${db.sid}"/>-->

<!--MySQL-->
<property name="db.port" value="3306"/>
<property name="db.driver" value="com.mysql.jdbc.Driver"/>
<property name="db.url" value="jdbc:mysql://${db.host}:${db.port}/${db.sid}"/>

(...)
<path id="classpath">
  <pathelement location="${glassfish.lib}/appserv-deployment-client.jar"/>
  <pathelement location="${glassfish.lib}/appserv-rt.jar"/>
  <pathelement location="${glassfish.lib}/webservices-rt.jar"/>
  <pathelement location="${glassfish.lib}/appserv-admin.jar"/>
  <pathelement location="${glassfish.lib}/javaee.jar"/>
  <pathelement location="${glassfish.lib}/toplink-essentials-agent.jar"/>
  <pathelement location="${glassfish.lib}/toplink-essentials.jar"/>
  <pathelement location="${glassfish.lib}/install/applications/jmsra/imqjmsra.jar"/>

  <!--Derby-->
  <!--<pathelement location="${derby.lib}/derbyclient.jar"/>-->

  <!--MySQL-->
  <pathelement location="${glassfish.lib}/mysql-connector-java-5.0.7-bin.jar"/>
</path>


============================
=  Debogger l'application  =
============================
* Pour debogger l'application avec un IDE il faut tout d'abord configurer votre IDE avec les paramtres suivants
  -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9009
* Lancer le serveur en mode debug
  %PETSTORE_HOME%\ant -f admin.xml start-domain-debug
* Certains IDE doivent compiler eux mme les sources pour que le debug fonctionne. Si tel est le cas,
  compiler les source avec votre IDE et construisez l'application avec la tache
  %PETSTORE_HOME%\ant build-debug
* Deployez comme d'habitude avec
  %PETSTORE_HOME%\ant deploy

(ref : http://java.sun.com/products/jpda/doc/conninv.html#Invocation)


============================
=  Rsourdre les problmes =
============================
- Si le serveur ne dmarre pas car un port d'coute est utilis :
  . Vrifiez que le port est utilis  l'aide de la commande > telnet localhost 3306 (3306 est le port  tester)
  . changez le numro de port lors de la cration du domaine en rajoutant la proprit --domainproperties (ex --domainproperties domain.jmxPort=8989)

-- Vrifiez votre firewall ou antivirus, il se peut qu'ils bloquent un port d'coute
com.sun.appserv.server.ServerLifecycleException: Cannot bind to URL [rmi://test:7979/management/rmi-jmx-connector]: javax.naming.CommunicationException [Root exception is java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is:
	java.net.SocketTimeoutException: Read timed out]
	at com.sun.enterprise.admin.server.core.JmxConnectorLifecycle.onStartup(JmxConnectorLifecycle.java:127)
	at com.sun.enterprise.server.ApplicationServer.onStartup(ApplicationServer.java:326)
	at com.sun.enterprise.server.ondemand.OnDemandServer.onStartup(OnDemandServer.java:112)
	at com.sun.enterprise.server.PEMain.run(PEMain.java:326)
	at com.sun.enterprise.server.PEMain.main(PEMain.java:260)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at com.sun.enterprise.server.PELaunch.main(PELaunch.java:272)
Caused by: java.io.IOException: Cannot bind to URL [rmi://test:7979/management/rmi-jmx-connector]: javax.naming.CommunicationException [Root exception is java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is:
	java.net.SocketTimeoutException: Read timed out]

-- CLI171 Command deploy failed : Deploying application in domain failed; javax.naming.NameNotFoundException
   Vrifiez que vous avez dploy votre pool de connexion et votre datasource

-- Operation 'pingConnectionPool' failed in 'resources' Config Mbean. Target exception message: This pool is not registered with the runtime environment
   Vrifiez que la base de donne fonctionne. Si oui, arretez-la et redmarrez-la.

-- org.apache.derby.client.am.DisconnectException: java.security.PrivilegedActionException : Error opening socket to server localhost on port 1527 with message : null
   Vous essayez de dployer l'application alors que la base de donnes ne tourne pas (utilisez la tache start-db)


-- Si vous obtenez une exception similaire  celle-ci:
 Caused by: javax.servlet.ServletException : java.lang.OutOfMemoryError: PermGen space
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.apache.catalina.core.ApplicationFilterChain.servletService (ApplicationFilterChain.java:397)
    at org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:849)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java :697)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:532)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:465)
    at org.apache.catalina.core.ApplicationDispatcher.forward (ApplicationDispatcher.java:353)
    at com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:413)
    ... 31 more
 Caused by: java.lang.OutOfMemoryError: PermGen space

  vous pouvez augmenter la zone mmoire PermGen de la jvm de la manire suivante :
    - diter le fichier %domain_home%/config/domain.xml
    - dans le tag <java-config>, rajouter <jvm-options>-XX:MaxPermSize=128m</jvm-options>