ResponseContext responseContext = new ResponseContext(new LinkedHashMap<>()); if (throwable instanceof ResponseException) { ResponseException responseException = (ResponseException) throwable; responseContext.put(ResponseContextKeys.STATUS.getName(), responseException.getStatusCode()); responseContext.put(ResponseContextKeys.ERROR_MESSAGE.getName(), responseException.getReason()); } else { responseContext.put( ResponseContextKeys.STATUS.getName(), Response.Status.INTERNAL_SERVER_ERROR.getStatusCode() ); responseContext.put(ResponseContextKeys.ERROR_MESSAGE.getName(), throwable.getMessage());
/** * Build complete response. * * @param preResponse PreResponse object which contains result set, response context and headers * @param apiRequest ApiRequest object which contains request related information * @param containerRequestContext The container for jersey request processing objects * * @return Completely built response with headers and result set */ public javax.ws.rs.core.Response buildResponse( PreResponse preResponse, ApiRequest apiRequest, ContainerRequestContext containerRequestContext ) { ResponseBuilder rspBuilder = createResponseBuilder( preResponse.getResultSet(), preResponse.getResponseContext(), apiRequest, containerRequestContext ); @SuppressWarnings("unchecked") MultivaluedMap<String, Object> headers = (MultivaluedMap<String, Object>) preResponse .getResponseContext() .get(HEADERS.getName()); //Headers are a multivalued map, and we want to add each element of each value to the builder. headers.entrySet().stream() .forEach(entry -> entry.getValue().forEach(value -> rspBuilder.header(entry.getKey(), value))); return rspBuilder.build(); }
@Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } ResponseContext that = (ResponseContext) o; return super.equals(o) && Objects.equals(this.getDimensionToDimensionFieldMap(), that.getDimensionToDimensionFieldMap()); }
/** * Adds all the required pagination links to the headers and body of the response. * * @param pages The paginated set of results containing the pages being linked to. * @param uriBuilder The uri builder to build the links * @param responseProcessor The response processor whose links are being built */ public static void addLinks( Pagination<?> pages, UriBuilder uriBuilder, MappingResponseProcessor responseProcessor ) { LinkedHashMap<String, URI> bodyLinks = new LinkedHashMap<>(); Arrays.stream(PaginationLink.values()) .forEachOrdered(link -> addLink(link, pages, uriBuilder, responseProcessor, bodyLinks)); ResponseContext responseContext = responseProcessor.getResponseContext(); responseContext.put(ResponseContextKeys.PAGINATION_LINKS_CONTEXT_KEY.getName(), bodyLinks); responseContext.put(ResponseContextKeys.PAGINATION_CONTEXT_KEY.getName(), pages); }
/** * Constructor. * * @param apiRequest The request for which the response is being processed * @param objectMappers Jackson mappers to use for processing JSON */ public MappingResponseProcessor(DataApiRequest apiRequest, ObjectMappersSuite objectMappers) { this.apiRequest = apiRequest; this.mappers = buildResultSetMapperList(apiRequest); this.headers = buildHeaderList(); this.responseContext = new ResponseContext(apiRequest.getDimensionFields()); this.objectMappers = objectMappers; }
ResponseContext responseContext = preResponse.getResponseContext(); if (responseContext.containsKey(ResponseContextKeys.STATUS.getName())) { ResponseException responseException = new ResponseException( (Integer) responseContext.get(ResponseContextKeys.STATUS.getName()), (String) responseContext.get(ResponseContextKeys.ERROR_MESSAGE.getName()), (String) responseContext.get(ResponseContextKeys.ERROR_MESSAGE.getName()),
.map(responseContext -> responseContext.containsKey(ResponseContextKeys.ERROR_MESSAGE.getName())) .map(isError -> isError ? updateField(jobMetadata, STATUS, FAILURE.getName()) :
apiMetricColumnNames.add("pageViews"); ResponseContext responseContext = new ResponseContext(); responseContext.put("headers", new MultivaluedHashMap<>()); responseContext.put("apiMetricColumnNames", apiMetricColumnNames); responseContext.put("requestedApiDimensionFields", new LinkedHashMap<>()); ResponseContext errorResponseContext = new ResponseContext(); errorResponseContext.put("headers", new MultivaluedHashMap<>()); errorResponseContext.put(ResponseContextKeys.STATUS.getName(), 500); errorResponseContext.put(ResponseContextKeys.ERROR_MESSAGE.getName(), "Error"); errorResponseContext.put("apiMetricColumnNames", apiMetricColumnNames); errorResponseContext.put("requestedApiDimensionFields", new HashMap<>()); PreResponse errorPresResponse = new PreResponse(resultSet, errorResponseContext); preResponseStore.save("errorPreResponse", errorPresResponse);
@SuppressWarnings("unchecked") ResponseFormatType responseFormatType = apiRequest.getFormat(); Map<String, URI> bodyLinks = (Map<String, URI>) responseContext.get( PAGINATION_LINKS_CONTEXT_KEY.getName() ); bodyLinks = Collections.emptyMap(); Pagination pagination = (Pagination) responseContext.get(PAGINATION_CONTEXT_KEY.getName()); (LinkedHashMap<String, LinkedHashSet<DimensionField>>) responseContext.get( REQUESTED_API_DIMENSION_FIELDS.getName()); (LinkedHashSet<String>) responseContext.get(API_METRIC_COLUMN_NAMES.getName()), requestedApiDimensionFields, getPartialIntervalsWithDefault(responseContext),
apiMetricColumnNames.add("pageViews"); ResponseContext responseContext = new ResponseContext(); responseContext.put("headers", new MultivaluedHashMap<>()); responseContext.put("apiMetricColumnNames", apiMetricColumnNames); responseContext.put("requestedApiDimensionFields", new LinkedHashMap<>()); ResponseContext errorResponseContext = new ResponseContext(); errorResponseContext.put("headers", new MultivaluedHashMap<>()); errorResponseContext.put(ResponseContextKeys.STATUS.getName(), 500); errorResponseContext.put(ResponseContextKeys.ERROR_MESSAGE.getName(), "Error"); errorResponseContext.put("apiMetricColumnNames", apiMetricColumnNames); errorResponseContext.put("requestedApiDimensionFields", new HashMap<>()); PreResponse errorPresResponse = new PreResponse(resultSet, errorResponseContext); preResponseStore.save("errorPreResponse", errorPresResponse);
@Override public boolean handleRequest( RequestContext context, DataApiRequest request, DruidAggregationQuery<?> druidQuery, ResponseProcessor response ) { if (!(response instanceof MappingResponseProcessor)) { throw new IllegalStateException("Volatile data request handler requires a mapping response."); } MappingResponseProcessor mappingResponse = (MappingResponseProcessor) response; // Gather the volatile intervals. A volatile interval in one data source make that interval volatile overall. SimplifiedIntervalList volatileIntervals = volatileIntervalsService.getVolatileIntervals( druidQuery.getGranularity(), druidQuery.getIntervals(), physicalTableDictionary.get( druidQuery .getInnermostQuery() .getDataSource() .getPhysicalTable() .getName() ) ); if (!volatileIntervals.isEmpty()) { ResponseContext responseContext = response.getResponseContext(); responseContext.put(VOLATILE_INTERVALS_CONTEXT_KEY.getName(), volatileIntervals); } return next.handleRequest(context, request, druidQuery, mappingResponse); }