Всем доброй ночи.
UPDATE: задача наконец-то решена. Действительно, процесс пересоздания стримов ломал все быстродействие. Благодаря Алексею, решение уйти от хранимого списка всех строк логов для дальнейшей работы, по сути оказалось решением самой проблемы, но вернуть стрим просто так мы не можем, поскольку, все стримы одноразовые. То есть после использования стрима нужно создать новый, а значит и сохранить его локально в переменной и дергать его по надобности мы не можем. Благо для этого есть Supplier, который может поставлять нам новый стрим для каждого нового использования, и этот саплайер мы как раз локально и сохраним.
Буду очень признателен всем, кто поможет понять, почему программа закрывается по "Time Out" на сервере.
Сначала, в LogParser конструкция, которая фильтровала даты по before была такая:
.filter(x -> ((this.getDate(x).getTime()) >= (after != null ? after.getTime() : 0)))
.filter(x -> ((this.getDate(x).getTime()) <= (before != null ? before.getTime() : new Date().getTime())))
но понятно, что это вызывала ошибку валидации, так как в логах содержатся несуществующие даты, больше текущей. Но зато, выполнение программы не оканчивалось "таймаутом", пофиксил ошибку путем вставки метода-заглушки, который вытаскивал максимальную дату из логов и по надобности подсовывал ее, если бОльшая временная граница передавалась как null и после этого программа при валидации стала падать с таймаутом, хотя у меня все отлично тестируется и заканчивается.
PS: Приходится удалять файл тестов перед отправкой на валидацию, похоже что валидатор ничего не знает про JUnit5, прикладываю его отдельно.
PSS: Только пытаюсь понять философию стримов, так что прошу сильно не бить, если что не так. Буду благодарен за любые комментарии по улучшению текущей структуры.
Всех заранее благодарю за помощь.
package com.javarush.task.task39.task3913;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
class LogParserTest {
private LogParser parser;
@BeforeEach
public void unit() {
Path path = Paths.get("D:\\TestDirectory");
this.parser = new LogParser(path);
}
@Test
void getNumberOfUniqueIPs() throws ParseException {
int count = parser.getNumberOfUniqueIPs(null, null);
Assertions.assertEquals(5, count);
DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
Date after = df.parse("30.01.2014 12:56:22");
count = parser.getNumberOfUniqueIPs(after, null);
Assertions.assertEquals(5, count);
Date before = df.parse("14.10.2021 11:38:21");
count = parser.getNumberOfUniqueIPs(after, before);
Assertions.assertEquals(3, count);
count = parser.getNumberOfUniqueIPs(null, before);
Assertions.assertEquals(3, count);
}
@Test
void getUniqueIPs() {
HashSet<String> expected = new HashSet<>();
expected.add("127.0.0.1");
expected.add("192.168.100.2");
expected.add("146.34.15.5");
expected.add("12.12.12.12");
expected.add("120.120.120.122");
Set<String> ips = parser.getUniqueIPs(null, null);
Assertions.assertEquals(expected, ips);
}
@Test
void getIPsForUser() {
final String user = "Eduard Petrovich Morozko";
final HashSet<String> expected = new HashSet<>();
expected.add("146.34.15.5");
expected.add("127.0.0.1");
final Set<String> ips = parser.getIPsForUser(user, null, null);
Assertions.assertEquals(expected, ips);
}
@Test
void getIPsForEvent() {
HashSet<String> expected = new HashSet<>();
expected.add("146.34.15.5");
Set<String> ips = parser.getIPsForEvent(Event.DOWNLOAD_PLUGIN, null, null);
Assertions.assertEquals(expected, ips);
ips = parser.getIPsForEvent(Event.WRITE_MESSAGE, null, null);
expected.clear();
expected.add("127.0.0.1");
expected.add("146.34.15.5");
Assertions.assertEquals(expected, ips);
}
@Test
void getIPsForStatus() {
final HashSet<String> expected = new HashSet<>();
expected.add("127.0.0.1");
expected.add("146.34.15.5");
final Set<String> ips = parser.getIPsForStatus(Status.FAILED, null, null);
Assertions.assertEquals(expected, ips);
}
}
package com.javarush.task.task39.task3913;
import java.nio.file.Paths;
import java.util.Date;
public class Solution {
public static void main(String[] args) {
LogParser logParser = new LogParser(Paths.get("D:\\TestDirectory"));
System.out.println(logParser.getNumberOfUniqueIPs(null, new Date()));
}
}