/*
Copyright (c) 2012 GFT Appverse, S.L., Sociedad Unipersonal.
This Source Code Form is subject to the terms of the Appverse Public License
Version 2.0 (“APL v2.0”). If a copy of the APL was not distributed with this
file, You can obtain one at http://www.appverse.mobi/licenses/apl_v2.0.pdf. [^]
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the conditions of the AppVerse Public License v2.0
are met.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. EXCEPT IN CASE OF WILLFUL MISCONDUCT OR GROSS NEGLIGENCE, IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
*/
package org.appverse.web.framework.backend.rest.services.integration.impl.live;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.*;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.Invocation.Builder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.apache.commons.lang.StringUtils;
import org.appverse.web.framework.backend.api.helpers.log.AutowiredLogger;
import org.appverse.web.framework.backend.api.model.integration.AbstractIntegrationBean;
import org.appverse.web.framework.backend.api.model.integration.IntegrationPaginatedDataFilter;
import org.appverse.web.framework.backend.api.services.integration.AbstractIntegrationService;
import org.appverse.web.framework.backend.api.services.integration.ServiceUnavailableException;
import org.appverse.web.framework.backend.rest.exceptions.RestWebAppException;
import org.appverse.web.framework.backend.rest.managers.RestCachingManager;
import org.appverse.web.framework.backend.rest.model.integration.IntegrationPaginatedResult;
import org.appverse.web.framework.backend.rest.model.integration.StatusResult;
import org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
/**
* This class provides integration with Rest services
*
*/
public abstract class RestPersistenceService<T extends AbstractIntegrationBean> extends
AbstractIntegrationService<T>
implements IRestPersistenceService<T> {
public static final String MAX_RECORDS_PARAM_NAME = "maxRecords";
public static final String OFFSET_PARAM_NAME = "offset";
@Autowired(required = false)
RestCachingManager restCachingManager;
@AutowiredLogger
private static Logger logger;
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#retrieve(javax.ws.rs.client.WebTarget, java.lang.String, java.lang.Long)
*/
@Override
public T retrieve(final WebTarget webClient, final String idName, final Long id)
throws Exception {
return retrieve(webClient, idName, id, null, null);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#retrieve(javax.ws.rs.client.WebTarget, java.util.Map, java.util.Map)
*/
@Override
public T retrieve(final WebTarget webClient, final Map<String, Object> pathParams,
final Map<String, Object> queryParams)
throws Exception {
return this.retrieve(webClient, null, null, pathParams, queryParams);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#retrieve(javax.ws.rs.client.WebTarget, java.lang.String, java.lang.Long, java.util.Map, java.util.Map)
*/
@Override
public T retrieve(WebTarget webClient, final String idName, final Long id,
final Map<String, Object> pathParams,
final Map<String, Object> queryParams)
throws Exception {
return retrieve(webClient, idName, id, pathParams, queryParams, null);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#retrieve(javax.ws.rs.client.WebTarget, java.lang.String, java.lang.Long, java.util.Map, java.util.Map, java.util.Map)
*/
@Override
public T retrieve(WebTarget webClient, final String idName, final Long id,
final Map<String, Object> pathParams,
final Map<String, Object> queryParams, final Map<String, Object> builderProperties)
throws Exception {
if (queryParams != null)
webClient = applyQuery(webClient, queryParams);
GenericType<T> genericType = new GenericType<T>(getClassP()) {
};
if (id != null && idName != null)
webClient = webClient.resolveTemplate(idName, id);
if (pathParams != null)
webClient = webClient.resolveTemplates(pathParams);
Builder builder = acceptMediaType(webClient.request());
if (builderProperties != null){
addBuilderProperties(builder, builderProperties);
}
Method methodGet = Builder.class.getMethod("get", GenericType.class);
T object = null;
if (restCachingManager != null)
object = restCachingManager.manageRestCaching(builder, methodGet, genericType, this,
getKey(webClient));
else
object = builder.get(genericType);
return object;
}
// Binary method
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#retrieveInputStream(javax.ws.rs.client.WebTarget, java.lang.String, java.lang.Long, java.util.Map, java.util.Map)
*/
@Override
public InputStream retrieveInputStream(WebTarget webClient, final String idName, final Long id,
final Map<String, Object> pathParams, final Map<String, Object> queryParams)
throws Exception {
return retrieveInputStream(webClient, idName, id, pathParams, queryParams, null);
}
// Binary method
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#retrieveInputStream(javax.ws.rs.client.WebTarget, java.lang.String, java.lang.Long, java.util.Map, java.util.Map, java.util.Map, java.util.Map)
*/
@Override
public InputStream retrieveInputStream(WebTarget webClient, final String idName, final Long id,
final Map<String, Object> pathParams, final Map<String, Object> queryParams, final Map<String, Object> builderProperties)
throws Exception {
if (queryParams != null)
webClient = applyQuery(webClient, queryParams);
if (id != null && idName != null)
webClient = webClient.resolveTemplate(idName, id);
if (pathParams != null)
webClient = webClient.resolveTemplates(pathParams);
Builder builder = webClient.request().accept(MediaType.APPLICATION_OCTET_STREAM_TYPE);
if (builderProperties != null){
addBuilderProperties(builder, builderProperties);
}
Method methodGet = Builder.class.getMethod("get");
Response object = null;
if (restCachingManager != null)
object = restCachingManager.manageRestCaching(builder, methodGet, null, this,
getKey(webClient));
else
object = builder.get();
return (InputStream) object.getEntity();
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#retrieveList(javax.ws.rs.client.WebTarget, java.lang.String, java.lang.Long)
*/
@Override
public List<T> retrieveList(final WebTarget webClient, final String idName, final Long id)
throws Exception {
return retrieveList(webClient, idName, id, null, null);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#retrieveList(javax.ws.rs.client.WebTarget, java.lang.String, java.lang.Long, java.util.Map, java.util.Map)
*/
@Override
public List<T> retrieveList(WebTarget webClient, final String idName, final Long id,
final Map<String, Object> pathParams, final Map<String, Object> queryParams)
throws Exception {
return retrieveList(webClient, idName, id, pathParams, queryParams, null);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#retrieveList(javax.ws.rs.client.WebTarget, java.lang.String, java.lang.Long, java.util.Map, java.util.Map, java.util.Map)
*/
@Override
public List<T> retrieveList(WebTarget webClient, final String idName, final Long id,
final Map<String, Object> pathParams, final Map<String, Object> queryParams, final Map<String, Object> builderProperties)
throws Exception {
if (queryParams != null)
webClient = applyQuery(webClient, queryParams);
GenericType<List<T>> genericType = new GenericType<List<T>>(getTypeListP()) {
};
if (pathParams != null)
webClient = webClient.resolveTemplates(pathParams);
if (id != null && idName != null)
webClient = webClient.resolveTemplate(idName, id);
Builder builder = acceptMediaType(webClient.request());
if (builderProperties != null){
addBuilderProperties(builder, builderProperties);
}
Method methodGet = Builder.class.getMethod("get", GenericType.class);
List<T> objects = null;
if (restCachingManager != null)
objects = restCachingManager.manageRestCaching(builder, methodGet, genericType,
this,
getKey(webClient));
else
objects = builder.get(genericType);
return objects;
}
/*
* (non-Javadoc)
*
* @see
* org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService
* #retrieveList()
*/
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#retrieveList(javax.ws.rs.client.WebTarget)
*/
@Override
public List<T> retrieveList(final WebTarget webClient) throws Exception {
return retrieveList(webClient, (Map<String, Object>) null, (Map<String, Object>) null);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#retrieveList(javax.ws.rs.client.WebTarget, java.util.Map, java.util.Map)
*/
@Override
public List<T> retrieveList(final WebTarget webClient, final Map<String, Object> pathParams,
final Map<String, Object> queryParams)
throws Exception {
return retrieveList(webClient, (String) null, (Long) null, pathParams, queryParams);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#retrieveList(javax.ws.rs.client.WebTarget, java.lang.String, java.util.List)
*/
@Override
public List<T> retrieveList(final WebTarget webClient, final String idsName,
final List<Long> ids)
throws Exception {
return retrieveList(webClient, idsName, ids, null, null);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#retrieveList(javax.ws.rs.client.WebTarget, java.lang.String, java.util.List, java.util.Map, java.util.Map)
*/
@Override
public List<T> retrieveList(WebTarget webClient, final String idsName,
final List<Long> ids, final Map<String, Object> pathParams,
final Map<String, Object> queryParams) throws Exception {
String idsString = StringUtils.join(ids, ',');
webClient = webClient.resolveTemplate(idsName, idsString);
return retrieveList(webClient, pathParams, queryParams);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#retrievePagedQuery(javax.ws.rs.client.WebTarget, org.appverse.web.framework.backend.api.model.integration.IntegrationPaginatedDataFilter)
*/
@Override
public IntegrationPaginatedResult<T> retrievePagedQuery(final WebTarget webClient,
final IntegrationPaginatedDataFilter filter)
throws Exception {
return retrievePagedQuery(webClient, filter, null, null);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#retrievePagedQuery(javax.ws.rs.client.WebTarget, org.appverse.web.framework.backend.api.model.integration.IntegrationPaginatedDataFilter, java.util.Map, java.util.Map)
*/
@Override
public IntegrationPaginatedResult<T> retrievePagedQuery(WebTarget webClient,
final IntegrationPaginatedDataFilter filter, final Map<String, Object> pathParams,
final Map<String, Object> queryParams)
throws Exception {
return retrievePagedQuery(webClient, filter, pathParams, queryParams, null);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#retrievePagedQuery(javax.ws.rs.client.WebTarget, org.appverse.web.framework.backend.api.model.integration.IntegrationPaginatedDataFilter, java.util.Map, java.util.Map, java.util.Map)
*/
@Override
public IntegrationPaginatedResult<T> retrievePagedQuery(WebTarget webClient,
final IntegrationPaginatedDataFilter filter, final Map<String, Object> pathParams,
final Map<String, Object> queryParams, final Map<String, Object> builderProperties)
throws Exception {
if (queryParams != null)
webClient = applyQuery(webClient, queryParams);
Builder builder = null;
if (pathParams != null)
webClient = webClient.resolveTemplates(pathParams);
webClient = webClient.resolveTemplate(getOffsetParamName(), filter.getOffset());
webClient = webClient.resolveTemplate(getMaxRecordsParamName(), filter.getLimit());
builder = acceptMediaType(webClient.request());
if (builderProperties != null){
addBuilderProperties(builder, builderProperties);
}
Method methodGet = this.getClass().getMethod("retrieveAndUnmarshall", WebTarget.class,
Builder.class);
IntegrationPaginatedResult<T> result = null;
if (restCachingManager != null)
result = restCachingManager.manageRestCaching(builder,
webClient, methodGet, this,
getKey(webClient));
else
result = retrieveAndUnmarshall(webClient, builder);
return result;
}
/**
* Join in the same method retrieving and unmarshalling
*
* @param webClient
* @param builder
* @return
* @throws Exception
*/
public IntegrationPaginatedResult<T> retrieveAndUnmarshall(final WebTarget webClient,
final Builder builder) throws Exception
{
Response resp = builder.get();
IntegrationPaginatedResult<T> result = new IntegrationPaginatedResult<T>(
Collections.<T> emptyList(), 0, 0);
if (Status.SERVICE_UNAVAILABLE.getStatusCode() == resp.getStatus()) {
logger.error("Problem with call {" + webClient.getUri()
+ "} . Response status: " + resp.getStatus());
//Appverse integration exception
throw new ServiceUnavailableException();
}
else if (Status.Family.SUCCESSFUL == resp.getStatusInfo().getFamily()) {
result = mapPagedResult(resp);
}
else if (Status.NOT_MODIFIED.getStatusCode() != resp.getStatus()) {
// Any other status will be considered an error (except NOT_MODIFIED)
logger.error("Error with call {" + webClient.getUri()
+ "} . Response status: " + resp.getStatus());
throw new RestWebAppException("Exception calling URI: " +
webClient.getUri().toString() + ". Status code is: " + resp.getStatus(), resp.getStatus());
}
return result;
}
// DELETE METHODS
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#deleteStatusReturn(javax.ws.rs.client.WebTarget, java.lang.String, java.lang.Long)
*/
@Override
public StatusResult deleteStatusReturn(final WebTarget webClient, final String idName,
final Long id)
throws Exception
{
return deleteStatusReturn(webClient, idName, id, null, null);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#deleteStatusReturn(javax.ws.rs.client.WebTarget, java.lang.String, java.lang.Long, java.util.Map, java.util.Map)
*/
@Override
public StatusResult deleteStatusReturn(WebTarget webClient, final String idName, final Long id,
final Map<String, Object> pathParams,
final Map<String, Object> queryParams) throws Exception
{
return deleteStatusReturn(webClient, idName, id, pathParams, queryParams, null);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#deleteStatusReturn(javax.ws.rs.client.WebTarget, java.lang.String, java.lang.Long, java.util.Map, java.util.Map, java.util.Map)
*/
@Override
public StatusResult deleteStatusReturn(WebTarget webClient, final String idName, final Long id,
final Map<String, Object> pathParams,
final Map<String, Object> queryParams, final Map<String, Object> builderProperties) throws Exception
{
if (queryParams != null)
webClient = applyQuery(webClient, queryParams);
if (id != null && idName != null)
webClient = webClient.resolveTemplate(idName, id);
if (pathParams != null)
webClient = webClient.resolveTemplates(pathParams);
Builder builder = acceptMediaType(webClient.request());
if (builderProperties != null){
addBuilderProperties(builder, builderProperties);
}
Response resp = builder.delete();
return getStatusResult(resp);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#delete(javax.ws.rs.client.WebTarget, java.lang.String, java.lang.Long)
*/
@Override
public T delete(final WebTarget webClient, final String idName, final Long id) throws Exception
{
return delete(webClient, idName, id, null, null);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#delete(javax.ws.rs.client.WebTarget, java.lang.String, java.lang.Long, java.util.Map, java.util.Map)
*/
@Override
public T delete(WebTarget webClient, final String idName, final Long id,
final Map<String, Object> pathParams,
final Map<String, Object> queryParams) throws Exception
{
return delete(webClient, idName, id, pathParams, queryParams, null);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#delete(javax.ws.rs.client.WebTarget, java.lang.String, java.lang.Long, java.util.Map, java.util.Map, java.util.Map, java.util.Map)
*/
@Override
public T delete(WebTarget webClient, final String idName, final Long id,
final Map<String, Object> pathParams,
final Map<String, Object> queryParams, final Map<String, Object> builderProperties) throws Exception
{
if (queryParams != null)
webClient = applyQuery(webClient, queryParams);
GenericType<T> genericType = new GenericType<T>(getClassP()) {
};
if (id != null && idName != null)
webClient = webClient.resolveTemplate(idName, id);
if (pathParams != null)
webClient = webClient.resolveTemplates(pathParams);
Builder builder = acceptMediaType(webClient.request());
if (builderProperties != null){
addBuilderProperties(builder, builderProperties);
}
return builder.delete(genericType);
}
//INSERT METHODS
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#insert(javax.ws.rs.client.WebTarget, org.appverse.web.framework.backend.api.model.integration.AbstractIntegrationBean)
*/
@Override
public T insert(final WebTarget webClient, final T object) throws Exception {
return insert(webClient, object, null, null);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#insert(javax.ws.rs.client.WebTarget, org.appverse.web.framework.backend.api.model.integration.AbstractIntegrationBean, java.util.Map, java.util.Map)
*/
@Override
public T insert(WebTarget webClient, final T object,
final Map<String, Object> pathParams,
final Map<String, Object> queryParams) throws Exception {
return insert(webClient, object, pathParams, queryParams, null);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#insert(javax.ws.rs.client.WebTarget, org.appverse.web.framework.backend.api.model.integration.AbstractIntegrationBean, java.util.Map, java.util.Map, java.util.Map, java.util.Map)
*/
@Override
public T insert(WebTarget webClient, final T object,
final Map<String, Object> pathParams,
final Map<String, Object> queryParams, final Map<String, Object> builderProperties) throws Exception {
if (queryParams != null)
webClient = applyQuery(webClient, queryParams);
GenericType<T> genericType = new GenericType<T>(getClassP()) {
};
if (pathParams != null)
webClient = webClient.resolveTemplates(pathParams);
Builder builder = acceptMediaType(webClient.request());
if (builderProperties != null){
addBuilderProperties(builder, builderProperties);
}
return builder.post(Entity.entity(object, acceptMediaType()), genericType);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#insert(javax.ws.rs.client.WebTarget, java.io.InputStream, java.util.Map, java.util.Map)
*/
@Override
public Response insert(WebTarget webClient, final InputStream object,
final Map<String, Object> pathParams,
final Map<String, Object> queryParams) throws Exception {
return insert(webClient, object, pathParams, queryParams, null);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#insert(javax.ws.rs.client.WebTarget, java.io.InputStream, java.util.Map, java.util.Map, java.util.Map)
*/
@Override
public Response insert(WebTarget webClient, final InputStream object,
final Map<String, Object> pathParams,
final Map<String, Object> queryParams, final Map<String, Object> builderProperties) throws Exception {
if (queryParams != null)
webClient = applyQuery(webClient, queryParams);
if (pathParams != null)
webClient = webClient.resolveTemplates(pathParams);
Builder builder = acceptMediaType(webClient.request());
if (builderProperties != null){
addBuilderProperties(builder, builderProperties);
}
return builder.post(Entity.entity(object, MediaType.APPLICATION_OCTET_STREAM_TYPE));
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#insertStatusReturn(javax.ws.rs.client.WebTarget, org.appverse.web.framework.backend.api.model.integration.AbstractIntegrationBean)
*/
@Override
public StatusResult insertStatusReturn(final WebTarget webClient, final T object)
throws Exception {
return insertStatusReturn(webClient, object, null, null);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#insertStatusReturn(javax.ws.rs.client.WebTarget, org.appverse.web.framework.backend.api.model.integration.AbstractIntegrationBean, java.util.Map, java.util.Map)
*/
@Override
public StatusResult insertStatusReturn(WebTarget webClient, final T object,
final Map<String, Object> pathParams,
final Map<String, Object> queryParams) throws Exception {
return insertStatusReturn(webClient, object, pathParams, queryParams, null);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#insertStatusReturn(javax.ws.rs.client.WebTarget, org.appverse.web.framework.backend.api.model.integration.AbstractIntegrationBean, java.util.Map, java.util.Map, java.util.Map)
*/
@Override
public StatusResult insertStatusReturn(WebTarget webClient, final T object,
final Map<String, Object> pathParams,
final Map<String, Object> queryParams, final Map<String, Object> builderProperties) throws Exception {
if (queryParams != null)
webClient = applyQuery(webClient, queryParams);
if (pathParams != null)
webClient = webClient.resolveTemplates(pathParams);
Builder builder = acceptMediaType(webClient.request());
if (builderProperties != null){
addBuilderProperties(builder, builderProperties);
}
Response resp = builder.post(Entity.entity(object, acceptMediaType()));
return getStatusResult(resp);
}
// UPDATE Methods
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#update(javax.ws.rs.client.WebTarget, org.appverse.web.framework.backend.api.model.integration.AbstractIntegrationBean, java.lang.String, java.lang.Long)
*/
@Override
public T update(final WebTarget webClient, final T object, final String idName, final Long id)
throws Exception {
// TODO Auto-generated method stub
return update(webClient, object, idName, id, null, null);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#update(javax.ws.rs.client.WebTarget, org.appverse.web.framework.backend.api.model.integration.AbstractIntegrationBean, java.lang.String, java.lang.Long, java.util.Map, java.util.Map)
*/
@Override
public T update(WebTarget webClient, final T object, final String idName, final Long id,
final Map<String, Object> pathParams, final Map<String, Object> queryParams)
throws Exception {
return update(webClient, object, idName, id, pathParams, queryParams, null);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#update(javax.ws.rs.client.WebTarget, org.appverse.web.framework.backend.api.model.integration.AbstractIntegrationBean, java.lang.String, java.lang.Long, java.util.Map, java.util.Map, java.util.Map)
*/
@Override
public T update(WebTarget webClient, final T object, final String idName, final Long id,
final Map<String, Object> pathParams, final Map<String, Object> queryParams, final Map<String, Object> builderProperties)
throws Exception {
if (queryParams != null)
webClient = applyQuery(webClient, queryParams);
if (id != null && idName != null)
webClient = webClient.resolveTemplate(idName, id);
if (pathParams != null)
webClient = webClient.resolveTemplates(pathParams);
GenericType<T> genericType = new GenericType<T>(getClassP()) {
};
Builder builder = acceptMediaType(webClient.request());
if (builderProperties != null){
addBuilderProperties(builder, builderProperties);
}
return builder.put(Entity.entity(object, acceptMediaType()), genericType);
}
@Override
public Response update(WebTarget webClient, final InputStream object, final String idName,
final Long id,
final Map<String, Object> pathParams, final Map<String, Object> queryParams)
throws Exception {
return update(webClient, object, idName, id, pathParams, queryParams, null);
}
@Override
public Response update(WebTarget webClient, final InputStream object, final String idName,
final Long id,
final Map<String, Object> pathParams, final Map<String, Object> queryParams, final Map<String, Object> builderProperties)
throws Exception {
if (queryParams != null)
webClient = applyQuery(webClient, queryParams);
if (id != null && idName != null)
webClient = webClient.resolveTemplate(idName, id);
if (pathParams != null)
webClient = webClient.resolveTemplates(pathParams);
Builder builder = acceptMediaType(webClient.request());
if (builderProperties != null){
addBuilderProperties(builder, builderProperties);
}
return builder.put(Entity.entity(object, MediaType.APPLICATION_OCTET_STREAM_TYPE));
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#updateStatusReturn(javax.ws.rs.client.WebTarget, org.appverse.web.framework.backend.api.model.integration.AbstractIntegrationBean, java.lang.String, java.lang.Long)
*/
@Override
public StatusResult updateStatusReturn(final WebTarget webClient, final T object,
final String idName, final Long id)
throws Exception {
return updateStatusReturn(webClient, object, idName, id, null, null);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#updateStatusReturn(javax.ws.rs.client.WebTarget, org.appverse.web.framework.backend.api.model.integration.AbstractIntegrationBean, java.lang.String, java.lang.Long, java.util.Map, java.util.Map)
*/
@Override
public StatusResult updateStatusReturn(WebTarget webClient, final T object,
final String idName, final Long id,
final Map<String, Object> pathParams, final Map<String, Object> queryParams)
throws Exception {
return updateStatusReturn(webClient, object, idName, id, pathParams, queryParams, null);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#updateStatusReturn(javax.ws.rs.client.WebTarget, org.appverse.web.framework.backend.api.model.integration.AbstractIntegrationBean, java.lang.String, java.lang.Long, java.util.Map, java.util.Map, java.util.Map)
*/
@Override
public StatusResult updateStatusReturn(WebTarget webClient, final T object,
final String idName, final Long id,
final Map<String, Object> pathParams, final Map<String, Object> queryParams, final Map<String, Object> builderProperties)
throws Exception {
if (queryParams != null)
webClient = applyQuery(webClient, queryParams);
if (id != null && idName != null)
webClient = webClient.resolveTemplate(idName, id);
if (pathParams != null)
webClient = webClient.resolveTemplates(pathParams);
Builder builder = acceptMediaType(webClient.request());
if (builderProperties != null){
addBuilderProperties(builder, builderProperties);
}
Response resp = builder.put(Entity.entity(object, acceptMediaType()));
return getStatusResult(resp);
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#applyQuery(javax.ws.rs.client.WebTarget, java.util.Map)
*/
@Override
public WebTarget applyQuery(WebTarget webClient, final Map<String, Object> queryParams)
throws Exception {
Iterator<String> it = queryParams.keySet().iterator();
while (it.hasNext())
{
String key = it.next();
webClient = webClient.queryParam(key, queryParams.get(key));
}
return webClient;
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#mapPagedResult(javax.ws.rs.core.Response)
*/
@Override
public IntegrationPaginatedResult<T> mapPagedResult(final Response response) throws Exception {
throw new UnsupportedOperationException("You must overwrite 'mapPagedResult' method");
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#getOffsetParamName()
*/
@Override
public String getOffsetParamName() {
return OFFSET_PARAM_NAME;
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#getMaxRecordsParamName()
*/
@Override
public String getMaxRecordsParamName() {
return MAX_RECORDS_PARAM_NAME;
}
/**
* Use reflection to get the actual generic type
*
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
protected Class<T> getClassP() throws Exception {
Method method = this.getClass().getMethod("getTypeSafeList");
Type returnType = method.getGenericReturnType();
Class<T> classP = null;
if (returnType instanceof ParameterizedType) {
ParameterizedType type = (ParameterizedType) returnType;
Type[] typeArguments = type.getActualTypeArguments();
for (Type typeArgument : typeArguments) {
classP = (Class<T>) typeArgument;
System.out.println("typeArgClass = " + classP);
}
}
return classP;
}
/**
* Use reflection to get the actual generic list type
*
* @return
* @throws Exception
*/
protected Type getTypeListP() throws Exception {
return this.getClass().getMethod("getTypeSafeList").getGenericReturnType();
}
/**
* @param builder
* @return
*/
protected Invocation.Builder acceptMediaType(final Invocation.Builder builder)
{
return builder.accept(acceptMediaType());
}
/* (non-Javadoc)
* @see org.appverse.web.framework.backend.rest.services.integration.IRestPersistenceService#acceptMediaType()
*/
@Override
public String acceptMediaType()
{
return MediaType.APPLICATION_JSON;
}
/**
* @param builder
* @param properties
* @return void
*/
protected void addBuilderProperties(Invocation.Builder builder, Map<String, Object> builderProperties){
if (builderProperties != null){
for (Map.Entry<String, Object> entry : builderProperties.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
builder.property(key, value);
}
}
}
/**
* Analyse response to get result code and message
*
* @param resp
* @return
*/
protected StatusResult getStatusResult(final Response resp) throws Exception
{
StatusResult result = new StatusResult();
result.setStatus(resp.getStatus());
result.setLocation(resp.getLocation());
try
{
String output = resp.readEntity(String.class);
if (StringUtils.isNotBlank(output))
result.setMessage(output);
else
result.setMessage(resp.getStatusInfo().getReasonPhrase());
} catch (Exception e) {
}
return result;
}
protected String getKey(final WebTarget webClient)
{
StringBuilder sb = new StringBuilder(webClient.getUri().getPath());
String query = webClient.getUri().getQuery();
if (query != null && !query.isEmpty())
sb.append(query);
return sb.toString();
}
}