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

com.ovh.ws.jsonizer.api.DefaultRequestSender Maven / Gradle / Ivy

The newest version!
/**
 * Copyright 2012, OVH. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and limitations under the License.
 */
package com.ovh.ws.jsonizer.api;

import java.util.List;

import com.ovh.ws.api.AsyncCallback;
import com.ovh.ws.api.OvhWsException;
import com.ovh.ws.api.OvhWsException.Type;
import com.ovh.ws.api.request.RequestListener;
import com.ovh.ws.jsonizer.api.exception.AgreementRequiredException;
import com.ovh.ws.jsonizer.api.http.HttpAsyncHandler;
import com.ovh.ws.jsonizer.api.http.HttpClient;
import com.ovh.ws.jsonizer.api.http.HttpRequester;
import com.ovh.ws.jsonizer.api.http.HttpResponseHandler;
import com.ovh.ws.jsonizer.api.parser.Parser;
import com.ovh.ws.jsonizer.api.request.RequestSender;
import com.ovh.ws.jsonizer.api.request.RestRequest;
import com.ovh.ws.jsonizer.api.response.Error;
import com.ovh.ws.jsonizer.api.response.RestResponse;

public class DefaultRequestSender implements RequestSender, HttpAsyncHandler {

	private final JsonizerConfig config;
	private final HttpRequester httpRequester;

	private RequestListener requestListener;
	private AsyncCallbackListener callbackListener;

	public DefaultRequestSender(JsonizerConfig config) {
		this.config = config;
		httpRequester = new HttpRequester(config);
	}

	@Override
	public  T send(RestRequest request) throws OvhWsException {
		try {
			String content = httpRequester.execute(request);
			return onComplete(request, content);

		} catch (OvhWsException caught) {
			getRequestListener().onFailure(request, caught);
			throw caught;
		}
	}

	@Override
	public  void send(RestRequest request, AsyncCallback callback) {
		HttpResponseHandler responseHandler = new HttpResponseHandler(this, request, callback);
		httpRequester.execute(request, responseHandler);
	}

	@Override
	public  void onComplete(RestRequest request, String content, AsyncCallback callback) {
		try {
			T result = onComplete(request, content);
			getCallbackListener().onSuccess(result, callback);

		} catch (OvhWsException caught) {
			onFailure(request, caught, callback);
		}
	}

	private  T onComplete(RestRequest request, String content) throws OvhWsException {
		RestResponse response = readAndCheckResponse(request, content);
		T result = getParser().convertValue(response.getAnswer(), request.getResponseType());

		if (result == null && request.getResponseType() instanceof Class
		        && ((Class) request.getResponseType()).isEnum()) {
			throw new OvhWsException(Type.ObjectNotFound, "The server response of type " + request.getResponseType()
			        + " is not recognized : " + response.getAnswer());
		}

		getRequestListener().onSuccess(request, result);
		return result;
	}

	@Override
	public  void onFailure(RestRequest request, OvhWsException caught, AsyncCallback callback) {
		getRequestListener().onFailure(request, caught);
		getCallbackListener().onFailure(caught, callback);
	}

	private  RestResponse readAndCheckResponse(RestRequest request, String content) throws OvhWsException {
		RestResponse response = getParser().readValue(content, RestResponse.class);

		if (response.getError() != null) {
			throw createOvhWsException(response.getError());

		} else if (response.getAnswer() == null && !Void.class.equals(request.getResponseType())) {
			throw new OvhWsException(Type.NoAnswer, "There was an error in the server response");
		}

		return response;
	}

	private OvhWsException createOvhWsException(Error error) throws OvhWsException {
		OvhWsException ovhWsException;

		if (Type.AgreementRequired.getStatus() == error.getStatus() && error.getValue() != null) {
			List values = getParser().convertValue(error.getValue(),
			        AgreementRequiredException.getResponseType());
			ovhWsException = new AgreementRequiredException(error.getMessage(), values);

		} else {
			ovhWsException = new OvhWsException(error.getStatus(), error.getMessage());

		}

		return ovhWsException;
	}

	private RequestListener getRequestListener() {
		if (requestListener == null) {
			return config.getRequestListener();
		}
		return requestListener;
	}

	public void setRequestListener(RequestListener requestListener) {
		this.requestListener = requestListener;
	}

	private AsyncCallbackListener getCallbackListener() {
		if (callbackListener == null) {
			return config.getCallbackListener();
		}
		return callbackListener;
	}

	public void setAsyncCallbackListener(AsyncCallbackListener callbackListener) {
		this.callbackListener = callbackListener;
	}

	public HttpClient getHttpClient() {
		return httpRequester.getHttpClient();
	}

	public void setHttpClient(HttpClient httpClient) {
		httpRequester.setHttpClient(httpClient);
	}

	private Parser getParser() {
		return config.getParser();
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy