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

com.nhl.link.rest.client.LinkRestClient Maven / Gradle / Ivy

There is a newer version: 2.13
Show newest version
package com.nhl.link.rest.client;

import java.util.function.Supplier;

import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.nhl.link.rest.client.protocol.Expression.ExpressionBuilder;
import com.nhl.link.rest.client.protocol.Include;
import com.nhl.link.rest.client.protocol.Include.IncludeBuilder;
import com.nhl.link.rest.client.protocol.LrcRequest;
import com.nhl.link.rest.client.protocol.LrcRequest.LrRequestBuilder;
import com.nhl.link.rest.client.protocol.Sort;
import com.nhl.link.rest.client.runtime.jackson.IJsonEntityReader;
import com.nhl.link.rest.client.runtime.jackson.IJsonEntityReaderFactory;
import com.nhl.link.rest.client.runtime.jackson.JsonEntityReaderFactory;
import com.nhl.link.rest.client.runtime.response.DataResponseHandler;
import com.nhl.link.rest.client.runtime.response.SimpleResponseHandler;
import com.nhl.link.rest.client.runtime.run.InvocationBuilder;

/**
 * @since 2.0
 */
public class LinkRestClient {

	private static JsonFactory jsonFactory;
	private static IJsonEntityReaderFactory jsonEntityReaderFactory;

	static {
		jsonFactory = new ObjectMapper().getFactory();
		jsonEntityReaderFactory = new JsonEntityReaderFactory();
	}

	public static LinkRestClient client(WebTarget target) {
		return new LinkRestClient(target);
	}

	private WebTarget target;
	private LrRequestBuilder request;

	private LinkRestClient(WebTarget target) {
		this.target = target;
		request = LrcRequest.builder();
	}

	public LinkRestClient exclude(String... excludePaths) {
		request.exclude(excludePaths);
		return this;
	}

	public LinkRestClient include(String... includePaths) {
		request.include(includePaths);
		return this;
	}

	public LinkRestClient include(Include include) {
		request.include(include);
		return this;
	}

	public LinkRestClient include(IncludeBuilder include) {
		request.include(include.build());
		return this;
	}

	public LinkRestClient cayenneExp(ExpressionBuilder cayenneExp) {
		request.cayenneExp(cayenneExp.build());
		return this;
	}

	public LinkRestClient sort(String... properties) {
		request.sort(properties);
		return this;
	}

	public LinkRestClient sort(Sort ordering) {
		request.sort(ordering);
		return this;
	}

	public LinkRestClient start(long startIndex) {
		request.start(startIndex);
		return this;
	}

	public LinkRestClient limit(long limit) {
		request.limit(limit);
		return this;
	}

	public  ClientDataResponse get(Class targetType) {
		return invoke(targetType, InvocationBuilder.target(target).request(request.build()).buildGet());
	}

	/**
	 * @since 2.1
     */
	public  ClientDataResponse post(Class targetType, String data) {
		return invoke(targetType, InvocationBuilder.target(target).request(request.build()).buildPost(data));
	}

	/**
	 * @since 2.1
     */
	public  ClientDataResponse put(Class targetType, String data) {
		return invoke(targetType, InvocationBuilder.target(target).request(request.build()).buildPut(data));
	}

	/**
	 * @since 2.1
     */
	public ClientSimpleResponse delete() {
		Supplier invocation = InvocationBuilder.target(target).request(request.build()).buildDelete();
		return new SimpleResponseHandler(jsonFactory).handleResponse(invocation.get());
	}

	private  ClientDataResponse invoke(Class targetType, Supplier invocation) {

		IJsonEntityReader entityReader = getEntityReader(targetType);
		Response response = invocation.get();
		DataResponseHandler responseHandler = new DataResponseHandler<>(jsonFactory, entityReader);
		return responseHandler.handleResponse(response);
	}

	private  IJsonEntityReader getEntityReader(Class entityType) {

		if (entityType == null) {
			throw new NullPointerException("Target type");
		}

		IJsonEntityReader jsonEntityReader = jsonEntityReaderFactory.getReaderForType(entityType);
		if (jsonEntityReader == null) {
			throw new LinkRestClientException("Unsupported target type: " + entityType.getName());
		}

		return jsonEntityReader;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy