level39.lesson09.big01 Задание 1

Помогите понять, что не нравится валидатору. Спасибо!

Задание 1

Сегодня мы напишем парсер логов.
Лог файл имеет следующий формат:
ip username date event status
Где:
ip — ip адрес с которого пользователь произвел событие.
user — имя пользователя (одно или несколько слов разделенные пробелами).
date — дата события в формате day.month.year hour:minute:second
event — одно из событий:
LOGIN — пользователь залогинился,
DOWNLOAD_PLUGIN — пользователь скачал плагин,
WRITE_MESSAGE — пользователь отправил сообщение,
SOLVE_TASK — пользователь попытался решить задачу,
DONE_TASK — пользователь решил задачу.
Для событий SOLVE_TASK и DONE_TASK существует дополнительный параметр,
который указывается через пробел, это номер задачи.
status — статус:
OK — событие выполнилось успешно,
FAILED — событие не выполнилось,
ERROR — произошла ошибка.
Пример строки из лог файла:
«146.34.15.5 Eduard Petrovich Morozko 05.01.2021 20:22:55 DONE_TASK 48 FAILED».
Записи внутри лог файла не обязательно упорядочены по дате, события могли
произойти и быть записаны в лог в разной последовательности.

Класс, который будет отвечать за парсинг логов называется LogParser.
1.1. Добавь в класс LogParser конструктор с парметром Path logDir, где logDir — директория с логами (логов может быть несколько, все они должны иметь расширение log).
1.2. Реализуй интерфейс IPQuery у класса LogParser:
1.2.1. Метод getNumberOfUniqueIPs(Date after, Date before) должен возвращать
количество уникальных IP адресов за выбранный период. Здесь и далее,
если в методе есть параметры Date after и Date before, то нужно возвратить
данные касающиеся только данного периода (включая даты after и before).
Если параметр after равен null, то нужно обработать все записи, у которых
дата меньше или равна before.
Если параметр before равен null, то нужно обработать все записи, у которых
дата больше или равна after.
Если и after, и before равны null, то нужно обработать абсолютно все записи
(без фильтрации по дате).
1.2.2. Метод getUniqueIPs() должен возвращать множество, содержащее все
неповторяющиеся IP. Тип в котором будем хранить IP будет String.
1.2.3. Метод getIPsForUser() должен возвращать IP, с которых работал
переданный пользователь.
1.2.4. Метод getIPsForEvent() должен возвращать IP, с которых было произведено
переданное событие.
1.2.5. Метод getIPsForStatus() должен возвращать IP, события с которых
закончилось переданным статусом.

Реализацию метода main() можешь менять по своему усмотрению.

package com.javarush.test.level39.lesson09.big01;

