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

com.ksyun.api.sdk.client.DefaultKscClient Maven / Gradle / Ivy

There is a newer version: 2.1.8
Show newest version
package com.ksyun.api.sdk.client;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.net.SocketTimeoutException;
import java.security.InvalidKeyException;
import java.util.List;

import com.ksc.KscWebServiceRequest;
import com.ksc.auth.BasicAWSCredentials;
import com.ksc.auth.credentials.AWSCredentials;
import com.ksc.util.ReflectUtils;
import com.ksc.util.StringUtils;
import com.ksyun.api.sdk.auth.Credential;
import com.ksyun.api.sdk.auth.ISigner;
import com.ksyun.api.sdk.exceptions.ClientException;
import com.ksyun.api.sdk.exceptions.ServerException;
import com.ksyun.api.sdk.http.FormatType;
import com.ksyun.api.sdk.http.UnmarshallerContext;
import com.ksyun.api.sdk.regions.Endpoint;
import com.ksyun.api.sdk.regions.ProductDomain;
import com.ksyun.api.sdk.reponse.HttpResponse;
import com.ksyun.api.sdk.reponse.KscError;
import com.ksyun.api.sdk.reponse.KscResponse;
import com.ksyun.api.sdk.request.HttpRequest;
import com.ksyun.api.sdk.request.KscRequest;
import com.ksyun.api.sdk.utils.Reader;
import com.ksyun.api.sdk.utils.ReaderFactory;

public class DefaultKscClient implements IKscClient{
	private int maxRetryNumber = 3;
	private boolean autoRetry = true;
	private IClientProfile clientProfile = null;
    private boolean urlTestFlag = false;
    
    private static String DEFAULT_ENDPOINT = "http://%s.%s.api.ksyun.com";
	
	public DefaultKscClient() {
		this.clientProfile = DefaultKscProfile.getProfile();
	}
	
	public DefaultKscClient(String region,String ak,String sk) {
	    this.clientProfile = DefaultKscProfile.getProfile(region,ak,sk);
	}
	
	public DefaultKscClient(IClientProfile profile) {
		this.clientProfile = profile;
	}
	
	@Override
    public  HttpResponse doAction(KscRequest request) 
			throws ClientException, ServerException {
		return this.doAction(request, autoRetry, maxRetryNumber, this.clientProfile);
	}
	
	@Override
    public  HttpResponse doAction(KscRequest request, 
			boolean autoRetry, int maxRetryCounts) throws ClientException, ServerException {
		return this.doAction(request, autoRetry, maxRetryCounts, this.clientProfile);
	}
	
	@Override
    public  HttpResponse doAction(KscRequest request, IClientProfile profile) 
			throws ClientException, ServerException {
		return this.doAction(request, this.autoRetry, this.maxRetryNumber, profile);
	}
	
	@Override
    public  HttpResponse doAction(KscRequest request, String regionId, Credential credential) 
			throws ClientException, ServerException {
		boolean retry = this.autoRetry;
		int retryNumber = this.maxRetryNumber;
		ISigner signer = null;
		FormatType format = null;
		List endpoints = null;
        if (null == request.getRegionId()) {
            request.setRegionId(regionId);
        }
        if (null != this.clientProfile) {
            signer = clientProfile.getSigner();
            format = clientProfile.getFormat();
			try {
                endpoints = clientProfile.getEndpoints(request.getProduct(), request.getRegionId(),
                        request.getLocationProduct(),
						request.getEndpointType());
			} catch (Throwable e) {
                endpoints = clientProfile.getEndpoints(request.getRegionId(), request.getProduct());
			}
        }
		
        return this.doAction(request, retry, retryNumber, request.getRegionId(), credential, signer, format, endpoints);
	}
	
	@Override
    public  T getKscResponse(KscRequest request) 
			throws ServerException, ClientException{
		HttpResponse baseResponse = this.doAction(request);
		return parseKscResponse(request.getResponseClass(), baseResponse);
	}
	
