-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLecture.h
executable file
·280 lines (232 loc) · 8.34 KB
/
Lecture.h
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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
/******************************************************************************
Lecture - Lecture d'un fichier de Log
debut : 2019-01-17
copyright : (C) 2018 par K. BOUZID et P-Y. GENEST
e-mail : kenza.bouzid@insa-lyon.fr
pierre-yves.genest@insa-lyon.fr
******************************************************************************/
//---------- Interface de la classe <Lecture> ----------
#ifndef LECTURE_H
#define LECTURE_H
////////////////////////////////////////////////////////// Interfaces utilisees
#include <vector>
#include <unordered_map>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
//-----------------------------------------------------------------------------
// Role de la classe <Lecture>
// Permet de lire un fichier de Log et de creer une serie d'objet relies
// aux logs (objets de type R) en retenant que les informations
// utiles aux usages de l'application
// T doit correspondre au type regroupaant les données utiles à l'application
// R doit avoir un constructeur prenant en parametre un
// vector<string>, qui contient toutes les informations du Log.
// R doit avoir une methode permettant de generer une cle (GetKey)
// La gestion du flux d'entree (ouverture, fermeture) est a la gestion de
// l'appelant !!
//
//-----------------------------------------------------------------------------
template <typename T , typename R >
class Lecture
{
//////////////////////////////////////////////////////////////////////// PUBLIC
public :
//----------------------------------------------- Methodes publiques --
unordered_map <T , unsigned int> LectureLog ( int option , Date heure );
// Mode d'emploi :
// Lit tous les Logs contenus dans le flux d'entree. Si une erreur est
// rencontree, annule toute la lecture et renvoie une map vide.
// option : l'otion spécifiée par l'utilisateur
// heure : l'heure qui définie le crénaux de sélection
// retour : une table de hachage contenant tous les KeyLogs (clé de la map)
// au format specifie par l'utilisateur et leurs cardinalités respectives
// Contrat :
// Aucun contrat.
static void ErreurLecture();
// Mode d'emploi :
// Permet d'arreter l'execution du programme si une erreur de lecture du
// Log est detectee.
// Contrat :
// Aucun contrat.
//------------------------------------------- Surcharge d'operateurs --
Lecture & operator = ( const Lecture & lecture );
// Mode d'emploi :
// Operateur d'affectation de la classe Lecture.
// lecture : l'objet a copier.
// retour : reference sur l'objet courant, qui a ete affecte.
// Contrat :
// Aucun contrat.
//-------------------------------------- Constructeurs - Destructeur --
Lecture ( istream * lEntree );
// Mode d'emploi :
// Constructeur de la classe Lecture.
// lEntree : pointeur vers le flux utilise pour la lecture des Logs. Les
// verifications d'ouverture doivent avoir ete effectuees.
// La destruction du flux d'entree est a la charge de l'appelant !!!
// Contrat :
// Aucun contrat.
Lecture ( const Lecture & lecture );
// Mode d'emploi :
// Constructeur de copie de la classe Lecture;
// Contrat :
// Aucun contrat.
virtual ~Lecture ();
// Mode d'emploi :
// Destructeur de la classe Lecture.
// Contrat :
// Aucun contrat.
///////////////////////////////////////////////////////////////////////// PRIVE
protected :
//----------------------------------------------- Methodes protegees --
vector < string > decoupageInformationsLog ();
// Mode d'emploi :
// Lit une ligne du flux d'entree, et decoupe les informations importantes
// dans un vector.
// retour : le tableau qui contient le dcoupage.
// Contrat :
// Aucun contrat.
//----------------------------------------------- Attributs proteges --
istream * entree; // Flux d'entree qui contient tous les Logs a lire.
};
//-------------------------- Autres definitions dependantes de Lecture --------
//////////////////////////////////////////////////////////////////////// PUBLIC
//------------------------------------------------------- Methodes publiques --
template <typename T , typename R >
void Lecture<T,R>::ErreurLecture()
{
cerr << "Le fichier de logs n'a pas le bon format ! Operation annulee" << endl;
exit(-1);
}//--- Fin de ErreurLecture
template <typename T , typename R >
unordered_map <T , unsigned int> Lecture<T,R>::LectureLog (int option , Date d )
{
unordered_map<T,unsigned int> tableLogs;
vector <string> informationsLog;
bool bitE = (option>>1) & 1 ;
bool bitT = option & 1 ;
if ( entree == nullptr )
// Cas ou l'entree n'a pas ete renseignee comme il faut.
{
return tableLogs;
}
while ( entree -> good() )
{
informationsLog = decoupageInformationsLog ();
if ( informationsLog.size() == 9 )
{
if( informationsLog[5].compare("200") != 0 )
// On ne garde que les logs qui ont aboutis : status = 200
{
continue;
}
R log(informationsLog);
if (bitE && !log.contenuIndispensable)
{
continue;
}
if (bitT && (log.date < d || log.date >= (d+1) ))
{
continue;
}
#ifdef MAP
cout << log << endl;
#endif
tableLogs[log.GetKey()]++;
}
else if( !informationsLog.empty() ) //On empeche l'arret en cas de ligne vide
// Mauvaise lecture, donc on annule tout
{
ErreurLecture();
return unordered_map <T , unsigned int>();
}
}
return tableLogs;
}//--- Fin de LectureLog
//--------------------------------------------------- Surcharge d'operateurs --
//---------------------------------------------- Constructeurs - Destructeur --
template <typename T , typename R >
Lecture<T,R>::Lecture ( istream * lEntree ) : entree ( lEntree )
{
#ifdef MAP
cout << "Construction Lecture" << endl;
#endif
}//--- Fin de Lecture
template < typename T , typename R >
Lecture<T,R>::Lecture ( const Lecture & lecture ) : entree ( lecture.entree )
{
#ifdef MAP
cout << "Construction Lecture par copie" << endl;
#endif
}//--- Fin de Lecture
template < typename T , typename R >
Lecture<T,R>::~Lecture ()
{
#ifdef MAP
cout << "Destruction Lecture" << endl;
#endif
}//-- Fin de ~Lecture
///////////////////////////////////////////////////////////////////////// PRIVE
//------------------------------------------------------- Methodes protegees --
template < typename T , typename R >
vector<string> Lecture<T,R>::decoupageInformationsLog ()
{
string informations;
getline(*entree, informations, '\n');
vector<string> decoupage;
// Adresse IP
string::iterator deb = informations.begin();
string::iterator fin = find(deb, informations.end(), ' ');
if(fin >= informations.end()) return decoupage;
decoupage.emplace_back(deb, fin);
// user logname
deb = ++fin;
fin = find(deb, informations.end(), ' ');
if(fin >= informations.end()) return decoupage;
decoupage.emplace_back(deb, fin);
// authenticated user
deb = ++fin;
fin = find(deb, informations.end(), ' ');
if(fin >= informations.end()) return decoupage;
decoupage.emplace_back(deb, fin);
// date
deb = ++find(fin, informations.end(), '['); //pour sauter ' ['
if(deb >= informations.end()) return decoupage;
fin = find(deb, informations.end(), ']');
if(fin >= informations.end()) return decoupage;
decoupage.emplace_back(deb, fin);
// cible
deb = ++find(fin, informations.end(), '"'); //pour sauter '] "'
if(deb >= informations.end()) return decoupage;
fin = find(deb, informations.end(), '"');
if(fin >= informations.end()) return decoupage;
decoupage.emplace_back(deb, fin);
// status
deb = fin + 2; //pour sauter '" '
fin = find(deb, informations.end(), ' ');
if(fin >= informations.end()) return decoupage;
decoupage.emplace_back(deb, fin);
// quantite de donnees
deb = ++fin;
fin = find(deb, informations.end(), ' ');
if(fin >= informations.end()) return decoupage;
decoupage.emplace_back(deb, fin);
// referer
deb = ++find(fin, informations.end(), '"'); //pour sauter ' "'
if(deb >= informations.end()) return decoupage;
fin = find(deb, informations.end(), '"');
if(fin >= informations.end()) return decoupage;
decoupage.emplace_back(deb, fin);
// client navigateur
deb = ++find(fin, informations.end(), '"'); //pour sauter '" "'
if(deb >= informations.end()) return decoupage;
fin = find(deb, informations.end(), '"');
if(fin >= informations.end()) return decoupage;
decoupage.emplace_back(deb, fin);
// Autres informations
deb = ++fin;
if(deb >= informations.end()-1) return decoupage; // Bonne situation
return decoupage;
}//--- Fin de decoupageInformationLog
#endif // ifndef LECTURE_H