<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blog.e-michel.com/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Blog d'Eric MICHEL</title>
  <link>http://blog.e-michel.com/</link>
  <atom:link href="http://blog.e-michel.com:82/feed/rss2" rel="self" type="application/rss+xml"/>
  <description></description>
  <language>fr</language>
  <pubDate>Fri, 09 Mar 2012 08:35:08 +0100</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Installation JMX VISUALVM JSTATD et VISUALGC pour un tomcat (environnement protégé par firewall)</title>
    <link>http://blog.e-michel.com/post/2012/02/14/Installation-JMX-VISUALVM-et-VISUALGC-%28environnement-prot%C3%A9g%C3%A9-par-firewall%29</link>
    <guid isPermaLink="false">urn:md5:28537fa37d84a31ba4605f6578b70e47</guid>
    <pubDate>Tue, 14 Feb 2012 17:37:00 +0100</pubDate>
    <dc:creator>Eric</dc:creator>
        <category>JAVA</category>
        <category>java</category><category>jmx</category><category>monitoring</category><category>tomcat</category>    
    <description>    &lt;p&gt;Il est assez aisé de configurer les applications pour accéder aux données
JMX avec des outils comme JCONSOLE ou JVISUALVM ou tout autre outil de
monitoring applicatif. En revanche, lorsque des firewall sont en place, la
configuration JMX est un peu plus complexe à réaliser. Ce billet traite de la
manière dont on peut configurrer tomcat pour faire passer les requêtes JMX à
travers un firewall.&lt;/p&gt;
&lt;h2&gt;JMX POUR PASSER LES FIREWALLS&lt;/h2&gt;
&lt;h3&gt;OPTIONS JVM&lt;/h3&gt;
&lt;p&gt;OPTIONS JVM =&amp;quot; -Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=${PORT1}
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=${SERVER_NAME}
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.password.file=${JMX_CONF}/jmx.password
-Dcom.sun.management.jmxremote.access.file=${JMX_CONF}/jmx.access&amp;quot;&lt;br /&gt;
&lt;br /&gt;
avec :&lt;br /&gt;
SERVEUR NAME = DNS ou IP&lt;br /&gt;
JMX_CONF = path vers les fichiers credential (pour protéger l'accès JMX par
role/passwd)&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;FICHIERS CREDENTIALS&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;créer un fichier ${JMX_CONF}/jmx.password avec les droits -rw (rw pour user
seulement ! )&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;monitorRole password&lt;br /&gt;
controlRole password&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;créer un fichier ${JMX_CONF}/jmx.access avec les droits -rw (rw pour user
seulement ! )&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;monitorRole readonly&lt;br /&gt;
controlRole readwrite&lt;/p&gt;
&lt;h3&gt;AJOUT DU LISTENER JMX&lt;/h3&gt;
&lt;p&gt;dans le fichier serveur.xml de tomcat, ajouter la ligne
suivante :&lt;br /&gt;
&amp;lt;listener classname=&amp;quot;org.apache.catalina.mbeans.JMXAdaptorLifecycleListener&amp;quot;
namingport=&amp;quot;${PORT2}&amp;quot; port=&amp;quot;${PORT1}&amp;quot; host=&amp;quot;${SERVEUR_NAME}&amp;quot;&amp;gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;MISE A JOUR DES LIBRAIRIES&lt;/h3&gt;
&lt;p&gt;Ajouter dans les libs de tomcat les jar suivants :&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;jmx-adaptor-listener.jar&lt;/li&gt;
&lt;li&gt;tomcat-catalina-jmx-remote-${VERSION}.jar&lt;/li&gt;
&lt;li&gt;commons-logging-${VERSION}.jar&lt;/li&gt;
&lt;li&gt;carol-${VERSION}.jar&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;MISE A JOUR DU FIREWALL&lt;/h3&gt;
&lt;p&gt;Ouvrir les ports ${PORT1} et ${PORT2} sur le firewall pour permettre l'accès
aux machines susceptibles de se connecter à la console JMX&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;VISUALGC&lt;/h2&gt;
&lt;h3&gt;ACTIONS SUR LE SERVEUR&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Récupérez une version de visualgc : &lt;a href=&quot;http://java.sun.com/performance/jvmstat/&quot; hreflang=&quot;en&quot;&gt;http://java.sun.com/performance/jvmstat/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Créer un fichier (nommé ici : jstatd.all.policy) pour permettre à
l'environnement java de s'exécuter avec les bons droits&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;
grant codebase &amp;quot;file:/usr/local/jdk1.6.0_30/lib/tools.jar&amp;quot; { permission
java.security.AllPermission; };&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sur le serveur lancer jstatd afin de permettre le monitoring GC&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;
$JAVA_HOME/bin/jstatd -J-Djava.security.policy=jstatd.all.policy
-J-Djava.rmi.server.hostname=${SERVEUR_NAME} &amp;amp;amp;&lt;br /&gt;
&lt;strong&gt;ou&lt;/strong&gt;&lt;br /&gt;
rmiregistry 2020&amp;amp;amp;&lt;br /&gt;
$JAVA_HOME/bin/jstatd -J-Djava.security.policy=jstatd.all.policy
-J-Djava.rmi.server.hostname=${SERVEUR_NAME} -p 2020 &amp;amp;amp;&lt;br /&gt;
si vous souhaitez utiliser le port rmi 2020 à la place du port par défaut
(1099)&lt;br /&gt;
Ouvrir le port (1099 ou autre) pour permettre aux clients de se connecter par
RMI&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;ACTIONS SUR LES CLIENTS&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;sur la machine sur laquelle s'exécutera l'outil visualgc, lancer la
commande suivante :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;
jps -l -m -v rmi://${IP_SERVEUR}:1099 (1099 = port rmi par defaut, 2020 ou
autre si vous utilisez la commande rmiregistry) cette commande va lister tous
les processus java lancé sur le serveur avec en première colonne le numéro de
processus associé à la commande java.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pour lancer visualgc tapez ensuite&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;
visualgc ${NUMERO_DE_PROCESSUS}@${SERVEUR_NAME}&lt;br /&gt;
avec le numéro de processus correspondant au numéro de processus renvoyé par la
commande jps précédente&amp;lt;/listener&amp;gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>TOMCAT MULTI INSTANCES</title>
    <link>http://blog.e-michel.com/post/2011/04/12/TOMCAT-MULTI-INSTANCES</link>
    <guid isPermaLink="false">urn:md5:7d4513b1d8438235555d74a8794ae29c</guid>
    <pubDate>Tue, 12 Apr 2011 13:19:00 +0200</pubDate>
    <dc:creator>Eric</dc:creator>
        <category>Tomcat</category>
        <category>Tomcat Configuration</category>    
    <description>    &lt;h2&gt;Contexte&lt;/h2&gt;
