protected void executePhase(HyperionContext phaseContext) throws Exception
{
if(serviceStatus.getForceDown())
throw new ServiceUnavailableException("Service not available");
HyperionRequest request = phaseContext.getEndpointRequest();
HyperionResponse response = phaseContext.getEndpointResponse();
UriRequestResult uriRequestResult = uriParser.parseRequestUri(request.getResourceUri());
if(uriRequestResult == null)
throw new NotFoundException(String.format("%s is not recognized.",request.getResourceUri()));
String entityName = uriRequestResult.getEndpoint();
EntityPlugin plugin = serviceRegistry.getPluginForName(entityName);
if(plugin == null)
throw new NotFoundException(String.format("%s is not a valid entity.",entityName));
phaseContext.setEntityPlugin(plugin);
phaseContext.setRequestMethod(getHttpMethod(request.getRequestMethod()));
String requestMethod = getEffectiveMethod(request);
HttpMethod httpMethod = getHttpMethod(requestMethod);
if(!plugin.isMethodAllowed(httpMethod))
throw new NotAllowedException(String.format("%s is not allowed.",httpMethod));
if(serviceStatus.getReadOnly() && httpMethod.isWriteOperation())
throw new NotAllowedException("Service is in read only mode.");
phaseContext.setEffectiveMethod(httpMethod);
// special case where version is in the URI
String version = uriRequestResult.getVersion();
if(version == null || version.length() == 0)
{
version = request.getFirstParameter(hyperionEndpointConfiguration.getVersionParameterName());
if(version == null || version.length() == 0)
version = request.getFirstHeader(hyperionEndpointConfiguration.getVersionHeaderName());
if(hyperionEndpointConfiguration.isRequireVersion() && httpMethod != HttpMethod.DELETE &&
(version == null || version.length()==0))
throw new BadRequestException(String.format("The %s parameter must be specified",
hyperionEndpointConfiguration.getVersionParameterName()));