package voldemort.rest; import org.apache.log4j.Logger; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.handler.codec.http.HttpRequest; import org.jboss.netty.handler.codec.http.HttpResponseStatus; import voldemort.store.CompositeGetAllVoldemortRequest; import voldemort.store.CompositeGetVersionVoldemortRequest; import voldemort.store.CompositeGetVoldemortRequest; import voldemort.store.CompositeVoldemortRequest; import voldemort.utils.ByteArray; /** * This class is used to parse incoming get and get all requests. Parses and * validates the REST Request and constructs a CompositeVoldemortRequestObject. * Also Handles exceptions specific to get and get all operations. */ public class RestGetRequestValidator extends RestRequestValidator { protected boolean isGetVersionRequest = false; private final Logger logger = Logger.getLogger(RestGetRequestValidator.class); public RestGetRequestValidator(HttpRequest request, MessageEvent messageEvent) { super(request, messageEvent); } /** * Validations specific to GET and GET ALL */ @Override public boolean parseAndValidateRequest() { if(!super.parseAndValidateRequest()) { return false; } isGetVersionRequest = hasGetVersionRequestHeader(); if(isGetVersionRequest && this.parsedKeys.size() > 1) { RestErrorHandler.writeErrorResponse(messageEvent, HttpResponseStatus.BAD_REQUEST, "Get version request cannot have multiple keys"); return false; } return true; } public boolean hasGetVersionRequestHeader() { boolean result = false; String headerValue = this.request.getHeader(RestMessageHeaders.X_VOLD_GET_VERSION); if(headerValue != null) { result = true; } return result; } @Override public CompositeVoldemortRequest<ByteArray, byte[]> constructCompositeVoldemortRequestObject() { if(parseAndValidateRequest()) { if(this.isGetVersionRequest) { if(logger.isDebugEnabled()) { debugLog("GET_VERSION", System.currentTimeMillis()); } this.requestObject = new CompositeGetVersionVoldemortRequest<ByteArray, byte[]>(this.parsedKeys.get(0), this.parsedTimeoutInMs, this.parsedRequestOriginTimeInMs, this.parsedRoutingType); } else if(this.parsedKeys.size() > 1) { if(logger.isDebugEnabled()) { debugLog("GET_ALL", System.currentTimeMillis()); } this.requestObject = new CompositeGetAllVoldemortRequest<ByteArray, byte[]>(this.parsedKeys, this.parsedTimeoutInMs, this.parsedRequestOriginTimeInMs, this.parsedRoutingType); } else { if(logger.isDebugEnabled()) { debugLog("GET", System.currentTimeMillis()); } this.requestObject = new CompositeGetVoldemortRequest<ByteArray, byte[]>(this.parsedKeys.get(0), this.parsedTimeoutInMs, this.parsedRequestOriginTimeInMs, this.parsedRoutingType); } return this.requestObject; } // Return null if request is not valid return null; } }