&lt;p&gt;&lt;br /&gt;
Avec une installation standard de tomcat, nous déployons les applications dans
un même et unique répertoire webapp. Bien qu'assez pratique, cette solution
n'est pas sans inconvénients :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On ne peut pas gérer l'arrêt d'une application sans engendrer l'arrêt des
autres services.&lt;/li&gt;
&lt;li&gt;La mémoire allouée au tomcat est fonction des applications déployées. Pour
le dire autrement, cela oblige à allouer d'un bloc plus de mémoire au tomcat.
Si la mémoire arrive à saturation, nous constatons un arrêt de service sur
toutes les applications déployées. D'autre part il est conseillé d'éviter
d'allouer un montant trop important au niveau de la mémoire, car cela peut
engendrer des &amp;quot;freeze&amp;quot; des applications lorsque le garbage collector
s'active.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un début de solution serait de se dire qu'il faut installer autant de tomcat
que nous avons d'applications à déployées. Ainsi nous serions capables de
tailler la JVM par applicatif sans que cela engendre des risques sur les autres
applicatifs. L'inconvénient principal de cette architecture est de ne pas
pouvoir faire évoluer facilement la version des binaires tomcat. Si on a dix
applis installées il faudrait alors réinstaller 10 fois la nouvelle version de
tomcat. La solution élégante est décrite dans la suite de ce billet avec une
installation tomcat multi-instances :&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;Avantages du tomcat multi instances&lt;/h2&gt;
&lt;p&gt;&lt;br /&gt;
La solution proposée par ce post est d'installer une seul binaire de tomcat
puis de créer pour chaque applicatif une configuration distincte. Ce type de
solution nous offre les avantages suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 seul bianire tomcat (facilitant le travail de maintenance et de mise à
jour de version)&lt;/li&gt;
&lt;li&gt;Chaque application aurait sa propre JVM et sa propre configuration (taille
JVM, ports etc ...)&lt;/li&gt;
&lt;li&gt;Possibilité d'arrêter indépendamment chaque application.&lt;/li&gt;
&lt;li&gt;Un crash mémoire sur une des applications n'entrainera pas de
dysfonctionnement sur les autres applications.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;Recette de cuisine pour configurer un tomcat multi-instances&lt;/h2&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Téléchargez votre version de tomcat et installez là sur le disque
(ex : /srv/java/tomcat/mon_binaire_tomcat )&lt;/li&gt;
&lt;li&gt;Mettre à jour une variable système pour y configurer l'endroit ou se trouve
le binaire tomcat (ex : CATALINA_HOME= /srv/java/tomcat/mon_binaire_tomcat
)&lt;/li&gt;
&lt;li&gt;Mettre à jour une deuxième variable système qui servira à définir l'endroit
ou sont configurées les instances tomcat (ex : PRGDIR=~/tomcat)&lt;/li&gt;
&lt;li&gt;Recharger votre configuration d'environnement (source /.bashrc sous linux).
En gros la commande &amp;quot;env&amp;quot; doit afficher les nouvelles variables. Téléchargez le
template en pièce jointe et le décompresser dans $PRGDIR&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Nous venons de désarchiver le fichier joint qui contient les instances. Ce
fichier contient :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 fichier run.sh, à éditer/modifier pour les plus curieux. C'est ce script
qui lancera et arrêtera les instances de tomcat.&lt;/li&gt;
&lt;li&gt;1 répertoire shared qui contient la configuration partagé et dans conf le
fichier server.xml (modifié pour injecter les numéros de ports en fonction des
instances)&lt;/li&gt;
&lt;li&gt;3 répertoires d'instances dans lesquels on placera dans chacun une
applications (on peut ajouter ou supprimer autant d'instances que l'on souhaite
ou encore les renommer). Dans ces répertoires, le fichier
./instance_monAppli{XX}/conf/catalina.properties permet de configurer les ports
tomcat alloués à cette instance et seront injectés dans le fichier
./shared/conf/server.xml. Il y a de plus pour les options JVM, un second
fichier ./instance_monAppli{XX}/bin/setenv.sh modifiable en fonction des
besoins (Xms, Xmx et autres options de jvm)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;Déploiement d'une application&lt;/h2&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Editez le fichier ./instance_{nom_de_mon_instance}/conf/catalina.properties
et configurez les ports attribués à tomcat&lt;/li&gt;
&lt;li&gt;Editez le fichier ./instance_{nom_de_mon_instance}/bin/setenv.sh et
modifiez vos paramètres JVM&lt;/li&gt;
&lt;li&gt;Placez votre application dans le répertoire :
./instance_{nom_de_mon_instance}/webapps&lt;/li&gt;
&lt;li&gt;lancez l'instance tomcat via la commande : ./run.sh start
nom_de_mon_instance&lt;/li&gt;
&lt;li&gt;Vérifier le démarrage de l'instance via le catalina.out (dans
./instance_{nom_de_mon_instance}/logs/catalina.out) + logs applicatifs&lt;/li&gt;
&lt;li&gt;Pour la forme vérifier le lancement du tomcat et les paramètres associés
avec un &amp;quot;ps -ef | grep nom_de_mon_instance&amp;quot;. On notera que nos settings sont
bien pris en compte via le retour de la commande ps =&amp;gt;
-Dcatalina.base=/srv/java/tomcatMultiInstances/instance_monAppli1
-Dcatalina.home=/srv/java/apache-tomcat-6.0.20&lt;/li&gt;
&lt;li&gt;Pour arrêter l'instance, il suffit de taper la commande ./run.sh stop
{nom_de_mon_instance}&lt;/li&gt;
&lt;/ol&gt;</description>
    
          <enclosure url="http://blog.e-michel.com/public/tomcatMultiInstances.tar.gz"
      length="1924255" type="application/x-gzip" />
    
    
      </item>
    
  <item>
    <title>Sous Rapport avec Jasper et Ireport</title>
    <link>http://blog.e-michel.com/post/2008/12/03/A-venir-%3A-Sous-Rapport-avec-Jasper-et-Ireport</link>
    <guid isPermaLink="false">urn:md5:76f5cf2e05265c5b927f46b943afdc55</guid>
    <pubDate>Wed, 03 Dec 2008 11:02:00 +0100</pubDate>
    <dc:creator>Eric</dc:creator>
        <category>Jasper</category>
            
    <description>    &lt;h2&gt;Présentation&lt;/h2&gt;
