protected ModelAndView handleRequestInternal(HttpRequest request, HttpResponse response)
        {
            WebApplicationService service = this.argumentExtractor.extractService(request);
            string serviceTicketId = service != null ? service.getArtifactId() : null;

            if (service == null || serviceTicketId == null)
            {
                //if (logger.isDebugEnabled()) {
                //    logger.debug(string.format("Could not process request; Service: %s, Service Ticket Id: %s", service, serviceTicketId));
                //}
                return this.generateErrorView("INVALID_REQUEST", "INVALID_REQUEST", null);
            }

            try
            {
                Credentials serviceCredentials = this.getServiceCredentialsFromRequest(request);
                string proxyGrantingTicketId = null;

                // XXX should be able to validate AND THEN use
                if (serviceCredentials != null)
                {
                    try
                    {
                        proxyGrantingTicketId = this.centralAuthenticationService
                            .delegateTicketGrantingTicket(serviceTicketId,
                                                          serviceCredentials);
                    }
                    catch (TicketException e)
                    {
                        //logger.error("TicketException generating ticket for: "
                        //    + serviceCredentials, e);
                    }
                }

                Assertion assertion = this.centralAuthenticationService.validateServiceTicket(serviceTicketId, service);

                ValidationSpecification validationSpecification = this.getCommandClass();
                ServletRequestDataBinder binder = new ServletRequestDataBinder(validationSpecification, "validationSpecification");
                this.initBinder(request, binder);
                binder.bind(request);

                if (!validationSpecification.isSatisfiedBy(assertion))
                {
                    //if (logger.isDebugEnabled()) {
                    //    logger.debug("ServiceTicket [" + serviceTicketId + "] does not satisfy validation specification.");
                    //}
                    return this.generateErrorView("INVALID_TICKET", "INVALID_TICKET_SPEC", null);
                }

                this.onSuccessfulValidation(serviceTicketId, assertion);

                ModelAndView success = new ModelAndView(this.successView);
                success.addObject(MODEL_ASSERTION, assertion);

                if (serviceCredentials != null && proxyGrantingTicketId != null)
                {
                    string proxyIou = this.proxyHandler.handle(serviceCredentials, proxyGrantingTicketId);
                    success.addObject(MODEL_PROXY_GRANTING_TICKET_IOU, proxyIou);
                }

                //if (logger.isDebugEnabled()) {
                //    logger.debug(string.format("Successfully validated service ticket: %s", serviceTicketId));
                //}

                return success;
            }
            catch (TicketValidationException e)
            {
                return this.generateErrorView(e.getCode(), e.getCode(), new Object[] { serviceTicketId, e.getOriginalService().getId(), service.getId() });
            }
            catch (TicketException te)
            {
                return this.generateErrorView(te.getCode(), te.getCode(),
                                         new Object[] { serviceTicketId });
            }
            catch (UnauthorizedServiceException e)
            {
                //return generateErrorView(e.getMessage(), e.getMessage(), null);
                throw new NotImplementedException();
            }
        }
 protected void initBinder(HttpRequest request, ServletRequestDataBinder binder)
 {
     binder.setRequiredFields("renew");
 }