package ru.ulstu.grant.service; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.DomNode; import com.gargoylesoftware.htmlunit.html.HtmlPage; import org.springframework.stereotype.Service; import ru.ulstu.configuration.ApplicationProperties; import ru.ulstu.grant.model.GrantDto; import ru.ulstu.grant.page.KiasPage; import ru.ulstu.user.service.UserService; import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.List; @Service public class KiasService { private final static String BASE_URL = "https://www.rfbr.ru/rffi/ru/contest_search?CONTEST_STATUS_ID=%s&CONTEST_TYPE=%s&CONTEST_YEAR=%s"; private final static String CONTEST_STATUS_ID = "1"; private final static String CONTEST_TYPE = "-1"; private final UserService userService; private final ApplicationProperties applicationProperties; public KiasService(UserService userService, ApplicationProperties applicationProperties) { this.userService = userService; this.applicationProperties = applicationProperties; } public List getNewGrantsDto() throws ParseException, IOException { Integer leaderId = userService.findOneByLoginIgnoreCase("admin").getId(); List grants = new ArrayList<>(); try (final WebClient webClient = new WebClient()) { for (Integer year : generateGrantYears()) { final HtmlPage page = webClient.getPage(String.format(BASE_URL, CONTEST_STATUS_ID, CONTEST_TYPE, year)); grants.addAll(getKiasGrants(page)); } } grants.forEach(grantDto -> grantDto.setLeaderId(leaderId)); return grants; } public List getKiasGrants(HtmlPage page) throws ParseException { List newGrants = new ArrayList<>(); KiasPage kiasPage = new KiasPage(page); do { newGrants.addAll(getGrantsFromPage(kiasPage)); } while (kiasPage.goToNextPage()); //проверка существования следующей страницы с грантами return newGrants; } private List getGrantsFromPage(KiasPage kiasPage) throws ParseException { List grants = new ArrayList<>(); for (DomNode grantElement : kiasPage.getPageOfGrants()) { if (kiasPage.isTableRowGrantLine(grantElement)) { GrantDto grantDto = new GrantDto( kiasPage.getGrantTitle(grantElement), kiasPage.parseDeadLineDate(grantElement)); grants.add(grantDto); } } return grants; } private List generateGrantYears() { return Arrays.asList(Calendar.getInstance().get(Calendar.YEAR), Calendar.getInstance().get(Calendar.YEAR) + 1); } }