import com.javarush.test.level39.lesson09.big01.query.IPQuery;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class LogParser implements IPQuery
{
    private Path logDir;

    public LogParser(Path logDir)
    {
        this.logDir = logDir;
    }

    @Override
    public int getNumberOfUniqueIPs(Date after, Date before)
    {
        return getUniqueIPs(after, before).size();
    }

    @Override
    public Set<String> getUniqueIPs(Date after, Date before)
    {
        Set<String> resultSet = new HashSet<>();
        List<String> list = getLinesBetweenDates(after, before);
        for (String str : list)
            resultSet.add(str.split("\\t")[0]);
        return resultSet;
    }

    @Override
    public Set<String> getIPsForUser(String user, Date after, Date before)
    {
        Set<String> resultSet = new HashSet<>();
        List<String> list = getLinesBetweenDates(after, before);
        for (String str : list)
        {
            String[] values = str.split("\\t");
            String userFromFile = values[1];
            if (userFromFile.equals(user))
                resultSet.add(values[0]);
        }
        return resultSet;
    }

    @Override
    public Set<String> getIPsForEvent(Event event, Date after, Date before)
    {
        Set<String> resultSet = new HashSet<>();
        List<String> list = getLinesBetweenDates(after, before);
        for (String str : list)
        {
            String[] values = str.split("\\t");
            String eventFromFile;
            if (values[3].contains(" "))
                eventFromFile = values[3].split(" ")[0];
            else eventFromFile = values[3];
            if (Event.valueOf(eventFromFile).equals(event))
                resultSet.add(values[0]);
        }
        return resultSet;
    }

    @Override
    public Set<String> getIPsForStatus(Status status, Date after, Date before)
    {
        Set<String> resultSet = new HashSet<>();
        List<String> list = getLinesBetweenDates(after, before);
        for (String str : list)
        {
            str = str.trim();
            String[] values = str.split("\\t");
            if (Status.valueOf(values[values.length - 1]).equals(status))
                resultSet.add(values[0]);
        }
        return resultSet;
    }

    private List<String> getLinesFromPath()
    {
        List<String> resultList = null;
        try
        {
            if (logDir != null)
            {
                File[] files = logDir.toFile().listFiles();
                if (files != null)
                {
                    for (File file : files)
                    {
                        resultList = Files.readAllLines(file.toPath(), Charset.defaultCharset());
                    }
                }
            }
        }
        catch (IOException e)
        {
        }
        return resultList;
    }

    private Date getDateFromString(String source)
    {
        Date date = null;
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
        try
        {
            date = dateFormat.parse(source);
        }
        catch (ParseException e)
        {
        }
        return date;
    }

    private List<String> getLinesBetweenDates(Date after, Date before)
    {
        List<String> list = getLinesFromPath();
        List<String> resultList = new ArrayList<>();
        if (list != null)
        {
            if (after == null && before == null)
            {
                for (String line : list)
                    resultList.add(line);
            } else if (after == null)
            {
                for (String line : list)
                {
                    String[] values = line.split("\\t");
                    Date dateFromLine = getDateFromString(values[2]);
                    if (dateFromLine != null && dateFromLine.compareTo(before) <= 0)
                        resultList.add(line);
                }
            } else if (before == null)
            {
                for (String line : list)
                {
                    String[] values = line.split("\\t");
                    Date dateFromLine = getDateFromString(values[2]);
                    if (dateFromLine != null && dateFromLine.compareTo(after) >= 0)
                        resultList.add(line);
                }
            } else
            {
                for (String line : list)
                {
                    String[] values = line.split("\\t");
                    Date dateFromLine = getDateFromString(values[2]);
                    if (dateFromLine != null && dateFromLine.compareTo(after) >= 0 && dateFromLine.compareTo(before) <= 0)
                        resultList.add(line);
                }
            }
        }
        return resultList;
    }


}

1 комментарий

realcorwin
В качестве проверки:

public class Solution {
    public static void main(String[] args) {
        LogParser logParser = new LogParser(Paths.get("f:/JavaRush/JavaRushHomeWork/src/com/javarush/test/level39/lesson09/big01/logs/"));
        System.out.println(logParser.getNumberOfUniqueIPs(null, new Date()));

        System.out.println(logParser.getUniqueIPs(null, null));

        System.out.println(logParser.getIPsForUser("Eduard Petrovich Morozko", null, null));

        System.out.println(logParser.getIPsForEvent(Event.DONE_TASK, null, null));

        System.out.println(logParser.getIPsForStatus(Status.OK, null, null));
    }
}


Файл example.log:

127.0.0.1	Amigo	30.08.2012 16:08:13	LOGIN	OK
192.168.100.2	Vasya Pupkin	30.08.2012 16:08:40	DONE_TASK 15	OK
146.34.15.5	Eduard Petrovich Morozko	13.09.2013 5:04:50	DOWNLOAD_PLUGIN	OK
127.0.0.1	Eduard Petrovich Morozko	11.12.2013 10:11:12	WRITE_MESSAGE	FAILED
146.34.15.5	Eduard Petrovich Morozko	12.12.2013 21:56:30	WRITE_MESSAGE	OK
146.34.15.5	Eduard Petrovich Morozko	03.01.2014 03:45:23	LOGIN	OK
192.168.100.2	Vasya Pupkin	30.01.2014 12:56:22	SOLVE_TASK 18	ERROR
127.0.0.1	Vasya Pupkin	14.11.2015 07:08:01	WRITE_MESSAGE	OK
192.168.100.2	Vasya Pupkin	19.03.2016 00:00:00	SOLVE_TASK 1	OK
146.34.15.5	Eduard Petrovich Morozko	05.01.2021 20:22:55	DONE_TASK 48	FAILED
127.0.0.1	Vasya Pupkin	14.10.2021 11:38:21	LOGIN	OK
12.12.12.12	Amigo	21.10.2021 19:45:25	SOLVE_TASK 18	OK


Вывод:

3
[146.34.15.5, 192.168.100.2, 12.12.12.12, 127.0.0.1]
[146.34.15.5, 127.0.0.1]
[146.34.15.5, 192.168.100.2]
[146.34.15.5, 192.168.100.2, 12.12.12.12, 127.0.0.1]
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.