	@Override
    public  T getKscResponse(KscRequest request, 
			boolean autoRetry, int maxRetryCounts) throws ServerException, ClientException{
		HttpResponse baseResponse = this.doAction(request, autoRetry, maxRetryCounts);
		return parseKscResponse(request.getResponseClass(), baseResponse);
	}
	
	@Override
    public  T getKscResponse(KscRequest request,IClientProfile profile) 
			throws ServerException, ClientException{
		HttpResponse baseResponse = this.doAction(request, profile);
		return parseKscResponse(request.getResponseClass(), baseResponse);
	}
	
	@Override
    public  T getKscResponse(KscRequest request, String regionId, Credential credential) 
			throws ServerException, ClientException {
		HttpResponse baseResponse = this.doAction(request, regionId, credential);
		return parseKscResponse(request.getResponseClass(), baseResponse);
	}
	
	@Override
    public  HttpResponse doAction(KscRequest request, boolean autoRetry, 
			int maxRetryCounts, IClientProfile profile) throws ClientException, ServerException {
		if (null == profile){
			throw new ClientException("SDK.InvalidProfile", "No active profile found.");
		}
		boolean retry = autoRetry;
		int retryNumber = maxRetryCounts;
		String region = profile.getRegionId();
        if (null == request.getRegionId()) {
            request.setRegionId(region);
        }
		Credential credential = profile.getCredential();
		ISigner signer = profile.getSigner();
		FormatType format = profile.getFormat();
        List endpoints;
		try {
            endpoints = clientProfile.getEndpoints(request.getProduct(), request.getRegionId(),
                    request.getLocationProduct(),
					request.getEndpointType());
		} catch (Throwable e) {
            endpoints = clientProfile.getEndpoints(request.getRegionId(), request.getProduct());
		}
        return this.doAction(request, retry, retryNumber, request.getRegionId(), credential, signer, format, endpoints);
	}
	
	private  T parseKscResponse(Class clasz, HttpResponse baseResponse) 
			throws ServerException, ClientException {

		FormatType format = baseResponse.getContentType();

		if (baseResponse.isSuccess()) {
			return readResponse(clasz, baseResponse, format);
		} else {
		    KscError error = readError(baseResponse, format);
			if (500 <= baseResponse.getStatus()){
				throw new ServerException(error.getErrorCode(), error.getErrorMessage(), error.getRequestId());
			}
			else{
				throw new ClientException(error.getErrorCode(), error.getErrorMessage(), error.getRequestId());
			}
		}
	}
	
	@Override
    public  HttpResponse doAction(KscRequest request, 
			boolean autoRetry, int maxRetryNumber,
			String regionId, Credential credential,
			ISigner signer, FormatType format, 
			List endpoints) throws ClientException, ServerException {
		try {
			FormatType requestFormatType = request.getAcceptFormat();
			if (null != requestFormatType){
				format = requestFormatType;
			}
            ProductDomain domain = Endpoint.findProductDomain(endpoints);
//            ProductDomain domain = Endpoint.findProductDomain(regionId, request.getProduct(), endpoints);
			if (null == domain){
				throw new ClientException("SDK.InvalidRegionId", "Can not find endpoint to access.");
			}
			HttpRequest httpRequest = request.signRequest(signer, credential, format, domain);
            if (this.urlTestFlag) {
                throw new ClientException("URLTestFlagIsSet", httpRequest.getUrl());
            }

			int retryTimes = 1;
			HttpResponse response = HttpResponse.getResponse(httpRequest);
			while (500 <= response.getStatus() && autoRetry && retryTimes < maxRetryNumber) {
				httpRequest = request.signRequest(signer, credential, format, domain);
				response = HttpResponse.getResponse(httpRequest);
				retryTimes ++;
			}
			return response;
		} catch (InvalidKeyException exp) {
			throw new ClientException("SDK.InvalidAccessSecret","Speicified access secret is not valid.");
		}catch (SocketTimeoutException exp){
			throw new ClientException("SDK.ServerUnreachable","SocketTimeoutException has occurred on a socket read or accept.");
		}catch (IOException exp) {
			throw new ClientException("SDK.ServerUnreachable", "Server unreachable: " + exp.toString());
		}
	}
	
