Source:
<code>protected final Assertion parseResponseFromServer(final String response) throws TicketValidationException { final String error = XmlUtils.getTextForElement(response, "authenticationFailure"); if (CommonUtils.isNotBlank(error)) { throw new TicketValidationException(error); } final String principal = XmlUtils.getTextForElement(response, "user"); final String proxyGrantingTicketIou = XmlUtils.getTextForElement(response, "proxyGrantingTicket"); final String proxyGrantingTicket; if (CommonUtils.isBlank(proxyGrantingTicketIou) || this.proxyGrantingTicketStorage == null) { proxyGrantingTicket = null; } else { proxyGrantingTicket = this.proxyGrantingTicketStorage.retrieve(proxyGrantingTicketIou); } if (CommonUtils.isEmpty(principal)) { throw new TicketValidationException("No principal was found in the response from the CAS server."); } <START> final AssertionImpl assertion; <END> final Map<String,Object> attributes = extractCustomAttributes(response); if (CommonUtils.isNotBlank(proxyGrantingTicket)) { final AttributePrincipal attributePrincipal = new AttributePrincipalImpl(principal, attributes, proxyGrantingTicket, this.proxyRetriever); assertion = new AssertionImpl(attributePrincipal); } else { assertion = new AssertionImpl(new AttributePrincipalImpl(principal, attributes)); } final String stringAuthenticationDate = XmlUtils.getTextForElement(response, "authenticationDate"); if (CommonUtils.isNotBlank(stringAuthenticationDate)) { try { Date authenticationDate = CommonUtils.parseFromUtcTime(stringAuthenticationDate); assertion.setAuthenticationDate(authenticationDate); } catch (ParseException e) { log.warn("Unexpected format of authentication date", e); } } customParseResponse(response, assertion); return assertion; }</code><technical_language>note above. Referencing concrete classes extensions difficult implement. If setter() possibly moved a level</technical_language>

Target:
protected final Assertion parseResponseFromServer(final String response) throws TicketValidationException { final String error = XmlUtils.getTextForElement(response, "authenticationFailure"); if (CommonUtils.isNotBlank(error)) { throw new TicketValidationException(error); } final String principal = XmlUtils.getTextForElement(response, "user"); final String proxyGrantingTicketIou = XmlUtils.getTextForElement(response, "proxyGrantingTicket"); final String proxyGrantingTicket; if (CommonUtils.isBlank(proxyGrantingTicketIou) || this.proxyGrantingTicketStorage == null) { proxyGrantingTicket = null; } else { proxyGrantingTicket = this.proxyGrantingTicketStorage.retrieve(proxyGrantingTicketIou); } if (CommonUtils.isEmpty(principal)) { throw new TicketValidationException("No principal was found in the response from the CAS server."); } Date authenticationDate = new Date(); final String stringAuthenticationDate = XmlUtils.getTextForElement(response, "authenticationDate"); if (CommonUtils.isNotBlank(stringAuthenticationDate)) { try { authenticationDate = CommonUtils.parseFromUtcTime(stringAuthenticationDate); } catch (ParseException e) { logger.warn("Unexpected format of authentication date", e); } } final Assertion assertion; final Map<String,Object> attributes = extractCustomAttributes(response); final AttributePrincipal attributePrincipal; if (CommonUtils.isNotBlank(proxyGrantingTicket)) { attributePrincipal = new AttributePrincipalImpl(principal, attributes, proxyGrantingTicket, this.proxyRetriever); } else { attributePrincipal = new AttributePrincipalImpl(principal, attributes); } assertion = new AssertionImpl(attributePrincipal, new Date(), null, authenticationDate, Collections.<String, Object>emptyMap()); customParseResponse(response, assertion); return assertion; }