Переделанный вариант
public class LogParser implements IPQuery {
private Path dirLogs;
private List<Log> dataBase;
public LogParser(Path dirLogs) {
this.dirLogs = dirLogs;
dataBase = new ArrayList<>();
fillDataBase();
}
public Path getDirLogs() {
return dirLogs;
}
@Override
public int getNumberOfUniqueIPs(Date after, Date before) {
return getUniqueIPs(after, before).size();
}
@Override
public Set<String> getUniqueIPs(Date after, Date before) {
Set<String> ipsUnique = new HashSet<>();
List<Log> dataBaseFromDiapasonDates = getDataBaseFromDiapasonDates(after, before);
for (Log log : dataBaseFromDiapasonDates) {
ipsUnique.add(log.ip);
}
return ipsUnique;
}
@Override
public Set<String> getIPsForUser(String user, Date after, Date before) {
Set<String> ipsForUsers = new HashSet<>();
List<Log> dataBaseFromDiapasonDates = getDataBaseFromDiapasonDates(after, before);
for (Log log : dataBaseFromDiapasonDates) {
if (user.equals(log.userName)) {
ipsForUsers.add(log.ip);
}
}
return ipsForUsers;
}
@Override
public Set<String> getIPsForEvent(Event event, Date after, Date before) {
Set<String> ipsForEvents = new HashSet<>();
List<Log> dataBaseFromDiapasonDates = getDataBaseFromDiapasonDates(after, before);
for (Log log : dataBaseFromDiapasonDates) {
if (event.equals(log.event)) {
ipsForEvents.add(log.ip);
}
}
return ipsForEvents;
}
@Override
public Set<String> getIPsForStatus(Status status, Date after, Date before) {
Set<String> ipsForStatus = new HashSet<>();
List<Log> dataBaseFromDiapasonDates = getDataBaseFromDiapasonDates(after, before);
for (Log log : dataBaseFromDiapasonDates) {
if (status.equals(log.status)) {
ipsForStatus.add(log.ip);
}
}
return ipsForStatus;
}
private List<String> readDirLogsFile() {
List<String> list = new ArrayList<>();
if (Files.isDirectory(dirLogs)) {
try (DirectoryStream<Path> filesLogs = Files.newDirectoryStream(dirLogs)) {
//File[] filesLogs = new File(dirLogs.toString()).listFiles();
for (Path fileLog : filesLogs) {
list = Files.readAllLines(fileLog);
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
return list;
}
private void fillDataBase() {
List<String> listLogs = readDirLogsFile();
for (String strLog : listLogs) {
Log log = new Log();
//String[] entry = strLog.split("\t");
String ip = null;
String userName = null;
String date = null;
String event = null;
String numberTask = null;
String status = null;
Pattern patternIp = Pattern.compile("(\\b([0-9]{1,3}\\.){3}[0-9]{1,3}\\b)\\t");
Matcher matcherIp = patternIp.matcher(strLog);
while (matcherIp.find()) {
ip = matcherIp.group().trim();
}
//ip = entry[0];
log.ip = ip;
String regexUserName = "\\t((\\b[A-Z]{1}[a-z\\s]+\\b)+)\\t";
Pattern patternUserName = Pattern.compile(regexUserName);
Matcher matcherUserName = patternUserName.matcher(strLog);
while (matcherUserName.find()) {
userName = matcherUserName.group().trim();
}
//userName = entry[1];
log.userName = userName;
String regexDate = "\\t(\\b([0-9]{1,2}\\.){2}[0-9]{4}\\b)\\s(\\b([0-9]{1,2}\\:){2}[0-9]{1,2}\\b)\\t";
Pattern patternDate = Pattern.compile(regexDate);
Matcher matcherDate = patternDate.matcher(strLog);
while (matcherDate.find()) {
date = matcherDate.group().trim();
}
//date = entry[2];
log.date = convertStringToDate(date);
/*if (entry[3].contains(" ")) {
String[] eventAndNumberTask = entry[3].split(" ");
event = eventAndNumberTask[0];
log.event = Event.valueOf(event);
numberTask = eventAndNumberTask[1];
log.numberTask = Integer.parseInt(numberTask);
}
else {
event = entry[3];
log.event = Event.valueOf(event);
log.numberTask = -1;
}*/
Event eventToAdd = null;
for (Event valueEvent : Event.values()) {
Pattern patternEvent = Pattern.compile(valueEvent.toString());
Matcher matcherEvent = patternEvent.matcher(strLog);
while (matcherEvent.find()) {
event = matcherEvent.group().trim();
}
if (event != null) {
if (event.equals(Event.SOLVE_TASK.toString()) ||
event.equals(Event.DONE_TASK.toString())) {
Pattern patternNumberTask = Pattern.compile("\\s(\\d+)\\t");
Matcher matcherNumberTask = patternNumberTask.matcher(strLog);
while (matcherNumberTask.find()) {
numberTask = matcherNumberTask.group().trim();
}
}
eventToAdd = valueEvent;
break;
}
}
log.event = eventToAdd;
if (numberTask != null) {
log.numberTask = Integer.parseInt(numberTask);
} else {
log.numberTask = -1;
}
/*status = entry[4];
log.status = Status.valueOf(status);*/
Status statusToAdd = null;
for (Status valueStatus : Status.values()) {
Pattern patternStatus = Pattern.compile(valueStatus.toString());
Matcher matcherStatus = patternStatus.matcher(strLog);
while (matcherStatus.find()) {
status = matcherStatus.group().trim();
}
if (status != null) {
statusToAdd = valueStatus;
break;
}
}
log.status = statusToAdd;
dataBase.add(log);
}
}
private Date convertStringToDate(String dateStr) {
Date date = null;
SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss", Locale.ENGLISH);
try {
date = formatter.parse(dateStr);
} catch (ParseException e) {
throw new RuntimeException(e);
}
return date;
}
private List<Log> getDataBaseFromDiapasonDates(Date after, Date before) {
List<Log> dataBaseFromDiapasonDates = new ArrayList<>();
if (after == null && before == null) {
dataBaseFromDiapasonDates = new ArrayList<>(dataBase);
} else if (after != null && before != null) {
for (Log log : dataBase) {
Date date = log.date;
if ((date.after(after) && date.before(before))
|| date.equals(after) || date.equals(before)) {
dataBaseFromDiapasonDates.add(log);
}
}
} else if (after == null && before != null) {
for (Log log : dataBase) {
Date date = log.date;
if (date.before(before) || date.equals(before)) {
dataBaseFromDiapasonDates.add(log);
}
}
} else if (after != null && before == null) {
for (Log log : dataBase) {
Date date = log.date;
if (date.after(after) || date.equals(after)) {
dataBaseFromDiapasonDates.add(log);
}
}
}
return dataBaseFromDiapasonDates;
}
public void printDataBase() {
for (Log log : dataBase) {
System.out.println(log);
}
}
private class Log {
String ip;
String userName;
Date date;
Event event;
Integer numberTask;
Status status;
@Override
public String toString() {
SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss", Locale.ENGLISH);
String dateStr = formatter.format(date);
String eventStr = event.toString();
String numberTaskStr = (numberTask != -1) ? Integer.toString(numberTask) : null;
String statusStr = status.toString();
return String.format("%s - %s - %s - %s - %s - %s",
ip, userName, dateStr, eventStr, numberTaskStr, statusStr);
}
}
}
package com.javarush.task.task39.task3913;
public enum Event {
LOGIN,
DOWNLOAD_PLUGIN,
WRITE_MESSAGE,
SOLVE_TASK,
DONE_TASK
}