import java.io.*;
import java.util.regex.*;
/**
* La classe Console fournit les moyens à des utilisateurs en mode console,
* de saisir des informations de différents types primitifs Java
* ou de chaînes de caractères.
* Cette classe est capable de lire un nombre d'un type primitif désiré
* et d'en contrôler la validité.
* Cette classe propose également de contrôler des chaînes de caractères
* selon un format précis, à l'image d'adresses email, IP ou URL.
*
* @author Pascal EMMA
* @version 1 du 24/08/2003
* @see java.io.PrintStream
* @see java.lang.System
*/
class Console {
/**
* Le champ encodage contient le type d'encodage de caractères
* de la plateforme courante.
*/
public static String encodage = System.getProperty("file.encoding");
/**
* Le champ termintateur contient le le terminateur de lignes
* de la plateforme courante.
*/
private static String terminateur = System.getProperty("line.separator");
/**
* Le champ statique in représente une instance de la classe Console.
*/
public static final Console in = new Console();
/**
* Le champ statique out représente un flux vers la sortie standard.
* @see java.io.PrintStream
*/
public static final PrintStream out = new PrintStream(System.out, true);
/**
* La méthode saisirLigne permet de lire une valeur saisie
* par l'utilisateur sur l'entrée standard.
* @return retourne la chaîne de caractères saisie par l'utilisateur
* ou la valeur 'null' dans le cas contraire.
*/
public String saisirLigne(){
try{
BufferedReader entreeClavier = new BufferedReader(
new InputStreamReader(System.in));
return entreeClavier.readLine();
}
catch (IOException e) {
return null;
}
}
/**
* La méthode verifNombre permet de vérifier la validité
* des nombres saisis par l'utilisateur.
* Il est possible de vérifier soit des entiers, soit des réels.
* @param valeur représente la valeur saisie par l'opérateur.
* @param type représente le type de nombres à vérifier.
* <ul>
* <li>La valeur 'reel' permet de tester les nombres réels,</li>
* <li>La valeur 'entier' permet de tester les nombres entiers.</li>
* </ul>
* @return retourne 'true' si la valeur testée est un nombre
* ou 'false' dans le cas contraire.
*/
private boolean verifNombre(String valeur, String type) {
String regexp;
if(type.equals("entier"))
regexp = "[+-]?[0-9]*";
else
regexp = "[+-]?[0-9]*[.Ee]?[+-]?[0-9]*";
Pattern modele = Pattern.compile(regexp);
Matcher correspondance = modele.matcher(valeur);
if(valeur != null && !valeur.equals("") && correspondance.matches())
return true;
else
return false;
}
/**
* La méthode saisirLong permet de lire des nombres entiers
* de type primitif 'long'.
* @return retourne une valeur entière de type 'long'.
* Si la valeur saisie par l'opérateur excède les limites du type 'long'
* alors la valeur entière maximum ou minimum selon le cas est retournée.
*/
public long saisirLong(){
double nb = 0;
String valeur = saisirLigne();
if(verifNombre(valeur, "entier"))
nb = Double.parseDouble(valeur);
if(nb < Long.MAX_VALUE && nb > Long.MIN_VALUE)
return Long.parseLong(valeur);
else if(nb > 0)
return Long.MAX_VALUE;
else
return Long.MIN_VALUE;
}
/**
* La méthode saisirInt permet de lire des nombres entiers de type primitif 'int'.
* @return retourne une valeur entière de type 'int'.
* Si la valeur saisie par l'opérateur excède les limites du type 'int'
* alors la valeur entière maximum ou minimum selon le cas est retournée.
*/
public int saisirInt(){
long valeur = saisirLong();
if(valeur < Integer.MAX_VALUE && valeur > Integer.MIN_VALUE)
return (int)valeur;
else if(valeur > 0)
return Integer.MAX_VALUE;
else
return Integer.MIN_VALUE;
}
/**
* La méthode saisirShort permet de lire des nombres entiers
* de type primitif 'short'.
* @return retourne une valeur entière de type 'short'.
* Si la valeur saisie par l'opérateur excède les limites du type 'short'
* alors la valeur entière maximum ou minimum selon le cas est retournée.
*/
public short saisirShort(){
long valeur = saisirLong();
if(valeur < Short.MAX_VALUE && valeur > Short.MIN_VALUE)
return (short)valeur;
else if(valeur > 0)
return Short.MAX_VALUE;
else
return Short.MIN_VALUE;
}
/**
* La méthode saisirByte permet de lire des nombres entiers de type primitif 'byte'.
* @return retourne une valeur entière de type 'byte'.
* Si la valeur saisie par l'opérateur excède les limites du type 'byte'
* alors la valeur entière maximum ou minimum selon le cas est retournée.
*/
public byte saisirByte(){
long valeur = saisirLong();
if(valeur < Byte.MAX_VALUE && valeur > Byte.MIN_VALUE)
return (byte)valeur;
else if(valeur > 0)
return Byte.MAX_VALUE;
else
return Byte.MIN_VALUE;
}
/**
* La méthode saisirDouble permet de lire des nombres à virgule flottante
* de type primitif 'double'.
* @return retourne une valeur réelle de type 'double'.
* Si la valeur saisie par l'opérateur excède les limites du type 'double'
* alors la valeur entière maximum ou minimum selon le cas est retournée.
*/
public double saisirDouble(){
double nb = 0;
String valeur = saisirLigne();
if(valeur.indexOf(",") != -1) valeur = valeur.replace(',','.');
if(verifNombre(valeur, "reel"))
nb = Double.parseDouble(valeur);
if(nb < Double.MAX_VALUE && nb > Double.MIN_VALUE)
return nb;
else if(nb > 0)
return Double.MAX_VALUE;
else
return Double.MIN_VALUE;
}
/**
* La méthode saisirFloat permet de lire des nombres à virgule flottante
* de type primitif 'float'.
* @return retourne une valeur réelle de type 'float'.
* Si la valeur saisie par l'opérateur excède les limites du type 'float'
* alors la valeur entière maximum ou minimum selon le cas est retournée.
*/
public float saisirFloat(){
double valeur = saisirDouble();
if(valeur < Float.MAX_VALUE && valeur > Float.MIN_VALUE)
return (float)valeur;
else if(valeur > 0)
return Float.MAX_VALUE;
else
return Float.MIN_VALUE;
}
/**
* La méthode saisirChar permet de lire un unique caractère
* de type primitif 'char'.
* @return retourne une valeur de type 'char'.
* Si la valeur saisie par l'opérateur est nulle ou vide
* alors la valeur minimum est retournée.
*/
public char saisirChar(){
String valeur = saisirLigne();
if(valeur != null && !valeur.equals(""))
return valeur.charAt(0);
else
return Character.MIN_VALUE;
}
/**
* La méthode saisirAvecMasque permet de lire une chaîne de caractères
* respectant le format passé en argument.
* @param format représente le masque de format sous la forme
* d'une chaîne de caractères et respectant les standards
* des expressions régulières.
* @return retourne une chaîne de caractères respectant un certain format.
* Si la saisie est erronée, alors la valeur 'null' est retournée.
*/
public String saisirAvecMasque(String format){
String valeur = saisirLigne();
Pattern modele = Pattern.compile(format);
Matcher correspondance = modele.matcher(valeur);
if(valeur != null && valeur.length() > 0 && correspondance.matches())
return valeur;
else
return null;
}
/**
* La méthode saisirEmail permet de lire une chaîne de caractères
* respectant le format d'une adresse email.
* @return retourne une chaîne de caractères représentant une adresse email.
* Si la saisie est erronée, alors la chaîne de caractères
* 'utilisateur@domaine.ext' est retournée.
*/
public String saisirEmail(){
String masque = "^[a-zA-Z]+[a-zA-Z0-9\\._-]*[a-zA-Z0-9]@[a-zA-Z]+"
+ "[a-zA-Z0-9\\._-]*[a-zA-Z0-9]+\\.[a-zA-Z]{2,4}$";
String valeur = saisirAvecMasque(masque);
if(valeur != null)
return valeur;
else
return "utilisateur@domaine.ext";
}
/**
* La méthode saisirEmail permet de lire une chaîne de caractères
* respectant le format d'une adresse IP (Internet Protocol).
* @return retourne une chaîne de caractères représentant une adresse IP.
* Si la saisie est erronée, alors la chaîne de caractères
* '000.000.000.000' est retournée.
*/
public String saisirIP(){
String masque = "^[0-2]?[0-9]{0,2}\\.[0-2]?[0-9]{0,2}\\.[0-2]?"
+ "[0-9]{0,2}\\.[0,2]?[0-9]{0,2}$";
String valeur = saisirAvecMasque(masque);
if(valeur != null)
return valeur;
else
return "000.000.000.000";
}
/**
* La méthode saisirURL permet de lire une chaîne de caractères
* respectant le format d'une adresse URL (Uniform Resource Locator).
* @return retourne une chaîne de caractères représentant une adresse URL.
* Si la saisie est erronée, alors la chaîne de caractères
* 'protocole://domaine:port/repertoire/
* fichier.ext?champ=valeur&champ2=valeur' est retournée.
*/
public String saisirURL(){
String masque = "^[a-z]*://[a-z0-9\\._-]*(\\.[a-z]{2,4})?"
+ "(:[0-9]{1,5})?((/[a-z0-9\\.-_ ]*)*(\\.[a-z]{2,4}(\\?.*)?)?)?";
String valeur = saisirAvecMasque(masque);
if(valeur != null)
return valeur;
else
return "protocole://domaine:port/repertoire"
+ "/fichier.ext?champ=valeur&champ2=valeur";
}
} |