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

io.crnk.spring.client.RestTemplateAdapter Maven / Gradle / Ivy

package io.crnk.spring.client;

import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;

import io.crnk.client.http.HttpAdapter;
import io.crnk.client.http.HttpAdapterRequest;
import io.crnk.core.engine.http.HttpMethod;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

public class RestTemplateAdapter implements HttpAdapter {

	private RestTemplate impl;

	private CopyOnWriteArrayList listeners = new CopyOnWriteArrayList<>();

	private Long networkTimeout;

	private boolean initialized = false;

	public static RestTemplateAdapter newInstance() {
		return new RestTemplateAdapter();
	}

	public RestTemplateAdapter() {
		this(null);
	}

	public RestTemplateAdapter(RestTemplate template) {
		this.impl = template;
	}

	public void addListener(RestTemplateAdapterListener listener) {
		checkNotInitialized();
		listeners.add(listener);
	}

	private void checkNotInitialized() {
		if (initialized) {
			throw new IllegalStateException("already initialized");
		}
	}

	public RestTemplate getImplementation() {
		if (!initialized) {
			initImpl();
		}
		return impl;
	}

	private synchronized void initImpl() {
		if (!initialized) {
			initialized = true;
			if (impl == null) {
				impl = new RestTemplate();
			}

			if (networkTimeout != null) {
				ClientHttpRequestFactory requestFactory = impl.getRequestFactory();
				if (requestFactory instanceof SimpleClientHttpRequestFactory) {
					SimpleClientHttpRequestFactory simpleRequestFactory =
							(SimpleClientHttpRequestFactory) impl.getRequestFactory();
					simpleRequestFactory.setReadTimeout(networkTimeout.intValue());
				}
				else if (requestFactory instanceof HttpComponentsClientHttpRequestFactory) {
					HttpComponentsClientHttpRequestFactory apacheRequestFactory =
							(HttpComponentsClientHttpRequestFactory) impl.getRequestFactory();
					apacheRequestFactory.setReadTimeout(networkTimeout.intValue());
				}
				else if (requestFactory instanceof OkHttp3ClientHttpRequestFactory) {
					OkHttp3ClientHttpRequestFactory okhttpRequestFactory =
							(OkHttp3ClientHttpRequestFactory) impl.getRequestFactory();
					okhttpRequestFactory.setReadTimeout(networkTimeout.intValue());
				}
				else {
					throw new IllegalStateException("unknown type " + requestFactory);
				}

			}

			for (RestTemplateAdapterListener listener : listeners) {
				listener.onBuild(impl);
			}
		}
	}

	@Override
	public HttpAdapterRequest newRequest(String url, HttpMethod method, String requestBody) {
		RestTemplate implementation = getImplementation();
		return new RestTemplateRequest(implementation, url, method, requestBody);
	}

	@Override
	public void setReceiveTimeout(int timeout, TimeUnit unit) {
		checkNotInitialized();
		networkTimeout = unit.toMillis(timeout);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy