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

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

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

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Stream;

import com.github.davidmoten.guavamini.Preconditions;

public final class CollectionEntityRequestOptionsBuilder>
        implements Iterable {

    private final CollectionPageEntityRequest request;
    private final List requestHeaders = new ArrayList<>();
    private final Map queries;
    private Optional search;
    private Optional filter;
    private Optional orderBy;
    private Optional skip;
    private Optional top;
    private Optional select;
    private Optional expand;
    private String metadata;
    // used to override the url for the situation where someone has a nextLink they want to load up later
    private Optional urlOverride;
    private Optional connectTimeoutMs;
    private Optional readTimeoutMs;
	private Optional deltaToken;

    CollectionEntityRequestOptionsBuilder(CollectionPageEntityRequest request) {
        this(request, Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(),
                Optional.empty(), Optional.empty(), "minimal", Optional.empty(), Optional.empty(), Optional.empty(), //
                Optional.empty(), new HashMap<>());
    }
    
    private CollectionEntityRequestOptionsBuilder(CollectionPageEntityRequest request, Optional search,
            Optional filter, Optional orderBy, Optional skip, Optional top,
            Optional select, Optional expand, String metadata, Optional urlOverride, //
            Optional connectTimeoutMs, Optional readTimeoutMs, Optional deltaToken, //
            Map queries) {
        this.request = request;
        this.search = search;
        this.filter = filter;
        this.orderBy = orderBy;
        this.skip = skip;
        this.top = top;
        this.select = select;
        this.expand = expand;
        this.metadata = metadata;
        this.urlOverride = urlOverride;
        this.connectTimeoutMs = connectTimeoutMs;
        this.readTimeoutMs = readTimeoutMs;
        this.deltaToken = deltaToken;
        this.queries = queries;
    }

    public CollectionEntityRequestOptionsBuilder requestHeader(String name, String value) {
        requestHeaders.add(new RequestHeader(name, value));
        return this;
    }
    
    public CollectionEntityRequestOptionsBuilder requestHeader(RequestHeader header) {
        requestHeaders.add(header);
        return this;
    } 
    
    /**
     * Sets the odata.maxpagesize request header value. Is a preference only and may
     * not be honoured by the service.
     * 
     * @param size max page size
     * @return this
     */
    public CollectionEntityRequestOptionsBuilder maxPageSize(int size) {
        return requestHeader(RequestHeader.maxPageSize(size));
    }

    public CollectionEntityRequestOptionsBuilder search(String clause) {
        Preconditions.checkNotNull(clause);
        this.search = Optional.of(clause);
        return this;
    }

    public CollectionEntityRequestOptionsBuilder expand(String clause) {
        Preconditions.checkNotNull(clause);
        this.expand = Optional.of(clause);
        return this;
    }

    public CollectionEntityRequestOptionsBuilder filter(String clause) {
        Preconditions.checkNotNull(clause);
        this.filter = Optional.of(clause);
        return this;
    }

    public CollectionEntityRequestOptionsBuilder orderBy(String clause) {
        Preconditions.checkNotNull(clause);
        this.orderBy = Optional.of(clause);
        return this;
    }

    public CollectionEntityRequestOptionsBuilder skip(long n) {
        Preconditions.checkArgument(n > 0);
        this.skip = Optional.of(n);
        return this;
    }

    public CollectionEntityRequestOptionsBuilder top(long n) {
        Preconditions.checkArgument(n > 0);
        this.top = Optional.of(n);
        return this;
    }

    public CollectionEntityRequestOptionsBuilder select(String clause) {
        Preconditions.checkNotNull(clause);
        this.select = Optional.of(clause);
        return this;
    }

    public CollectionEntityRequestOptionsBuilder metadataFull() {
        this.metadata = "full";
        return this;
    }

    public CollectionEntityRequestOptionsBuilder metadataMinimal() {
        this.metadata = "minimal";
        return this;
    }

    public CollectionEntityRequestOptionsBuilder metadataNone() {
        this.metadata = "none";
        return this;
    }
    
    public CollectionEntityRequestOptionsBuilder urlOverride(String url) {
        this.urlOverride = Optional.ofNullable(url);
        return this;
    }
    
    public CollectionEntityRequestOptionsBuilder connectTimeout(long duration, TimeUnit unit) {
    	this.connectTimeoutMs = Optional.of(unit.toMillis(duration));
    	return this;
    }
    
    public CollectionEntityRequestOptionsBuilder readTimeout(long duration, TimeUnit unit) {
    	this.readTimeoutMs = Optional.of(unit.toMillis(duration));
    	return this;
    }
    
	public CollectionEntityRequestOptionsBuilder deltaTokenLatest() {
		this.deltaToken = Optional.of("latest");
		return this;
	}
    
    public  CollectionEntityRequestOptionsBuilder> filter(Class cls) {
        return new CollectionEntityRequestOptionsBuilder>(request.filter(cls), search, filter,
                orderBy, skip, top, select, expand, metadata, urlOverride, connectTimeoutMs, readTimeoutMs, deltaToken, queries);
    }

	public CollectionEntityRequestOptionsBuilder query(String name, String value) {
		this.queries.put(name, value);
		return this;
	}
    
    CollectionRequestOptions build() {
        requestHeaders.add(RequestHeader.acceptJsonWithMetadata(metadata));
        return new CollectionRequestOptions(requestHeaders, search, filter, orderBy, skip, top,
                select, expand, urlOverride, connectTimeoutMs, readTimeoutMs, deltaToken, queries);
    }

    public CollectionPage get() {
        return request.get(build());
    }
    
    @Override
    public Iterator iterator() {
        return get().iterator();
    }

    public Stream stream() {
        return get().stream();
    }
    
    public Stream> streamWithDeltaLink() {
        return get().streamWithDeltaLink();
    }
    
    public  S to(Function,? extends S> function) {
    	return function.apply(get());
    }

    public Optional post(T entity) {
        return request.post(build(), entity);
    }
    
    public Optional patch(T entity) {
        return request.patch(build(), entity);
    }

    public List toList() {
        return get().toList();
    }
    
    public Set toSet() {
        return get().toSet();
    }

}