Search in sources :

Example 1 with ResponseImpl

use of com.linkedin.restli.internal.client.ResponseImpl in project parseq by linkedin.

the class GetRequestGroup method unbatchResponse.

private static <K, RT extends RecordTemplate> Response<RT> unbatchResponse(BatchGetEntityRequest<K, RT> request, Response<BatchKVResponse<K, EntityResponse<RT>>> batchResponse, Object id) throws RemoteInvocationException {
    final BatchKVResponse<K, EntityResponse<RT>> batchEntity = batchResponse.getEntity();
    final ErrorResponse errorResponse = batchEntity.getErrors().get(id);
    if (errorResponse != null) {
        throw new RestLiResponseException(errorResponse);
    }
    final EntityResponse<RT> entityResponse = batchEntity.getResults().get(id);
    if (entityResponse != null) {
        final RT entityResult = entityResponse.getEntity();
        if (entityResult != null) {
            return new ResponseImpl<>(batchResponse, entityResult);
        }
    }
    LOGGER.debug("No result or error for base URI : {}, id: {}. Verify that the batchGet endpoint returns response keys that match batchGet request IDs.", request.getBaseUriTemplate(), id);
    throw NOT_FOUND_EXCEPTION;
}
Also used : BatchEntityResponse(com.linkedin.restli.internal.client.response.BatchEntityResponse) EntityResponse(com.linkedin.restli.common.EntityResponse) ResponseImpl(com.linkedin.restli.internal.client.ResponseImpl) ErrorResponse(com.linkedin.restli.common.ErrorResponse)

Example 2 with ResponseImpl

use of com.linkedin.restli.internal.client.ResponseImpl in project rest.li by linkedin.

the class MockResponseBuilder method build.

/**
 * Builds a {@link Response} that has been constructed using the setters in this class.
 *
 * @return the constructed {@link Response}
 */
public Response<V> build() {
    Map<String, String> headers = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
    if (_headers != null) {
        headers.putAll(_headers);
    }
    ProtocolVersion protocolVersion = (_protocolVersion == null) ? AllProtocolVersions.BASELINE_PROTOCOL_VERSION : _protocolVersion;
    headers.put(RestConstants.HEADER_RESTLI_PROTOCOL_VERSION, protocolVersion.toString());
    int status = (_status == 0) ? DEFAULT_HTTP_STATUS : _status;
    if (_entity instanceof CreateResponse || _entity instanceof IdResponse) {
        final K id;
        if (_entity instanceof CreateResponse) {
            @SuppressWarnings("unchecked") final CreateResponse<K> createResponse = (CreateResponse<K>) _entity;
            id = createResponse.getId();
        } else {
            @SuppressWarnings("unchecked") final IdResponse<K> idResponse = (IdResponse<K>) _entity;
            id = idResponse.getId();
        }
        headers.put(HeaderUtil.getIdHeaderName(protocolVersion), URIParamUtils.encodeKeyForBody(id, false, protocolVersion));
    }
    List<HttpCookie> cookies = _cookies == null ? Collections.<HttpCookie>emptyList() : _cookies;
    final ResponseImpl<V> response = new ResponseImpl<>(status, headers, cookies, _entity, _restLiResponseException);
    response.setAttachmentReader(_restLiAttachmentReader);
    return response;
}
Also used : IdResponse(com.linkedin.restli.common.IdResponse) CreateResponse(com.linkedin.restli.client.response.CreateResponse) TreeMap(java.util.TreeMap) ProtocolVersion(com.linkedin.restli.common.ProtocolVersion) ResponseImpl(com.linkedin.restli.internal.client.ResponseImpl) HttpCookie(java.net.HttpCookie)

Example 3 with ResponseImpl

use of com.linkedin.restli.internal.client.ResponseImpl in project rest.li by linkedin.

the class BatchGetRequestUtil method unbatchResponse.

/**
 * Extract the get response for this resource out of an auto-batched batch response.
 * This is pure rest.li logic, and it complements the auto-batching logic in BatchGetRequestBuilder.
 * @throws com.linkedin.r2.RemoteInvocationException if the server returned an error response for this resource,
 * or if it returned neither a result nor an error.
 */
