Untitled

 avatar
unknown
java
a month ago
4.2 kB
6
Indexable
@Service
public class HttpClientImpl implements IScheduleHttpClient
{
    private final WebClient webClient;
    private final IStateManager stateManager;

    public HttpClientImpl(WebClient webClient, IStateManager stateManager)
    {
        this.webClient = webClient;
        this.stateManager = stateManager;
    }

    public String getInitialPage()
    {
        try
        {
            String body = webClient.get().retrieve().bodyToMono(String.class).block();

            stateManager.updateStates(body, true);
            return changeDepartment();
        }
        catch (Exception e)
        {
            stateManager.clearState();
            throw e;
        }
    }

    public String makePostRequest(Map<String, String> params)
    {
        try
        {
            String formParams = buildFormParams(params, stateManager.getEmulatedStates());
            String response = webClient.post().uri("/").header("Content-Type", "application/x-www-form-urlencoded")
                .bodyValue(formParams).retrieve().bodyToMono(String.class).block();

            if (response != null)
            {
                stateManager.updateStates(response, false);
                return response.split("\\|")[7];
            }
            return null;
        }
        catch (Exception e)
        {
            stateManager.clearState();
            throw e;
        }
    }

    private String buildFormParams(Map<String, String> baseParams, Map<String, String> stateParams)
    {
        return Stream.concat(baseParams.entrySet().stream(), stateParams.entrySet().stream()).map(
            entry -> URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8) + "=" + URLEncoder.encode(
                entry.getValue(), StandardCharsets.UTF_8)).collect(Collectors.joining("&"));
    }

    public String getDetails(String id)
    {

        Map<String, String> params = Map.ofEntries(
            Map.entry("RadScriptManager1", "RadToolTipManager1RTMPanel|RadToolTipManager1RTMPanel"),
            Map.entry("__EVENTTARGET", "RadToolTipManager1RTMPanel"), Map.entry("__EVENTARGUMENT", ""),
            Map.entry("RadToolTipManager1_ClientState",
                "{\"AjaxTargetControl\":\"{html_id}\",\"Value\":\"{html_id}\"}".replace("{html_id}", id)));

        return makePostRequest(params);
    }

    public String changeDepartment()
    {
        Map<String, String> params = Map.ofEntries(Map.entry("RadScriptManager1", "RadAjaxPanel1Panel|WydzialComboBox"),
            Map.entry("__EVENTTARGET", "WydzialComboBox"),
            Map.entry("__EVENTARGUMENT", "{\"Command\":\"Select\",\"Index\":1}"),
            Map.entry("WydzialComboBox", "Gdańsk"), Map.entry("WydzialComboBox_ClientState",
                "{\"logEntries\":[],\"value\":\"2\",\"text\":\"Gdańsk\",\"enabled\":true,\"checkedIndices\":[],\"checkedItemsTextOverflows\":false}"),
            Map.entry("__ASYNCPOST", "true"), Map.entry("RadAJAXControlID", "RadAjaxPanel1"));
        return makePostRequest(params);
    }

    public String changeDate(String targetDate)
    {
        Map<String, String> params = Map.ofEntries(Map.entry("RadScriptManager1", "RadAjaxPanel1Panel|DataPicker"),
            Map.entry("__EVENTTARGET", "DataPicker"), Map.entry("__EVENTARGUMENT", ""),
            Map.entry("DataPicker", targetDate), Map.entry("DataPicker$dateInput", targetDate),
            Map.entry("DataPicker_ClientState", ""), Map.entry("DataPicker_dateInput_ClientState", String.format(
                "{\"enabled\":true,\"emptyMessage\":\"\",\"validationText\":\"%s-00-00-00\",\"valueAsString\":\"%s-00-00-00\",\"minDateStr\":\"1980-01-01-00-00-00\",\"maxDateStr\":\"2099-12-31-00-00-00\",\"lastSetTextBoxValue\":\"%s\"}",
                targetDate, targetDate, targetDate)), Map.entry("__ASYNCPOST", "true"),
            Map.entry("RadAJAXControlID", "RadAjaxPanel1"));
        return makePostRequest(params);
    }

    public boolean checkDate(String body, String targetDate)
    {
        Document document = Jsoup.parse(body);
        Element dateElement = document.getElementById("DataPicker_dateInput");
        if (dateElement == null)
            return false;
        return !(dateElement.attr("value").equals(targetDate));
    }
}
Leave a Comment