// 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.impl.ShardStateEntity; import javax.servlet.http.HttpServletRequest; /** * Request context for {@link WorkerHandler}. * */ final class WorkerHandlerContext<K, V, OK, OV> extends HandlerContext<K, V, OK, OV> { // ------------------------------ FIELDS ------------------------------ private final int shardNumber; private final int sliceNumber; private ShardStateEntity<K, V, OK, OV> shardState; // --------------------------- CONSTRUCTORS --------------------------- WorkerHandlerContext(String jobId, String baseUrl, int shardNumber, int sliceNumber) { super(jobId, baseUrl); this.shardNumber = shardNumber; this.sliceNumber = sliceNumber; } // --------------------- GETTER / SETTER METHODS --------------------- public int getShardNumber() { return shardNumber; } public ShardStateEntity<K, V, OK, OV> getShardState() { if (shardState == null) { shardState = ShardStateEntity.getShardState(getJobId(), shardNumber); } return shardState; } public int getSliceNumber() { return sliceNumber; } // -------------------------- INSTANCE METHODS -------------------------- TaskOptions createTaskOptionsForNextSlice() { int nextSliceNumber = sliceNumber + 1; String taskName = formatTaskName("worker-%s-%d-%d", getJobId(), shardNumber, nextSliceNumber); return Builder.withMethod(Method.POST) .url(getBaseUrl() + MapReduceServletImpl.MAPPER_WORKER_PATH) .param(JOB_ID_PARAMETER_NAME, getJobId()) .param(SHARD_NUMBER_PARAMETER_NAME, String.valueOf(shardNumber)) .param(SLICE_NUMBER_PARAMETER_NAME, String.valueOf(nextSliceNumber)) .taskName(taskName); } // -------------------------- STATIC METHODS -------------------------- public static <K, V, OK, OV> WorkerHandlerContext<K, V, OK, OV> createForNewJob( String jobId, int shardNumber, String baseUrl) { return new WorkerHandlerContext<K, V, OK, OV>(jobId, baseUrl, shardNumber, -1); } public static <K, V, OK, OV> WorkerHandlerContext<K, V, OK, OV> createFromRequest( HttpServletRequest request) { String jobId = request.getParameter(JOB_ID_PARAMETER_NAME); int shardNumber = Integer.parseInt(request.getParameter(SHARD_NUMBER_PARAMETER_NAME)); int sliceNumber = Integer.parseInt(request.getParameter(SLICE_NUMBER_PARAMETER_NAME)); return new WorkerHandlerContext<K, V, OK, OV>(jobId, MapReduceServletImpl.getBase(request), shardNumber, sliceNumber); } }