public static <T extends RecordTemplate> Response<T> unbatchResponse(Request<BatchResponse<T>> request, Response<BatchResponse<T>> batchResponse, Object id) throws RemoteInvocationException {
    final BatchResponse<T> batchEntity = batchResponse.getEntity();
    final ErrorResponse errorResponse = batchEntity.getErrors().get(id);
    if (errorResponse != null) {
        throw new RestLiResponseException(errorResponse);
    }
    final T entityResult = batchEntity.getResults().get(id);
    if (entityResult == null) {
        throw new RestLiDecodingException("No result or error for base URI " + request.getBaseUriTemplate() + ", id " + id + ". Verify that the batchGet endpoint returns response keys that match batchGet request IDs.", null);
    }
    return new ResponseImpl<>(batchResponse, entityResult);
}
Also used : ResponseImpl(com.linkedin.restli.internal.client.ResponseImpl) ErrorResponse(com.linkedin.restli.common.ErrorResponse)

Example 4 with ResponseImpl

use of com.linkedin.restli.internal.client.ResponseImpl in project rest.li by linkedin.

the class TestDefaultScatterGatherStrategy method createBatchUpdateEntityResponse.

private static Response<BatchKVResponse<Long, UpdateEntityStatus<TestRecord>>> createBatchUpdateEntityResponse(ProtocolVersion version, Set<Long> resultKeys, Set<Long> errorKeys) {
    DataMap resultMap = new DataMap();
    DataMap errorMap = new DataMap();
    for (Long id : resultKeys) {
        resultMap.put(id.toString(), new UpdateEntityStatus<>(HttpStatus.S_200_OK.getCode(), new TestRecord().setId(id)).data());
    }
    for (Long id : errorKeys) {
        ErrorResponse err = new ErrorResponse().setStatus(HttpStatus.S_404_NOT_FOUND.getCode());
        errorMap.put(id.toString(), err.data());
    }
    DataMap responseMap = new DataMap();
    responseMap.put(BatchResponse.RESULTS, resultMap);
    responseMap.put(BatchResponse.ERRORS, errorMap);
    DataMap mergedMap = ResponseDecoderUtil.mergeUpdateStatusResponseData(responseMap);
    BatchUpdateEntityResponse<Long, TestRecord> response = new BatchUpdateEntityResponse<>(mergedMap, new TypeSpec<>(Long.class), new TypeSpec<>(TestRecord.class), Collections.emptyMap(), null, version);
    return new ResponseImpl<>(HttpStatus.S_200_OK.getCode(), Collections.emptyMap(), Collections.emptyList(), response, null);
}
Also used : UpdateEntityStatus(com.linkedin.restli.common.UpdateEntityStatus) TestRecord(com.linkedin.restli.client.test.TestRecord) BatchUpdateEntityResponse(com.linkedin.restli.internal.client.response.BatchUpdateEntityResponse) ResponseImpl(com.linkedin.restli.internal.client.ResponseImpl) DataMap(com.linkedin.data.DataMap) ErrorResponse(com.linkedin.restli.common.ErrorResponse)

Example 5 with ResponseImpl

use of com.linkedin.restli.internal.client.ResponseImpl in project parseq by linkedin.

the class GetRequestGroup method doExecuteBatchGet.

