Переделанный вариант 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); } } }