&lt;p&gt;Cet article montre comment créer un rapport à trois niveaux de maitre détail
en java. On utilisera exclusivement jasper et java sans utiliser la moindre
ligne SQL pour générer les rapports. Il sera intéressant de voir ici deux
techniques pour passer des listes de détails de manière différentes aux sous
rapports. Soit en implémentant directement l'interface &lt;em&gt;JRDataSource&lt;/em&gt;,
soit en créant de simple collection et en configurant dans Ireport le passage
des listes en paramètre.&lt;br /&gt;
Le rapport que nous allons créer va afficher dans un premier temps la liste des
pays européens et un troisième niveau avec les principales villes de chacun des
pays. En maitre, nous aurons les informations concernant l'Europe, nom et
couleur associée à ce continent à savoir le bleu. En détail, nous trouverons la
liste des pays européens. Dans ce détail, nous allons créer un nouveau détail
qui affichera la liste des principales villes du pays. &lt;em&gt;NB : Toute
ressemblance entre la réalité et les données affichées dans ces rapports n'est
que pure coincidence !!!&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;Création d'un maître détail avec jasper en implémentant la datasource&lt;/h2&gt;
&lt;h3&gt;Partie Java&lt;/h3&gt;
&lt;p&gt;La première étape de ce rapport consiste à afficher les informations
générales du continent européens, ici le nom du continent, la couleur associé
qui est le bleu, puis de faire un sous rapport dans le détail afin d'afficher
les pays européens. Voici la classe définissant un pays :&lt;/p&gt;
&lt;pre&gt;
public class Pays {
        private String nom;
        private Integer population;
        public String getNom() {
                return nom;
        }
        public void setNom(String nom) {
                this.nom = nom;
        }
        public Integer getPopulation() {
                return population;
        }
        public void setPopulation(Integer population) {
                this.population = population;
        }
}
&lt;/pre&gt;
&lt;p&gt;Cette classe ne présente rien de spécial, il s'agit d'un simple POJO avec
des attributs et des accesseurs.&lt;br /&gt;
Voyons maintenant la classe Continent contenant les informations générales
liées à un continent ainsi qu'une liste des pays.&lt;/p&gt;
&lt;pre&gt;
public class Continent extends AbstractJRDataSource&amp;lt;Pays&amp;gt; {
        private String nom;
        private String couleur;
        