@SuppressWarnings({ "rawtypes", "unchecked" })
private <K, RT extends RecordTemplate> void doExecuteBatchGet(final Client client, final Batch<RestRequestBatchKey, Response<Object>> batch, final Set<Object> ids, final Set<PathSpec> fields, Function<Request<?>, RequestContext> requestContextProvider) {
    final BatchGetEntityRequestBuilder<K, RT> builder = new BatchGetEntityRequestBuilder<>(_baseUriTemplate, _resourceSpec, _requestOptions);
    builder.setHeaders(_headers);
    builder.setCookies(_cookies);
    _queryParams.forEach((key, value) -> builder.setParam(key, value));
    _pathKeys.forEach((key, value) -> builder.pathKey(key, value));
    builder.ids((Set<K>) ids);
    if (fields != null && !fields.isEmpty()) {
        builder.fields(fields.toArray(new PathSpec[fields.size()]));
    }
    final BatchGetEntityRequest<K, RT> batchGet = builder.build();
    client.sendRequest(batchGet, requestContextProvider.apply(batchGet), new Callback<Response<BatchKVResponse<K, EntityResponse<RT>>>>() {

        @Override
        public void onSuccess(Response<BatchKVResponse<K, EntityResponse<RT>>> responseToBatch) {
            final ProtocolVersion version = ProtocolVersionUtil.extractProtocolVersion(responseToBatch.getHeaders());
            batch.entries().stream().forEach(entry -> {
                try {
                    RestRequestBatchKey rrbk = entry.getKey();
                    Request request = rrbk.getRequest();
                    if (request instanceof GetRequest) {
                        successGet((GetRequest) request, responseToBatch, batchGet, entry, version);
                    } else if (request instanceof BatchGetKVRequest) {
                        successBatchGetKV((BatchGetKVRequest) request, responseToBatch, entry, version);
                    } else if (request instanceof BatchGetRequest) {
                        successBatchGet((BatchGetRequest) request, responseToBatch, entry, version);
                    } else if (request instanceof BatchGetEntityRequest) {
                        successBatchGetEntity((BatchGetEntityRequest) request, responseToBatch, entry, version);
                    } else {
                        entry.getValue().getPromise().fail(unsupportedGetRequestType(request));
                    }
                } catch (RemoteInvocationException e) {
                    entry.getValue().getPromise().fail(e);
                }
            });
        }

        @SuppressWarnings({ "deprecation" })
        private void successBatchGetEntity(BatchGetEntityRequest request, Response<BatchKVResponse<K, EntityResponse<RT>>> responseToBatch, Entry<RestRequestBatchKey, BatchEntry<Response<Object>>> entry, final ProtocolVersion version) {
            Set<String> ids = (Set<String>) request.getObjectIds().stream().map(o -> BatchResponse.keyToString(o, version)).collect(Collectors.toSet());
            DataMap dm = filterIdsInBatchResult(responseToBatch.getEntity().data(), ids);
            BatchKVResponse br = new BatchEntityResponse<>(dm, request.getResourceSpec().getKeyType(), request.getResourceSpec().getValueType(), request.getResourceSpec().getKeyParts(), request.getResourceSpec().getComplexKeyType(), version);
            Response rsp = new ResponseImpl(responseToBatch, br);
            entry.getValue().getPromise().done(rsp);
        }

        private void successBatchGet(BatchGetRequest request, Response<BatchKVResponse<K, EntityResponse<RT>>> responseToBatch, Entry<RestRequestBatchKey, BatchEntry<Response<Object>>> entry, final ProtocolVersion version) {
            Set<String> ids = (Set<String>) request.getObjectIds().stream().map(o -> BatchResponse.keyToString(o, version)).collect(Collectors.toSet());
            DataMap dm = filterIdsInBatchResult(responseToBatch.getEntity().data(), ids);
            BatchResponse br = new BatchResponse<>(dm, request.getResponseDecoder().getEntityClass());
            Response rsp = new ResponseImpl(responseToBatch, br);
            entry.getValue().getPromise().done(rsp);
        }

        @SuppressWarnings({ "deprecation" })
        private void successBatchGetKV(BatchGetKVRequest request, Response<BatchKVResponse<K, EntityResponse<RT>>> responseToBatch, Entry<RestRequestBatchKey, BatchEntry<Response<Object>>> entry, final ProtocolVersion version) {
            Set<String> ids = (Set<String>) request.getObjectIds().stream().map(o -> BatchResponse.keyToString(o, version)).collect(Collectors.toSet());
            DataMap dm = filterIdsInBatchResult(responseToBatch.getEntity().data(), ids);
            BatchKVResponse br = new BatchKVResponse(dm, request.getResourceSpec().getKeyType(), request.getResourceSpec().getValueType(), request.getResourceSpec().getKeyParts(), request.getResourceSpec().getComplexKeyType(), version);
            Response rsp = new ResponseImpl(responseToBatch, br);
            entry.getValue().getPromise().done(rsp);
        }

        @SuppressWarnings({ "deprecation" })
        private void successGet(GetRequest request, Response<BatchKVResponse<K, EntityResponse<RT>>> responseToBatch, final BatchGetEntityRequest<K, RT> batchGet, Entry<RestRequestBatchKey, BatchEntry<Response<Object>>> entry, final ProtocolVersion version) throws RemoteInvocationException {
            String idString = BatchResponse.keyToString(request.getObjectId(), version);
            Object id = ResponseUtils.convertKey(idString, request.getResourceSpec().getKeyType(), request.getResourceSpec().getKeyParts(), request.getResourceSpec().getComplexKeyType(), version);
            Response rsp = unbatchResponse(batchGet, responseToBatch, id);
            entry.getValue().getPromise().done(rsp);
        }

        @Override
        public void onError(Throwable e) {
            batch.failAll(e);
        }
    });
}
Also used : ResponseImpl(com.linkedin.restli.internal.client.ResponseImpl) ResourceMethod(com.linkedin.restli.common.ResourceMethod) LoggerFactory(org.slf4j.LoggerFactory) HashMap(java.util.HashMap) Callback(com.linkedin.common.callback.Callback) Function(java.util.function.Function) BatchEntityResponse(com.linkedin.restli.internal.client.response.BatchEntityResponse) HashSet(java.util.HashSet) HttpCookie(java.net.HttpCookie) DataMap(com.linkedin.data.DataMap) BatchKVResponse(com.linkedin.restli.client.response.BatchKVResponse) RestConstants(com.linkedin.restli.common.RestConstants) Map(java.util.Map) EntityResponse(com.linkedin.restli.common.EntityResponse) PathSpec(com.linkedin.data.schema.PathSpec) RestResponseBuilder(com.linkedin.r2.message.rest.RestResponseBuilder) ProtocolVersionUtil(com.linkedin.restli.internal.common.ProtocolVersionUtil) RecordTemplate(com.linkedin.data.template.RecordTemplate) ProtocolVersion(com.linkedin.restli.common.ProtocolVersion) Logger(org.slf4j.Logger) ResourceSpec(com.linkedin.restli.common.ResourceSpec) BatchEntry(com.linkedin.parseq.batching.BatchImpl.BatchEntry) RemoteInvocationException(com.linkedin.r2.RemoteInvocationException) Set(java.util.Set) Batch(com.linkedin.parseq.batching.Batch) Tuple3(com.linkedin.parseq.function.Tuple3) Tuples(com.linkedin.parseq.function.Tuples) Collectors(java.util.stream.Collectors) Objects(java.util.Objects) List(java.util.List) RequestContext(com.linkedin.r2.message.RequestContext) ErrorResponse(com.linkedin.restli.common.ErrorResponse) HttpStatus(com.linkedin.restli.common.HttpStatus) Entry(java.util.Map.Entry) ResponseUtils(com.linkedin.restli.internal.common.ResponseUtils) BatchResponse(com.linkedin.restli.common.BatchResponse) HashSet(java.util.HashSet) Set(java.util.Set) BatchResponse(com.linkedin.restli.common.BatchResponse) ProtocolVersion(com.linkedin.restli.common.ProtocolVersion) PathSpec(com.linkedin.data.schema.PathSpec) BatchKVResponse(com.linkedin.restli.client.response.BatchKVResponse) DataMap(com.linkedin.data.DataMap) RemoteInvocationException(com.linkedin.r2.RemoteInvocationException) BatchEntry(com.linkedin.parseq.batching.BatchImpl.BatchEntry) ResponseImpl(com.linkedin.restli.internal.client.ResponseImpl) BatchEntityResponse(com.linkedin.restli.internal.client.response.BatchEntityResponse) BatchKVResponse(com.linkedin.restli.client.response.BatchKVResponse) EntityResponse(com.linkedin.restli.common.EntityResponse) ErrorResponse(com.linkedin.restli.common.ErrorResponse) BatchResponse(com.linkedin.restli.common.BatchResponse) BatchEntityResponse(com.linkedin.restli.internal.client.response.BatchEntityResponse) EntityResponse(com.linkedin.restli.common.EntityResponse)

