This repository was archived by the owner on Sep 8, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAbstractRunChat.java
More file actions
160 lines (149 loc) · 4.21 KB
/
Copy pathAbstractRunChat.java
File metadata and controls
160 lines (149 loc) · 4.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import chat.Failure;
import logger.LoggerFactory;
/**
* Classe abstraite de base pour lancer un client ou un serveur de chat
* @author davidroussel
*/
public abstract class AbstractRunChat
{
/**
* Port à utiliser pour les connnections entre clients et serveur
*/
protected int port;
/**
* numero de port de communication par défaut
*/
public static final int DEFAULTPORT = 1394;
/**
* Etat de verbose. Si true les messages de debug seront
* affichés. Si false les messages de debug ne seront pas affichés
*/
protected boolean verbose;
/**
* Le logger utilisé pour afficher (ou pas) les messages d'infos et
* d'erreurs.
*/
protected Logger logger;
/**
* Constructeur d'un client ou d'un serveur de chat d'après les arguments
* fournis au programme principal
* @param args les arguments fournis au programme principal en vue de
* mettre en place certaines options particulière à un client ou un serveur
* Recherche des valeurs pour {@link #port} et {@link #verbose} dans les
* chaînes de caractères fournis en arguments
*/
protected AbstractRunChat(String[] args)
{
setAttributes(args);
}
/**
* Mise en place des valeurs des attributs et parsing des arguments
* @param args les arguments fournis au programme principal en vue de
* mettre en place certaines options particulière à un client ou un serveur
* Recherche des valeurs pour {@link #port} et {@link #verbose} dans les
* chaînes de caractères fournis en arguments
*/
protected void setAttributes(String[] args)
{
/*
* On met d'abord les attributs locaux à leur valeur par défaut
*/
port = DEFAULTPORT;
verbose = false;
/*
* parsing des arguments
* -v | --verbose : si verbose affichage des messages dans la console
* sinon affichage des messages dans un fichier de log portant
* le nom de la classe qui l'instancie.log
* -p | --port : port à utiliser pour la serverSocket
*/
for (int i=0; i < args.length; i++)
{
if (args[i].startsWith("-")) // option argument
{
if (args[i].equals("--verbose") || args[i].equals("-v"))
{
System.out.println("Setting verbose on");
verbose = true;
}
if (args[i].equals("--port") || args[i].equals("-p"))
{
System.out.print("Setting port to: ");
if (i < (args.length - 1))
{
// recherche du numéro de port dans le prochain argument
Integer portInteger = readInt(args[++i]);
if (portInteger != null)
{
int readPort = portInteger.intValue();
if (readPort >= 1024)
{
port = readPort;
}
else
{
System.err.println(Failure.INVALID_PORT);
System.exit(Failure.INVALID_PORT.toInteger());
}
}
System.out.println(port);
}
else
{
System.out.println("nothing, invalid value");
}
}
}
}
/*
* Création du logger
*/
logger = null;
Class<?> runningClass = getClass();
String logFilename =
(verbose ? null : runningClass.getSimpleName() + ".log");
Logger parent = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
Level level = (verbose ? Level.ALL : Level.WARNING);
try
{
logger = LoggerFactory.getLogger(runningClass,
verbose,
logFilename,
false,
parent,
level);
}
catch (IOException ex)
{
ex.printStackTrace();
System.exit(Failure.OTHER.toInteger());
}
}
/**
* Une fois le client ou le serveur prêt, on lance son exécution
*/
protected abstract void launch();
/**
* Lecture d'un entier à partir d'une chaîne de caractères
* @param s la chaine à lire
* @return l'entier parsé dans la chaine de caractère ou bien null
* s'il s'est produit une erreur de parsing
*/
protected Integer readInt(String s)
{
try
{
Integer value = new Integer(Integer.parseInt(s));
return value;
}
catch (NumberFormatException e)
{
// System.err.println("readInt: " + s + " is not a number");
logger.warning("readInt: " + s + " is not a number");
return null;
}
}
}