/*
* Copyright (C) 2007-2014 Crafter Software Corporation.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.craftercms.profile.services.impl;
import java.net.URI;
import org.craftercms.commons.rest.AbstractRestClientBase;
import org.craftercms.commons.rest.RestClientUtils;
import org.craftercms.commons.rest.RestServiceException;
import org.craftercms.profile.api.ProfileConstants;
import org.craftercms.profile.api.exceptions.ErrorCode;
import org.craftercms.profile.api.exceptions.ErrorDetails;
import org.craftercms.profile.api.exceptions.ProfileException;
import org.craftercms.profile.exceptions.ProfileRestServiceException;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
/**
* Base class for all Profile REST clients.
*
* @author avasquez
*/
public abstract class AbstractProfileRestClientBase extends AbstractRestClientBase {
protected AccessTokenIdResolver accessTokenIdResolver;
@Required
public void setAccessTokenIdResolver(AccessTokenIdResolver accessTokenIdResolver) {
this.accessTokenIdResolver = accessTokenIdResolver;
}
protected String getAbsoluteUrlWithAccessTokenIdParam(String relativeUrl) {
String absoluteUrl = getAbsoluteUrl(relativeUrl);
String accessTokenId = accessTokenIdResolver.getAccessTokenId();
if (accessTokenId != null) {
if (absoluteUrl.contains("?")) {
return absoluteUrl + "&" + ProfileConstants.PARAM_ACCESS_TOKEN_ID + "=" + accessTokenId;
} else {
return absoluteUrl + "?" + ProfileConstants.PARAM_ACCESS_TOKEN_ID + "=" + accessTokenId;
}
} else {
return absoluteUrl;
}
}
protected MultiValueMap<String, String> createBaseParams() {
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
RestClientUtils.addValue(ProfileConstants.PARAM_ACCESS_TOKEN_ID, accessTokenIdResolver.getAccessTokenId(),
params);
return params;
}
protected <T> T doPostForObject(String url, Object request, Class<T> responseType, Object... uriVariables)
throws ProfileException {
try {
return restTemplate.postForObject(url, request, responseType, uriVariables);
} catch (RestServiceException e) {
handleRestServiceException(e);
} catch (Exception e) {
handleException(e);
}
return null;
}
protected <T> T doPostForUpload(String url, MultiValueMap<String,Object> request, Class<T> responseType,
Object... uriVariables)
throws ProfileException {
try {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(
request, headers);
return restTemplate.exchange(url,HttpMethod.POST,requestEntity,responseType,uriVariables).getBody();
} catch (RestServiceException e) {
handleRestServiceException(e);
} catch (Exception e) {
handleException(e);
}
return null;
}
protected URI doPostForLocation(String url, Object request, Object... uriVariables) throws ProfileException {
try {
return restTemplate.postForLocation(url, request, uriVariables);
} catch (RestServiceException e) {
handleRestServiceException(e);
} catch (Exception e) {
handleException(e);
}
return null;
}
protected <T> T doGetForObject(String url, Class<T> responseType, Object... uriVariables) throws ProfileException {
try {
return restTemplate.getForObject(url, responseType, uriVariables);
} catch (RestServiceException e) {
handleRestServiceException(e);
} catch (Exception e) {
handleException(e);
}
return null;
}
protected <T> T doGetForObject(URI url, Class<T> responseType) throws ProfileException {
try {
return restTemplate.getForObject(url, responseType);
} catch (RestServiceException e) {
handleRestServiceException(e);
} catch (Exception e) {
handleException(e);
}
return null;
}
protected <T> T doGetForObject(String url, ParameterizedTypeReference<T> responseType, Object... uriVariables)
throws ProfileException {
try {
return restTemplate.exchange(url, HttpMethod.GET, null, responseType, uriVariables).getBody();
} catch (RestServiceException e) {
handleRestServiceException(e);
} catch (Exception e) {
handleException(e);
}
return null;
}
protected <T> T doGetForObject(URI url, ParameterizedTypeReference<T> responseType) throws ProfileException {
try {
return restTemplate.exchange(url, HttpMethod.GET, null, responseType).getBody();
} catch (RestServiceException e) {
handleRestServiceException(e);
} catch (Exception e) {
handleException(e);
}
return null;
}
protected void handleRestServiceException(RestServiceException e) throws ProfileException {
if (e.getErrorDetails() instanceof ErrorDetails) {
ErrorDetails errorDetails = (ErrorDetails) e.getErrorDetails();
HttpStatus responseStatus = e.getResponseStatus();
ErrorCode errorCode = errorDetails.getErrorCode();
String message = errorDetails.getMessage();
throw new ProfileRestServiceException(responseStatus, errorCode, message);
} else {
HttpStatus responseStatus = e.getResponseStatus();
String message = e.getErrorDetails().toString();
throw new ProfileRestServiceException(responseStatus, message);
}
}
protected void handleException(Exception e) throws ProfileException {
throw new ProfileException(e.getMessage(), e);
}
}