Aggregations

ResponseImpl (com.linkedin.restli.internal.client.ResponseImpl)10 ErrorResponse (com.linkedin.restli.common.ErrorResponse)9 DataMap (com.linkedin.data.DataMap)6 TestRecord (com.linkedin.restli.client.test.TestRecord)4 BatchKVResponse (com.linkedin.restli.client.response.BatchKVResponse)3 EntityResponse (com.linkedin.restli.common.EntityResponse)3 BatchEntityResponse (com.linkedin.restli.internal.client.response.BatchEntityResponse)3 BatchResponse (com.linkedin.restli.common.BatchResponse)2 ProtocolVersion (com.linkedin.restli.common.ProtocolVersion)2 BatchUpdateEntityResponse (com.linkedin.restli.internal.client.response.BatchUpdateEntityResponse)2 HttpCookie (java.net.HttpCookie)2 Callback (com.linkedin.common.callback.Callback)1 PathSpec (com.linkedin.data.schema.PathSpec)1 RecordTemplate (com.linkedin.data.template.RecordTemplate)1 Batch (com.linkedin.parseq.batching.Batch)1 BatchEntry (com.linkedin.parseq.batching.BatchImpl.BatchEntry)1 Tuple3 (com.linkedin.parseq.function.Tuple3)1 Tuples (com.linkedin.parseq.function.Tuples)1 RemoteInvocationException (com.linkedin.r2.RemoteInvocationException)1 RequestContext (com.linkedin.r2.message.RequestContext)1