====== TP CCI Java: Réseau, Collections et analyses multiples ======
Pour faire cette partie, il est nécessaire d'avoir terminé la [[cci-java-tp1|partie 1]]
===== Lire des documents sur le réseau =====
Java permet très facilement de récupérer des documents accessibles par
le réseau, en particulier à travers le protocole ''http''. L'objectif de
cette amélioration est d'ajouter à l'analyseur la possibilité de lire
de tels documents.
==== Un lecteur pour le réseau ====
L'objectif ici est de coder une nouvelle implémentation de l'interface
''Lecteur'' qui, au lieu de lire les caractères dans un fichier
sur la machine ou au clavier, va lire les caractères dans un fichier
sur le réseau. Pour cela nous allons utiliser la classe ''java.net.URL''.
La première étape consiste à lire la documentation de la classe ''java.net.URL''. En
particulier, on s'attachera à lire la documentation du constructeur
qui prend une ''String'' en argument, ainsi que la documentation
de la méthode ''openStream()''.
La classe ''java.net.URL'' nous permet ainsi de récupérer un ''InputStream''
pour lire dans le fichier désigné par cette URL. Créer une classe
''LecteurReseau'' qui implémente l'interface ''Lecteur''.
On pourra prendre comme modèle les classes ''LecteurDeFichier''
et ''LecteurClavier'' de la [[cci-java-tp1|première partie]]. Le constructeur de la classe
prendra en argument une ''String'' correspondant à l'URL du
fichier à lire.
==== Utilisation dans la méthode ''main'' de l'analyseur ====
Nous avons à présent le choix entre trois lecteurs possibles:
* ''LecteurClavier'': s'il n'y a pas de fichier spécifié
* ''LecteurDeFichier'': si un fichier est spécifié en plus du mot à reconnaître
* ''LecteurReseau'': si une URL est spécifiée en plus du mot à reconnaître
Pour faire la différence entre une URL et un nom de fichier, on
supposera qu'une URL contient toujours la chaîne de caractères
''"://"'' contrairement à un nom de fichier.
Modifier la méthode ''main'' de la classe ''Analyseur'' de
façon à utiliser un ''LecteurReseau'' lorsqu'une URL est donnée
comme nom de fichier.
===== Une analyse avec expressions régulières =====
Le but ici est de permettre de pouvoir utiliser des expressions
régulière (comme le programme Unix ''grep'') et pas seulement des
mots.
Pour cela créer un champ "''pattern''" de la classe ''java.util.regex.Pattern''.
Pour initialiser ce champ, on utilisera la méthode statique ''Pattern.compile(String regex)''.
Modifier ensuite la classe ''Analyseur'' de façon à reconnaître une expression régulière et pas un mot.
Pour tester une ligne, on pourra utiliser ''pattern.matcher(laLigneATester).find()''.
===== Collections =====
==== Classe Ligne ====
Créer une classe ''Ligne'' qui contient deux champs:
un champ ''numero'' qui est un ''int'' et un champ
''texte'' qui est un ''String''.
Modifier ou créer un constructeur pour qu'il prenne des arguments permettant
d'initialiser ces deux champs.
Ajouter les deux méthodes suivantes:
public int getNumero() { ... }
public int getTexte() { ... }
permettant de récupérer les valeurs de ces champs.
==== Modification de la méthode analyse ====
On veut modifier la méthode analyse afin qu'elle renvoie une collection de
lignes (type ''Collection''). Cela nous permettra d'afficher
des informations supplémentaires sur le résultat comme par exemple le
nombre de lignes trouvées.
Commencer par changer la signature de la méthode.
L'interface ''Collection'' se trouve dans le package ''java.util''.
Déclarer une variable de type ''Collection''.
Comme ''Collection'' est une interface, il faut une classe qui
l'implémente. On trouvera un ensemble de telles classes dans la
documentation de l'interface ''Collection''.
Choisir une implémentation et l'utiliser pour initialiser la variable
au début de la méthode ''analyse()''.
Changer les instructions qui faisaient l'affichage pour, à la place,
créer une nouvelle ligne et l'ajouter à la collection.
Enfin, renvoyer la collection.
==== Utilisation de la collection dans la méthode main ====
Dans la méthode ''main'', créer une variable de type
''Collection'' qui est initialisée par l'appel à la méthode
''analyse()''.
Créer ensuite une variable de type ''Iterator'' que l'on
initialisera grâce à la méthode ''iterator()'' de l'interface
''Collection''.
Utiliser les méthodes ''next()'' et ''hasNext()'' de
l' ''Iterator'' pour parcourir la collection et afficher chaque
ligne précédée de son numéro.
Si le résultat de l'analyse est vide, on affichera un message, sinon
on affichera le nombre de lignes trouvées (chercher les bonnes
méthodes dans l'interface ''Collection'').