// Copyright 2011 Google Inc. All Rights Reserved. package com.google.appengine.tools.mapreduce.impl.handlers; import static com.google.appengine.tools.mapreduce.impl.util.TaskQueueUtil.formatTaskName; import com.google.appengine.api.taskqueue.TaskOptions; import com.google.appengine.api.taskqueue.TaskOptions.Builder; import com.google.appengine.api.taskqueue.TaskOptions.Method; import com.google.appengine.tools.mapreduce.MapperJobSpecification; import com.google.appengine.tools.mapreduce.impl.MapperStateEntity; import javax.servlet.http.HttpServletRequest; /** * Request context for {@link ControllerHandler}. * */ final class ControllerHandlerContext<K, V, OK, OV> extends HandlerContext<K, V, OK, OV> { // ------------------------------ FIELDS ------------------------------ private final int sliceNumber; // --------------------------- CONSTRUCTORS --------------------------- private ControllerHandlerContext(String jobId, String baseUrl, int sliceNumber) { super(jobId, baseUrl); this.sliceNumber = sliceNumber; } private ControllerHandlerContext(String jobId, String baseUrl, int sliceNumber, MapperStateEntity<K, V, OK, OV> state, MapperJobSpecification<K, V, OK, OV> specification) { super(jobId, baseUrl, specification, state); this.sliceNumber = sliceNumber; } // -------------------------- INSTANCE METHODS -------------------------- public TaskOptions createTaskOptionsForNextSlice() { int nextSliceNumber = sliceNumber + 1; String taskName = formatTaskName("controller-%s-%d", getJobId(), nextSliceNumber); return Builder.withMethod(Method.POST) .url(getBaseUrl() + MapReduceServletImpl.CONTROLLER_PATH) .param(JOB_ID_PARAMETER_NAME, getJobId()) .param(SLICE_NUMBER_PARAMETER_NAME, String.valueOf(nextSliceNumber)) .countdownMillis(ControllerHandler.CONTROLLER_DELAY_MS) .taskName(taskName); } // -------------------------- STATIC METHODS -------------------------- static <K, V, OK, OV> ControllerHandlerContext<K, V, OK, OV> createForNewJob(String jobID, MapperJobSpecification<K, V, OK, OV> specification, String baseUrl) { MapperStateEntity<K, V, OK, OV> state = MapperStateEntity.createForNewJob( specification.getJobName(), jobID, System.currentTimeMillis()); state.setSpecification(specification); return new ControllerHandlerContext<K, V, OK, OV>(jobID, baseUrl, -1, state, specification); } static <K, V, OK, OV> ControllerHandlerContext<K, V, OK, OV> createFromRequest( HttpServletRequest request) { String jobId = request.getParameter(JOB_ID_PARAMETER_NAME); int sliceNumber = Integer.parseInt( request.getParameter(SLICE_NUMBER_PARAMETER_NAME)); return new ControllerHandlerContext<K, V, OK, OV>(jobId, MapReduceServletImpl.getBase(request), sliceNumber); } }