import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; public class UpdatePageValues { private List aspNetHidden; private long pageIndex; private long maxPageIndex; private UpdatePageTableValues pageTableValues; public UpdatePageValues(Elements elements) { pageTableValues = new UpdatePageTableValues(elements); // // gets hidden input values (used for accessing the next page) // this.aspNetHidden = elements .parallelStream() .filter(element -> element.tagName().equals("input") && element.attr("type") .equals("hidden")) .collect(Collectors.toList()); // // get the span that contains the page index information. In theory this // span should always be inside the DOM but just in case we are going to use Optional. // Optional pageIndexElement = elements .parallelStream() .filter(element -> element.tagName().equals("span") && element.attr("id").equals("ctl00_catalogBody_searchDuration")) .findFirst(); // // if the span element containing the page index information is present then // can start filling in our classes private members. // try { pageIndexElement.ifPresentOrElse(element -> { var values = element.text().split(" "); this.pageIndex = Integer.parseInt(values[6]); this.maxPageIndex = Integer.parseInt(values[8].replace(")", "")); }, () -> { this.pageIndex = 0; this.maxPageIndex = 0; }); } catch (Exception e) { System.out.println("[!] failed to parse index, this can be because there is no span containing index information on this page!"); e.printStackTrace(); } } public boolean hasNextPage() { // only valid if page index and max page index are: // 1.) both not 0 // 2.) are not the same value (meaning there is not next page) return !((pageIndex != 0 && maxPageIndex != 0) && pageIndex == maxPageIndex); } public long getPageIndex() { return pageIndex; } public long getMaxPageIndex() { return maxPageIndex; } public Map getAspNetHiddenUrlEncoded() { var aspNetHeaderMap = new HashMap(); aspNetHidden.parallelStream().forEach(element -> { // replace event with new page event if(element.attr("name").equals("__EVENTTARGET")) { aspNetHeaderMap.put( element.attr("id"), "ctl00$catalogBody$nextPageLinkText"); } else { aspNetHeaderMap.put( element.attr("id"), element.attr("value")); } }); return aspNetHeaderMap; } public UpdatePageTableValues getPageTableValues() { return pageTableValues; } }