@Override public void handleStart(Operation start) { ServiceUtils.logInfo(this, "Starting service %s", getSelfLink()); try { // Initialize the task state. State s = start.getBody(State.class); if (s.taskInfo == null || s.taskInfo.stage == TaskState.TaskStage.CREATED) { s.taskInfo = new TaskState(); s.taskInfo.stage = TaskState.TaskStage.STARTED; s.taskInfo.subStage = TaskState.SubStage.UPDATE_DATASTORE_COUNTS; } if (s.documentExpirationTimeMicros <= 0) { s.documentExpirationTimeMicros = ServiceUtils.computeExpirationTime(ServiceUtils.DEFAULT_DOC_EXPIRATION_TIME); } if (s.queryPollDelay == null) { s.queryPollDelay = DEFAULT_QUERY_POLL_DELAY; } validateState(s); start.setBody(s).complete(); sendStageProgressPatch(s, s.taskInfo.stage, s.taskInfo.subStage); } catch (Throwable e) { ServiceUtils.logSevere(this, e); if (!OperationUtils.isCompleted(start)) { start.fail(e); } } }
/** * Patch operation handler. Implements all logic to drive our state machine. * * @param patch */ @Override public void handlePatch(Operation patch) { State currentState = getState(patch); State patchState = patch.getBody(State.class); try { validatePatch(currentState, patchState); applyPatch(currentState, patchState); validateState(currentState); patch.complete(); switch (currentState.taskInfo.stage) { case STARTED: handleStartedStage(currentState, patchState); break; case FAILED: case FINISHED: case CANCELLED: break; default: throw new IllegalStateException( String.format("Invalid stage %s", currentState.taskInfo.stage)); } } catch (Throwable e) { ServiceUtils.logSevere(this, e); if (!OperationUtils.isCompleted(patch)) { patch.fail(e); } } }