@Nonnull
  @Override
  protected Event doExecute(
      final @Nonnull RequestContext springRequestContext,
      final @Nonnull ProfileRequestContext profileRequestContext) {

    final ParameterMap params = springRequestContext.getRequestParameters();
    final String service = params.get(ProtocolParam.Service.id());
    if (service == null) {
      return ProtocolError.ServiceNotSpecified.event(this);
    }
    final String ticket = params.get(ProtocolParam.Ticket.id());
    if (ticket == null) {
      return ProtocolError.TicketNotSpecified.event(this);
    }
    final TicketValidationRequest ticketValidationRequest =
        new TicketValidationRequest(service, ticket);

    final String renew = params.get(ProtocolParam.Renew.id());
    if (renew != null) {
      ticketValidationRequest.setRenew(true);
    }
    ticketValidationRequest.setPgtUrl(params.get(ProtocolParam.PgtUrl.id()));

    final MessageContext messageContext = new MessageContext();
    messageContext.setMessage(ticketValidationRequest);
    profileRequestContext.setInboundMessageContext(messageContext);
    FlowStateSupport.setTicketValidationRequest(springRequestContext, ticketValidationRequest);
    return ActionSupport.buildProceedEvent(this);
  }
  /** {@inheritDoc} */
  @Nonnull
  @Override
  protected Event doExecute(
      final @Nonnull RequestContext springRequestContext,
      final @Nonnull ProfileRequestContext<ServiceTicketRequest, Object> profileRequestContext) {

    final ServiceTicketRequest request =
        FlowStateSupport.getServiceTicketRequest(springRequestContext);

    // Per http://www.jasig.org/cas/protocol section 2.1.1
    // It is RECOMMENDED that renew supersede gateway
    if (request.isRenew()) {
      return new Event(this, Events.RenewRequested.id());
    }

    if (request.isGateway()) {
      return new Event(this, Events.GatewayRequested.id());
    }

    final SessionContext sessionCtx =
        profileRequestContext.getSubcontext(SessionContext.class, false);
    Events result;
    if (sessionCtx != null) {
      final IdPSession session = sessionCtx.getIdPSession();
      if (session != null) {
        log.debug("Found session ID {}", session.getId());
        try {
          // Timeout check updates session lastActivityInstant field
          if (session.checkTimeout()) {
            result = Events.SessionFound;
          } else {
            result = Events.SessionNotFound;
          }
        } catch (SessionException e) {
          log.debug("Error performing session timeout check. Assuming session has expired.", e);
          result = Events.SessionNotFound;
        }
      } else {
        log.debug("Session not found.");
        result = Events.SessionNotFound;
      }
    } else {
      log.debug("Session context not found.");
      result = Events.SessionNotFound;
    }
    return result.event(this);
  }