\documentclass[twoside,a4paper,10pt]{amsbook}
\usepackage[french]{babel} %% Use your own babel language
\usepackage[top=3cm,bottom=3cm,left=2.5cm,right=2.5cm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage{pslatex}
\usepackage{hyperref}
\usepackage{graphicx}
\usepackage{tabularx}
\usepackage{supertabular}
\usepackage{pdflscape} %% Used for very big table
\usepackage{moreverb}
\usepackage{color}
\usepackage{listings}
\usepackage{lastpage}
\usepackage{fancyhdr}
\usepackage{ulem}
\usepackage{textcomp}
\usepackage{wasysym}
\usepackage{wrapfig} %%Usefull for image 
%%\usepackage{fguill} %%Use this package for guillemot[left|right] useless with babel set to french
\usepackage{eso-pic} %% Background
\pagestyle{fancy}%
\renewcommand{\headrulewidth}{0.1pt}
\renewcommand{\footrulewidth}{0pt}
\renewcommand{\chaptermark}[1]{%
	\markboth{\chaptername\ \thechapter.\ #1}{}}

\renewcommand{\sectionmark}[1]{%
	\markright{#1}{}}

\fancypagestyle{plain}{%
\fancyhf{}
\fancyfoot[R]{\thepage/\pageref{LastPage}}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}}
\fancyhf{}
\fancyhead[L]{\rightmark}
\fancyhead[R]{\leftmark}
\fancyfoot[R]{\thepage/\pageref{LastPage}}
\renewcommand{\headrulewidth}{0.1pt}
\renewcommand{\footrulewidth}{0pt}

\definecolor{codegray}{gray}{.95}
\lstset{language=C,
	numbers=left,
	tabsize=2,
	basicstyle=\scriptsize,
	stringstyle=\textrm,
	showstringspaces=false,
	frame=none,
	xleftmargin=3pt,
	backgroundcolor=\color{codegray}}

\newcommand{\settexitref}[2]{(\ref{#1}p\pageref{#1})}
\newcommand{\dokutitlelevelone}[1]{\chapter{#1}}
\newcommand{\dokutitleleveltwo}[1]{\section{#1}}
\newcommand{\dokutitleleveltree}[1]{\subsection{#1}}
\newcommand{\dokutitlelevelfour}[1]{\subsubsection{#1}}
\newcommand{\dokutitlelevelfive}[1]{\paragraph{#1}}
\newcommand{\dokufootnote}[1]{\footnote{#1}}
\newcommand{\dokufootmark}[1]{\footnotemark[#1]}
\newcommand{\dokubold}[1]{\textbf{#1}}
\newcommand{\dokuitalic}[1]{\textsl{#1}}
\newcommand{\dokumonospace}[1]{\texttt{#1}}
\newcommand{\dokuunderline}[1]{\underline{#1}}
\newcommand{\dokuoverline}[1]{\sout{#1}}
\newcommand{\dokusupscript}[1]{\textsuperscript{#1}}
\newcommand{\dokusubscript}[1]{$_{#1}$}
\newcommand{\dokuhline}{\line(1,0){400}}
\newcommand{\dokulabel}[1]{\label{#1}}
\newcommand{\dokuitem}{\item}
\newcommand{\dokuquoting}{\textbar}
\newcommand{\dokutabularwidth}{\textwidth}
\newcommand{\dokusupertabularheadbreak}{\small\sl continued from previous page}
\newcommand{\dokusupertabulartailbreak}{\small\sl continued on next page}
\newcommand{\dokuheadingstyle}[1]{\textbf{#1}}
\definecolor{dokuheadingcolor}{rgb}{0,0,0.60}
\newcommand{\dokubackground}[1]{%
\AddToShipoutPicture{%
  \AtTextCenter{%
    \makebox(0,0)[c]{\resizebox{\textwidth}{!}{%
      \rotatebox{25}{\textsf{\textbf{\textcolor[gray]{0.90}{#1}}}}}}%
  }%
 }%
}

\hypersetup{
pdftitle = {TP2 - Révision de Java, mise en pratique de Redmine+git+Maven},
pdfauthor = {E. Bruno},
pdfcreator = {DokuTeXit},
pdfproducer = {dokuwiki + TeXit + pdflatex}
}
\title{TP2 - Révision de Java, mise en pratique de Redmine+git+Maven}
\author{E. Bruno}
\dokubackground{http://lsis.univ-tln.fr/\~{ }bruno/}
\begin{document}
\thispagestyle{empty}
\maketitle
\thispagestyle{empty}
\cleardoublepage
\tableofcontents
\newpage
\thispagestyle{plain}
\cleardoublepage
\newpage



\dokutitlelevelone{TP2 - Révision de Java, mise en pratique de Redmine+git+maven}
\label{904402d68e0b85ce167e6b2f4b0f80fb}%% tp2_-_revision_de_java_mise_en_pratique_de_redmine_git_maven
\label{98d648825b692edb5772da0b209b82a3}%%Start: tp2 => /home/bruno/public_html/data/pages/tp2.txt
\href{http://fr.slideshare.net/sandeepchawla/maven-introduction}{http://fr.slideshare.net/sandeepchawla/maven-introduction}


\dokutitleleveltwo{Objectif}
\label{ba81ee9ceeb9c96227f3607460f09179}%% objectif
L’objectif de ce TP est réviser les concepts de base du langage Java que vous
devez maîtriser. Il permettra une première mise en pratique réel de l’utilisation de git, de
redmine (sur \href{https://lsis.univ-tln.fr/redmineedu/}{https://lsis.univ-tln.fr/redmineedu/}) et de maven. Pour cela, vous lirez le sujet en entier et par groupes de trois vous mettrez en place un projet redmine pour suivre l’avancement de vos révisions (mise en place d’une roadmap, de tickets pour chaque question, suivi des bug et livraisons).

Pour tous les exercices, vous devez utiliser l’environnement Eclipse (\href{http://www.eclipse.org/}{http://www.eclipse.org/}) ou IntelliJ IDEA (\href{http://www.jetbrains.com/idea/}{www.jetbrains.com/idea/}), ils sont intallés dans \dokumonospace{/usr/local/}. Vous devez écrire la javadoc minimale (\href{http://java.sun.com/j2se/javadoc/writingdoccomments/}{http://java.sun.com/j2se/javadoc/writingdoccomments/}) au fur et à mesure de l’avancement.

La compilation et la génération de la documentation et des artefacts (fichier jar) seront réalisés avec Maven 


\dokutitleleveltwo{Au fur et à mesure du développement}
\label{ff85dfde9aa325c167eb9941602d00cf}%% au_fur_et_a_mesure_du_developpement

\dokutitleleveltree{Livraison du résultat}
\label{d93b4cf1206de901e1d481e129daef07}%% livraison_du_resultat
Fabriquer automatiquement avec maven un fichier \dokumonospace{$<$nom de votre projet$>$.jar} qui contient toutes les classes nécessaires. Exécuter l’application à partir de ce fichier.


\dokutitleleveltree{Gestion des log}
\label{0dc059f6aad64bad3b2efa8b223d6b1a}%% gestion_des_log
(Après une présentation rapide de log4j)
En utilisant soit Log4J soit le système du jdk
– \href{http://logging.apache.org/log4j/}{http://logging.apache.org/log4j/}
Modifier vos classes pour que les logs sont gérés proprement à l’aide de la classe log4j.


\dokutitleleveltree{Test de vos classes avec JUnit}
\label{d6eadd9361184f00a3c443390339e773}%% test_de_vos_classes_avec_junit
 (Après une présentation rapide de Junit)
Mettez en place des tests unitaires au fur et à mesure du développement en utilisant Junit (\href{http://junit.sourceforge.net/}{http://junit.sourceforge.net/})

L’exécution des tests sera faite par maven.


\dokutitleleveltwo{Classes, Instances et Héritage}
\label{2ebc3752ff94e9aae7cc1d15e64e191d}%% classes_instances_et_heritage

\dokutitleleveltree{Hiérarchie}
\label{67e1f2b431b5d9fb8fac86ab7a9b0924}%% hierarchie
Dans un sous-paquetage appelé "vivants". Ecrire les classes Java permettant de décrire
une hiérarchie d’animaux : Tous les animaux doivent avoir un nom, ils sont soit des
mammifères, soit des oiseaux. Pour le moment les animaux sont des vaches et des aigles.
Créer une classe exécutable Test, dont la méthode \dokumonospace{main} instancie des vaches et des
aigles. Avec quel type de références peut-on les manipuler ?


\dokutitleleveltree{Constructeurs, ''toString'' et égalité}
\label{1c587198e3a196826439a6f9b04da91c}%% constructeurs_tostring_et_egalite
Ajouter des constructeurs et mettez en place les méthodes bases d'égalité et de comparaison (\dokumonospace{equals}, \dokumonospace{hascode} et l'interface \dokumonospace{Comparable}). En utilisant, les constructeurs modifier les classes précédentes pour que la méthode \dokumonospace{toString()} des classes \dokumonospace{Vache} et \dokumonospace{Aigle}, affiche : \dokumonospace{Je m’appelle Geronimo et je suis un animal}, \dokumonospace{je suis un oiseau, je suis un aigle Je m’appelle Marguerite} et \dokumonospace{je suis un animal, je suis un mammifère, je suis une vache}. Est-ce cohérent de pouvoir créer des instances d\dokumonospace{Animal} ?


\dokutitleleveltree{Collections}
\label{0b9abfe67cc31fcf1ecd022eb19a5216}%% collections
\href{http://java.sun.com/docs/books/tutorial/collections/index.html}{http://java.sun.com/docs/books/tutorial/collections/index.html}

Nous allons maintenant regrouper les animaux dans des zoos qui sont des collections
d’animaux. Créer une classe \dokumonospace{Zoo} (dans un paquetage \dokumonospace{structures}), qui possède une
méthode \dokumonospace{ajouteAnimal()}, et une méthode \dokumonospace{afficheToi()}. Dans la classe \dokumonospace{Test}, créez deux
zoos et peuplez les avec des animaux pour obtenir le résultat suivant :


\small
\begin{verbatimtab}
Affichage du zoo : mon Zoo
Je m’appelle Germaine et je suis un animal, je suis un mammifère, je suis une vache
Je m’appelle Geronimo et je suis un animal, je suis un oiseau, je suis un aigle
Je m’appelle Marguerite et je suis un animal, je suis un mammifère, je suis une vache
Affichage du zoo : ton Zoo
Je m’appelle Gertrude et je suis un animal, je suis un mammifère, je suis une vache
Je m’appelle Philomène et je suis un animal, je suis un mammifère, je suis une vache
Je m’appelle Tiki et je suis un animal, je suis un oiseau, je suis un aigle
\end{verbatimtab}
\normalsize
Comment s’assurer que deux animaux qui ont le même nom ne peuvent être ajouté au
même zoo ?


\dokutitleleveltree{Administration de classes}
\label{476ea6fe741533464a98da29fbd6df01}%% administration_de_classes
Comment faire pour qu’une référence vers tous les animaux (y compris ceux qui
n’ont pas été ajouté à un zoo) soient conservée ? L’ensemble des animaux sera appelé la
faune. Ajouter une méthode \dokumonospace{afficherFaune()} qui affiche la faune ?


\dokutitleleveltree{Héritage Multiple / Interfaces}
\label{ad63a35ea2ac8a42233e5ac6cb325d34}%% interfaces
On souhaite pouvoir distinguer, parmi les animaux, les carnivores et les herbivores.
Quel est le problème avec la hiérarchie de classe actuelle? Une solution à ce problème
consiste à utiliser deux interfaces (un carnivore peut manger un autre animal, un herbivore
broute). Définissez et implanter ces deux interfaces pour manipuler les aigles et les vaches à travers celles-ci.  Attention, le code ne doit pas être dupliqué, utilisez la délégation.


\dokutitleleveltwo{Entrées/Sorties et sauvegarde (serialisation)}
\label{7e5fac19972e9108561fc314e1a266fe}%% sorties_et_sauvegarde_serialisation
– \href{http://java.sun.com/docs/books/tutorial/essential/io/index.html}{http://java.sun.com/docs/books/tutorial/essential/io/index.html}

Ajouter à la classe Zoo, une méthode \dokumonospace{sauve()} (doit-elle être de classe ou d’instance ?) qui
enregistre un zoo complet dans un fichier dont le nom est passé en paramètre. Ajouter une
méthode \dokumonospace{restaure()} (doit-elle être de classe ou d’instance?), qui retourne une référence vers
un objet \dokumonospace{Zoo} construit à partir des valeurs trouvées dans un fichier dont le nom est passé
en paramètre.


\dokutitleleveltwo{Persistance avec JPA}
\label{26cd8fed0735f07671b71af47db38498}%% persistance_avec_jpa
\dokubold{Obligatoire pour la suite.} En utilisant JPA, mettez en place la persistance de l'application (La faune et les animaux) dans une base de données relationnelles.  Vous utiliserez le SGBD H2 (\href{http://www.h2database.com}{www.h2database.com}).

Pour l'utilisation de JPA/Hibernate avec Intellij vous pouvez suivre :
\href{http://www.jetbrains.com/idea/features/jpa_hibernate.html}{http://www.jetbrains.com/idea/features/jpa{{\textbackslash}textunderscore}hibernate.html}


\dokutitleleveltwo{IHM}
\label{75a0b9b40f26fcfd635593f22e8b53c3}%% ihm
Créer une petite IHM swing permettant d’ajouter des vaches ou des aigles à la faune en
précisant leur nom. A chaque ajout, l’affichage de la faune devra être mis à jour.

\end{document}