        public String getNom() {
                return nom;
        }
        public void setNom(String nom) {
                this.nom = nom;
        }
        public String getCouleur() {
                return couleur;
        }
        public void setCouleur(String couleur) {
                this.couleur = couleur;
        }
}
&lt;/pre&gt;
&lt;p&gt;La liste des pays n'apparait pas ici en Collection, en revanche, on étend
une classe &lt;q&gt;maison&lt;/q&gt; &lt;em&gt;AbstractJRDataSource&amp;lt;Pays&amp;gt;&lt;/em&gt; dont voici
le code :&lt;/p&gt;
&lt;pre&gt;
public abstract class AbstractJRDataSource&amp;lt;T&amp;gt; implements JRDataSource {
    protected int index=0;
    protected List&amp;lt;T&amp;gt;listeObj = null;
    public boolean next() throws JRException {
        index++;
        return (index &amp;lt;= listeObj.size());
    }

    public Object getFieldValue(JRField field) throws JRException {
        T obj = listeObj.get(index-1);
        Object value;
        try {
            String methodName = &amp;quot;get&amp;quot;+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1);
            value = MethodUtils.invokeExactMethod( obj, methodName, null);
        } catch (Exception e) {
            throw new JRException(e.getMessage());
        }
        return value;
    }
    public List&amp;lt;T&amp;gt; getListeObj() {
        return listeObj;
    }
    public void setListeObj(List&amp;lt;T&amp;gt; listeObj) {
        this.listeObj = listeObj;
    }
}
&lt;/pre&gt;
&lt;p&gt;Il s'agit d'une classe générique dont un peut définir librement le type de
la liste implémentée via le template, celle-ci implémente les méthodes
&lt;em&gt;getFieldValue&lt;/em&gt;() et &lt;em&gt;next&lt;/em&gt;() de l'interface
&lt;em&gt;JRDataSource&lt;/em&gt; de Jasper. L'implémentation de l'interface JRDataSource
va nous permettre de facilement alimenter les sous raports en créant de simple
liste de pays. Voici maintenant le code de création des rapports :&lt;/p&gt;
&lt;pre&gt;
public class SubReportDemo {
        public static void main(String[] args) {
        Continent continent = init();
        JasperReport jasperReport = null;
        JasperPrint jasperPrint = null;
        Map&amp;lt;Object,Object&amp;gt; parameterMap = new HashMap&amp;lt;Object,Object&amp;gt;();
        parameterMap.put( &amp;quot;reportName&amp;quot;, &amp;quot;Rapport DEMO&amp;quot; );       
        parameterMap.put( &amp;quot;nom&amp;quot;, continent.getNom() );
        parameterMap.put( &amp;quot;couleur&amp;quot;, continent.getCouleur() );
        InputStream reportStream = SubReportDemo.class.getClassLoader().getResourceAsStream(&amp;quot;rapport_demo_parent.jrxml&amp;quot;);
        try {
                        jasperReport = JasperCompileManager.compileReport(reportStream);
                        jasperPrint = JasperFillManager.fillReport(jasperReport, parameterMap, continent);
                        JasperExportManager.exportReportToPdfFile(jasperPrint, &amp;quot;/tmp/reportEurope_&amp;quot;+new Date()+&amp;quot;.pdf&amp;quot;);
                } catch (JRException e) {
                        e.printStackTrace();
                }
        }
        private static Continent init(){                
                Continent europe = new Continent();             
                List&amp;lt;Pays&amp;gt; paysEurope = new ArrayList&amp;lt;Pays&amp;gt;();
                Pays france = new Pays();
                france.setNom(&amp;quot;FRANCE&amp;quot;); france.setPopulation(60000000);
                paysEurope.add(france);
                
                Pays italie = new Pays();
                italie.setNom(&amp;quot;Italie&amp;quot;); italie.setPopulation(45000000);      
                paysEurope.add(italie);
                
                Pays angleterre = new Pays();
                angleterre.setNom(&amp;quot;Angleterre&amp;quot;); angleterre.setPopulation(55000000);
                paysEurope.add(angleterre);
                
                europe.setListeObj(paysEurope);
                europe.setNom(&amp;quot;Europe&amp;quot;);
                europe.setCouleur(&amp;quot;bleu&amp;quot;);    
                return europe;
        }
}
&lt;/pre&gt;
&lt;p&gt;la Liste des pays est renseigné dans la classe continent via la méthode
&lt;em&gt;setListeObj()&lt;/em&gt; définit comme template Pays =&amp;gt; &lt;em&gt;public class
Continent extends AbstractJRDataSource&amp;lt;Pays&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Partie iReport&lt;/h3&gt;
&lt;h4&gt;Création du rapport principal&lt;/h4&gt;
&lt;p&gt;Pour commencer, nous allons définir les paramètres, Le titre du rapport sera
passé en paramètre au rapport puis affiché sur celui-ci. Reste les données à
afficher dans la partie entête en l'occurence les données de l'objet
&lt;em&gt;continent&lt;/em&gt; : le nom et la couleur que nous passons en tant que
paramètres, En tant que champs, nous passerons les données affichées dans la
partie détail (partie automatiquement alimentée avec les méthodes de
l'interface que nous avons implémentée : &lt;em&gt;JRDataSource)&lt;/em&gt; provenant
de la classe Pays. &lt;img src=&quot;http://blog.e-michel.com/public/Jasper_Parametres.png&quot; alt=&quot;Jasper Paramètres Maitre&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Jasper Paramètres Maitre, dec 2008&quot; /&gt; Ensuite, nous disposons les données sur
le rapports : &lt;img src=&quot;http://blog.e-michel.com/public/./.jasper_report_maitre-detail_m.jpg&quot; alt=&quot;asper report maitre&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;asper report maitre, dec 2008&quot; /&gt; Voici alors le résultat obtenu avec la
partie Maître &lt;em&gt;Continent&lt;/em&gt; et les Détails &lt;em&gt;Pays&lt;/em&gt; &lt;img src=&quot;http://blog.e-michel.com/public/./.Jasper_Resultat_Maitre_Detail_m.jpg&quot; alt=&quot;Jasper Resultat Maitre Detail&quot; title=&quot;Jasper Resultat Maitre Detail, dec 2008&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;Etape 2 : Sous Rapport en java avec jasper&lt;/h2&gt;
&lt;p&gt;Nous avons vu en première partie comment faire un simple maître détail en
utilisant Jasper et en implémentant l'interface JRDataSource mise à disposition
par l'API jasper. Voyons maintenant comment créer un sous rapport dans la
partie détail du rapport. Nous allons ajouter en dessous de chaque pays, une
liste des principales villes. Nous allons créer un sous rapport dans la partie
détail. Voyons tout d'abord les modification au niveau structure objet.&lt;/p&gt;
&lt;h3&gt;Partie JAVA&lt;/h3&gt;
&lt;p&gt;On commence par ajouter la classe ville dont voici les attributs :&lt;/p&gt;
&lt;pre&gt;
public class Ville {
        private String nom;
        private Integer population;
        private Double superficie;
        public String getNom() {
                return nom;
        }
        public void setNom(String nom) {
                this.nom = nom;
        }
        public Integer getPopulation() {
                return population;
        }
        public void setPopulation(Integer population) {
                this.population = population;
        }
        public Double getSuperficie() {
                return superficie;
        }
        public void setSuperficie(Double superficie) {
                this.superficie = superficie;
        }
}
&lt;/pre&gt;
&lt;p&gt;Ensuite, on modifie la classe Pays pour y ajouter la collection de ville.
Ici, on n'étend pas l'interface DataSource, on verra comment sera créer la
dataSource dans iReport un peu plus tard...&lt;/p&gt;
&lt;pre&gt;
public class Pays {
        private String nom;
        private Integer population;
        private Collection&amp;lt;Ville&amp;gt; villes;
        public String getNom() {
                return nom;
        }
        public void setNom(String nom) {
                this.nom = nom;
        }
        public Integer getPopulation() {
                return population;
        }
        public void setPopulation(Integer population) {
                this.population = population;
        }
        public Collection&amp;lt;Ville&amp;gt; getVilles() {
                return villes;
        }
        public void setVilles(Collection&amp;lt;Ville&amp;gt; villes) {
                this.villes = villes;
        }       
}
&lt;/pre&gt;
&lt;p&gt;Pour la partie java... on a finit !&lt;/p&gt;
&lt;h3&gt;Partie iReport&lt;/h3&gt;
&lt;p&gt;En dessous des informations concernant le pays, nous allons créer un rapport
secondaire. Une boîte de dialogue s'ouvre alors, nous sélectionnerons &lt;q&gt;just
create subreport element&lt;/q&gt;&lt;br /&gt;
Dans les propriétés du rapport secondaire, nous nommons le rapport qui sera
appélé dans l'onglet &lt;q&gt;Rapport Secondaire (autre)&lt;/q&gt; par exemple
&lt;q&gt;Rapport_Villes.jasper&lt;/q&gt;.&lt;br /&gt;
Ensuite, nous passons à l'onglet &lt;q&gt;Rapport Secondaire&lt;/q&gt; et nous définissons
les paramètres du rapport secondaire en réutilisant les paramètres du rapport
principal dans &lt;q&gt;Expression de mappe de paramètre&lt;/q&gt; avec la valeur :
&lt;em&gt;new HashMap($P{REPORT_PARAMETERS_MAP})&lt;/em&gt;, En dessous, on
sélectionne : &lt;q&gt;Utiliser l'expression de source de donnée&lt;/q&gt; et en
valeur, on y met notre collection qui alimente la datasource : &lt;q&gt;new
JRBeanCollectionDataSource($F{villes})&lt;/q&gt;. Une fois fait, l'onglet problem
mentionne que nous n'avons pas tout a fait terminé, il faut rajouter dans le
rapport principal la propriété que nous avons ajouté dans je code java de la
classe Pays à savoir villes de type : &lt;em&gt;java.util.Collection&lt;/em&gt;. On
rajoute le champs et nous pouvons passer au sous rapport.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;A venir !!!&lt;/p&gt;</description>
    
    
    
      </item>
    
</channel>
</rss>
