package com.linkedin.restli.internal.server.util;
import com.linkedin.r2.message.rest.RestRequest;
import com.linkedin.restli.internal.server.RoutingResult;
import com.linkedin.restli.internal.server.ServerResourceContext;
import com.linkedin.restli.internal.server.filter.FilterRequestContextInternal;
import com.linkedin.restli.internal.server.methods.MethodAdapterRegistry;
import com.linkedin.restli.internal.server.methods.arguments.RestLiArgumentBuilder;
import com.linkedin.restli.internal.server.response.ErrorResponseBuilder;
import com.linkedin.restli.internal.server.model.ResourceMethodDescriptor;
import com.linkedin.restli.server.RestLiRequestData;
import com.linkedin.restli.server.RestLiServiceException;
/**
* Created by gye on 6/27/16.
*
* Provides utility functions for the RestLiServer
*/
public class RestLiServerUtils
{
/**
* Validates REST headers and updates the RoutingResult with the header
*
* @param request
* {@link RestRequest}
* @param method
* {@link RoutingResult}
* @throws RestLiServiceException
* {@link RestLiServiceException}
*/
public static void checkHeadersAndUpdateContext(RestRequest request, RoutingResult method)
throws RestLiServiceException
{
RestUtils.validateRequestHeadersAndUpdateResourceContext(request.getHeaders(),
(ServerResourceContext)method.getContext());
}
/**
* Builds a RestLiArgument builder
*
* @param method
* {@link RoutingResult}
* @param errorResponseBuilder
* {@link ErrorResponseBuilder}
* @return
*/
public static RestLiArgumentBuilder buildRestLiArgumentBuilder(RoutingResult method,
ErrorResponseBuilder errorResponseBuilder)
{
ResourceMethodDescriptor resourceMethodDescriptor = method.getResourceMethod();
RestLiArgumentBuilder adapter = new MethodAdapterRegistry(errorResponseBuilder)
.getArgumentBuilder(resourceMethodDescriptor.getType());
if (adapter == null)
{
throw new IllegalArgumentException("Unsupported method type: " + resourceMethodDescriptor.getType());
}
return adapter;
}
/**
* Updates the filter request context with the request data
*
* @param filterContext
* {@link FilterRequestContextInternal}
* @param adapter
* {@link RestLiArgumentBuilder}
* @param request
* {@link RestRequest}
* @param method
* {@link RoutingResult}
*/
public static void updateFilterRequestContext(FilterRequestContextInternal filterContext,
RestLiArgumentBuilder adapter,
RestRequest request,
RoutingResult method)
{
RestLiRequestData requestData = adapter.extractRequestData(method, request);
filterContext.setRequestData(requestData);
}
}