    @SuppressWarnings({ "rawtypes", "unchecked" })
    @Override
    public  T getKscResponse(KscWebServiceRequest request) throws ClientException {
        if(clientProfile.getCredential() == null
                || StringUtils.isNullOrEmpty(clientProfile.getCredential().getAccessKeyId())
                || StringUtils.isNullOrEmpty(clientProfile.getCredential().getAccessSecret()))
            throw new ClientException("AK&SK cannot be null!");
        //redirect to ksc client
        AWSCredentials credentials = new BasicAWSCredentials(clientProfile.getCredential().getAccessKeyId()
                , clientProfile.getCredential().getAccessSecret());
        Constructor constructor;
        Object client;
        T t = null;
        try {
            //KSCKECClient
            constructor = ReflectUtils.findConstructor(request.getReflectConstructureName());
            client = constructor.newInstance(credentials);
            //set endpoint
            invokeEndpoint(request.getProduct(), clientProfile.getRegionId(), client, request);
            t = (T) ReflectUtils.findMethod(request.getReflectMethodName()).invoke(client, request);
        } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
            throw new RuntimeException("KSC SDK InstantiationException",e);
        }
        return t;
    }
    
    private static  void invokeEndpoint(String product,String region,Object client,KscWebServiceRequest request) 
            throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        String endpoint = String.format(DEFAULT_ENDPOINT, product,region);
        ReflectUtils.findMethod(request.getReflectEndpointMethodName()).invoke(client, endpoint);
    }
    
	private  T readResponse(Class clasz, HttpResponse httpResponse, FormatType format) throws ClientException {
		Reader reader = ReaderFactory.createInstance(format);
		UnmarshallerContext context = new UnmarshallerContext();
		T response = null;
		String stringContent = getResponseContent(httpResponse);
		try {
			response = clasz.newInstance();
		} catch (Exception e) {
			throw new ClientException("SDK.InvalidResponseClass", "Unable to allocate "+ clasz.getName() + " class");
		}
		String responseEndpoint= clasz.getName().substring(clasz.getName().lastIndexOf(".") + 1);
		context.setResponseMap(reader.read(stringContent,responseEndpoint));
		context.setHttpResponse(httpResponse);
		response.getInstance(context);
		return response;
	}

	private String getResponseContent(HttpResponse httpResponse) throws ClientException {
		String stringContent = null;
		try {
			if(null == httpResponse.getEncoding()){
				stringContent = new String(httpResponse.getContent());
			} else {
				stringContent = new String(httpResponse.getContent(), httpResponse.getEncoding());
			}
		} catch(UnsupportedEncodingException exp) {
			throw new ClientException("SDK.UnsupportedEncoding", "Can not parse response due to un supported encoding.");
		}
		return stringContent;
	}
	
	private KscError readError(HttpResponse httpResponse, FormatType format) throws ClientException {
	    KscError error = new KscError();
		String responseEndpoint= "Error";
		Reader reader = ReaderFactory.createInstance(format);
		UnmarshallerContext context = new UnmarshallerContext();
		String stringContent = getResponseContent(httpResponse);
		context.setResponseMap(reader.read(stringContent,responseEndpoint));
		return error.getInstance(context);
	}
	
	public boolean isAutoRetry() {
		return autoRetry;
	}

	public void setAutoRetry(boolean autoRetry) {
		this.autoRetry = autoRetry;
	}
	
	public int getMaxRetryNumber() {
		return maxRetryNumber;
	}

	public void setMaxRetryNumber(int maxRetryNumber) {
		this.maxRetryNumber = maxRetryNumber;
	}

    public void setUrlTestFlag(boolean flag) {
        this.urlTestFlag = flag;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy