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

com.github.davidmoten.odata.client.CustomRequest Maven / Gradle / Ivy

The newest version!
package com.github.davidmoten.odata.client;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URLEncodedUtils;

import com.github.davidmoten.odata.client.internal.RequestHelper;

public final class CustomRequest {

    private final Context context;
    private final boolean relativeUrls;

    public CustomRequest(Context context, boolean relativeUrls) {
        this.context = context;
        this.relativeUrls = relativeUrls;
    }
    
    private String toAbsoluteUrl(String url) {
        if (relativeUrls) {
            if (url.startsWith("https://")) {
                return url;
            } else {
                String base = context.service().getBasePath().toUrl();
                String a;
                if (base.endsWith("/")) {
                    a = base;
                } else {
                    a = base + "/";
                }
                String b;
                if (url.startsWith("/")) {
                    b = url.substring(1);
                } else {
                    b = url;
                }
                return a + b;
            }
        } else {
            return url;
        }
    }
    
    public CustomRequest withRelativeUrls() {
        return new CustomRequest(context, true);
    }
    
    public CustomRequest withRelativeUrls(boolean value) {
        return new CustomRequest(context, value);
    }
    
    public String getString(String url, RequestOptions options, RequestHeader... headers) {
        return context.service().getStringUtf8(toAbsoluteUrl(url), Arrays.asList(headers), options);
    }

    public InputStream getStream(String url, RequestOptions options, RequestHeader... headers) {
        return context.service().getStream(toAbsoluteUrl(url), Arrays.asList(headers), options);
    }

    public  T get(String url, Class responseCls, HttpRequestOptions options,
            RequestHeader... headers) {
        UrlInfo info = getInfo(context, toAbsoluteUrl(url), headers, options);
        return RequestHelper.get(info.contextPath, responseCls, info);
    }

    public  void post(String url, Class contentClass, T content,
            HttpRequestOptions options, RequestHeader... headers) {
        UrlInfo info = getInfo(context, toAbsoluteUrl(url), headers, options);
        RequestHelper.post(content, info.contextPath, contentClass, info);
    }
    
    public  Optional submit(String url, Object content, Class responseClass,
            HttpRequestOptions options, RequestHeader... headers) {
        UrlInfo info = getInfo(context, toAbsoluteUrl(url), headers, options);
        return RequestHelper.postAny(content, info.contextPath, responseClass, info);
    }
    
    public  Optional submit(HttpMethod method, String url, Object content, Class responseClass,
            HttpRequestOptions options, RequestHeader... headers) {
        UrlInfo info = getInfo(context, toAbsoluteUrl(url), headers, options);
        return RequestHelper.submitAny(method, content, info.contextPath, responseClass, info);
    }

    public  Optional post(String url, Object content, Class responseClass,
            HttpRequestOptions options, RequestHeader... headers) {
        return submit(HttpMethod.POST, url, content, responseClass, options, headers);
    }
    
    public  Optional put(String url, Object content, Class responseClass,
            HttpRequestOptions options, RequestHeader... headers) {
        return submit(HttpMethod.PUT, url, content, responseClass, options, headers);
    }
    
    public  Optional patch(String url, Object content, Class responseClass,
            HttpRequestOptions options, RequestHeader... headers) {
        return submit(HttpMethod.PATCH, url, content, responseClass, options, headers);
    }

    public void postString(String url, String content, HttpRequestOptions options,
            RequestHeader... headers) {
        submitString(HttpMethod.POST, url, content, options, headers);
    }

    public String postStringReturnsString(String url, String content, RequestOptions options,
            RequestHeader... headers) {
        return submitStringReturnsString(HttpMethod.POST, url, content, options, headers);
    }
    
    public void patchString(String url, String content, HttpRequestOptions options,
            RequestHeader... headers) {
        submitString(HttpMethod.PATCH, url, content, options, headers);
    }

    public String patchStringReturnsString(String url, String content, HttpRequestOptions options,
            RequestHeader... headers) {
        return submitStringReturnsString(HttpMethod.PATCH, url, content, options, headers);
    }

    public void putString(String url, String content, HttpRequestOptions options,
            RequestHeader... headers) {
        submitString(HttpMethod.PUT, url, content, options, headers);
    }

    public String putStringReturnsString(String url, String content, HttpRequestOptions options,
            RequestHeader... headers) {
        return submitStringReturnsString(HttpMethod.PUT, url, content, options, headers);
    }

    public void submitString(HttpMethod method, String url, String content, HttpRequestOptions options,
            RequestHeader... headers) {
        String absoluteUrl = toAbsoluteUrl(url);
        UrlInfo info = getInfo(context, absoluteUrl, headers, options);
        context.service().submit(method, absoluteUrl, info.requestHeaders, content, options);
    }
    
    public String submitInputStreamReturnsString(HttpMethod method, String url, InputStream content, int length, HttpRequestOptions options,
            RequestHeader... headers) {
        String absoluteUrl = toAbsoluteUrl(url);
        UrlInfo info = getInfo(context, absoluteUrl, headers, options);
        HttpResponse response = context.service().submit(method, absoluteUrl, info.requestHeaders, content, length,
                options);
        RequestHelper.checkResponseCodeOk(info.contextPath, response);
        return response.getText();
    }
    
    public String submitBytesReturnsString(HttpMethod method, String url, byte[] content, HttpRequestOptions options,
            RequestHeader... headers) {
        try (InputStream in = new ByteArrayInputStream(content)) {
            return submitInputStreamReturnsString(method, url, in, content.length, options, headers);
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }

    public String submitStringReturnsString(HttpMethod method, String url, String content, HttpRequestOptions options,
            RequestHeader... headers) {
        return submitBytesReturnsString(method, url, content.getBytes(StandardCharsets.UTF_8), options, headers);
    }
    
    private static UrlInfo getInfo(Context context, String url, RequestHeader[] requestHeaders,
            HttpRequestOptions options) {
        final String urlPath;
        final String urlQuery;
        int i = url.indexOf('?');
        if (i == -1) {
            urlPath = url;
            urlQuery = "";
        } else {
            urlPath = url.substring(0, i);
            urlQuery = url.substring(i);
        }
        Path path = new Path(urlPath, context.service().getBasePath().style());
        ContextPath contextPath = new ContextPath(context, path);
        Map queries = URLEncodedUtils //
                .parse(urlQuery, StandardCharsets.UTF_8) //
                .stream() //
                .collect(Collectors.toMap(NameValuePair::getName, NameValuePair::getValue));
        return new UrlInfo(contextPath, queries, Arrays.asList(requestHeaders), options);
    }

    private static final class UrlInfo implements RequestOptions {
        final ContextPath contextPath;
        final List requestHeaders;
        final Map queries;
        final HttpRequestOptions options;

        UrlInfo(ContextPath contextPath, Map queries,
                List requestHeaders, HttpRequestOptions options) {
            this.contextPath = contextPath;
            this.queries = queries;
            this.requestHeaders = requestHeaders;
            this.options = options;
        }

        @Override
        public List getRequestHeaders() {
            return requestHeaders;
        }

        @Override
        public Map getQueries() {
            return queries;
        }

        @Override
        public Optional getUrlOverride() {
            return Optional.empty();
        }

        @Override
        public Optional requestConnectTimeoutMs() {
            return options.requestConnectTimeoutMs();
        }

        @Override
        public Optional requestReadTimeoutMs() {
            return options.requestReadTimeoutMs();
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy