All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.pcloud.networking.api.InterceptingResponseAdapter Maven / Gradle / Ivy

package com.pcloud.networking.api;

import com.pcloud.networking.client.Response;
import com.pcloud.networking.protocol.ProtocolReader;

import java.io.IOException;
import java.util.Collection;

abstract class InterceptingResponseAdapter implements ResponseAdapter {

    private final Collection interceptors;
    private final boolean responsePeekingRequired;

    InterceptingResponseAdapter(Class type, Collection interceptors) {
        this.interceptors = interceptors;
        this.responsePeekingRequired = !ApiResponse.class.isAssignableFrom(type);
    }

    @Override
    public T adapt(Response response) throws IOException {
        if (!interceptors.isEmpty()) {
            final T result;
            final ApiResponse interceptorTarget;

            if (responsePeekingRequired) {
                interceptorTarget = peekApiResponse(response);
                result = doAdapt(response);
            } else {
                result = doAdapt(response);
                interceptorTarget = (ApiResponse) result;
            }

            callInterceptors(response, interceptorTarget);
            return result;
        } else {
            return doAdapt(response);
        }
    }

    protected abstract T doAdapt(Response response) throws IOException;

    private void callInterceptors(Response response, ApiResponse interceptorTarget) {
        for (ResponseInterceptor interceptor : interceptors) {
            try {
                interceptor.intercept(interceptorTarget);
            } catch (Exception e) {
                throw new RuntimeException(
                        String.format("Error while calling ResponseInterceptor of type '%s' for '%s' call.",
                                interceptor.getClass(), response.request().methodName()), e
                );
            }
        }
    }

    private ApiResponse peekApiResponse(Response response) throws IOException {
        final ProtocolReader peekingReader = response.responseBody().reader().newPeekingReader();

        long result = -1L;
        String message = null;

        peekingReader.beginObject();
        while_loop:
        while (peekingReader.hasNext()) {
            switch (peekingReader.readString()) {
                case "result": {
                    result = peekingReader.readNumber();
                    if (result == ApiResponse.RESULT_SUCCESS) {
                        break while_loop;
                    }
                    break;
                }
                case "message": {
                    message = peekingReader.readString();
                    if (result != -1) {
                        break while_loop;
                    }
                    break;
                }
                default:
                    peekingReader.skipValue();
                    break;
            }
        }
        if (result == -1L) {
            throw new IOException("Response did not contain 'result' value, call name=" + response.request().methodName());
        }

        return new ApiResponse(result, message);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy