Twilio | Hackerrank Rest API | Java

Invoke Rest API with paginated response & calculate average pulse for given doctor.id, diagnosis.name from response.

import java.io.*;
import java.util.*;
import java.util.stream.*;

// Copy-Paste these 3 imports
import com.google.gson.*;
import java.net.*;
import javax.net.ssl.*;

public class Driver {
    public static void main(String[] args) {
        System.out.println(Result.invoke(2, "Pulmonary embolism"));
    }
}

class Result {

    class Data {
        Diagnosis diagnosis;
        Doctor doctor;
        Vitals vitals;
    }

    class Doctor {
        int id;
    }

    class Vitals {
        int pulse;
    }

    class Diagnosis {
        String name;
    }

    // create a class to deserialize response
    class ResponseData extends HackerRankAPIInvoker.Response<Data> {}

    public static int invoke(int doctorId, String diagnosisName) {
        return HackerRankAPIInvoker.invokeAPI("/medical_records?page=%s", ResponseData.class)
                .filter(data -> data.doctor.id == doctorId && data.diagnosis.name.equals(diagnosisName))
                .mapToInt(data -> data.vitals.pulse)
                .average()
                .stream()
                .mapToLong(Math::round)
                .mapToInt(e -> (int) e)
                .findAny()
                .orElse(0);
    }
}

// Copy-Paste this class
class HackerRankAPIInvoker {
    private static final String BASE_URL = "https://jsonmock.hackerrank.com/api";

    public static abstract class Response<Data> {
        private int total_pages;

        private List<Data> data;

        public int getTotalPages() {
            return total_pages;
        }

        public List<Data> getData() {
            return data;
        }
    }

    public static <Data> Stream<Data> invokeAPI(
            final String url,
            final Class<? extends Response<Data>> clazz) {
        final Response firstPageResponse = HttpAPIInvoker.invoke(String.format(BASE_URL + url, 1), clazz);
        return Stream.concat(Stream.of(firstPageResponse), IntStream.rangeClosed(2, firstPageResponse.getTotalPages())
                        .parallel()
                        .mapToObj(i -> String.format(BASE_URL + url, i))
                        .map(uri -> HttpAPIInvoker.invoke(uri, clazz)))
                .map(Response::getData)
                .flatMap(List::stream);
    }
}

// Copy-Paste this class
class HttpAPIInvoker {
    private static final Gson GSON = new Gson();

    public static <Response> Response invoke(final String url, final Class<Response> clazz) {
        final String finalUrl = url.replace(" ", "%20");
        final StringBuilder responseBuilder = new StringBuilder();
        try {
            final HttpsURLConnection connection = (HttpsURLConnection) new URL(finalUrl).openConnection();
            connection.getResponseCode();
            try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
                String l;
                while ((l = bufferedReader.readLine()) != null)
                    responseBuilder.append(l);
            }
            connection.disconnect();
        } catch (final Exception ex) {
            ex.printStackTrace();
        }
        return GSON.fromJson(responseBuilder.toString(), clazz);
    }
}
Comments (3)