package org.apereo.cas.authentication.principal;
import org.apache.commons.lang3.StringUtils;
import org.apereo.cas.CasProtocolConstants;
import org.apereo.cas.validation.ValidationResponseType;
import org.apereo.cas.web.support.WebUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
/**
* The {@link WebApplicationServiceFactory} is responsible for
* creating {@link WebApplicationService} objects.
*
* @author Misagh Moayyed
* @since 4.2
*/
public class WebApplicationServiceFactory extends AbstractServiceFactory<WebApplicationService> {
private static final Logger LOGGER = LoggerFactory.getLogger(WebApplicationServiceFactory.class);
@Override
public WebApplicationService createService(final HttpServletRequest request) {
final String serviceToUse = getRequestedService(request);
if (StringUtils.isBlank(serviceToUse)) {
LOGGER.debug("No service is specified in the request. Skipping service creation");
return null;
}
return newWebApplicationService(request, serviceToUse);
}
/**
* Determine web application format boolean.
*
* @param request the request
* @param webApplicationService the web application service
* @return the service itself.
*/
private static AbstractWebApplicationService determineWebApplicationFormat(final HttpServletRequest request,
final AbstractWebApplicationService webApplicationService) {
final String format = request != null ? request.getParameter(CasProtocolConstants.PARAMETER_FORMAT) : null;
try {
if (StringUtils.isNotBlank(format)) {
final ValidationResponseType formatType = ValidationResponseType.valueOf(format.toUpperCase());
webApplicationService.setFormat(formatType);
}
} catch (final Exception e) {
LOGGER.error("Format specified in the request [{}] is not recognized", format);
}
return webApplicationService;
}
/**
* Build new web application service simple web application service.
*
* @param request the request
* @param serviceToUse the service to use
* @return the simple web application service
*/
protected static AbstractWebApplicationService newWebApplicationService(final HttpServletRequest request,
final String serviceToUse) {
final String artifactId = request != null ? request.getParameter(CasProtocolConstants.PARAMETER_TICKET) : null;
final String id = cleanupUrl(serviceToUse);
final AbstractWebApplicationService newService = new SimpleWebApplicationServiceImpl(id, serviceToUse, artifactId);
determineWebApplicationFormat(request, newService);
return newService;
}
/**
* Gets requested service.
*
* @param request the request
* @return the requested service
*/
protected String getRequestedService(final HttpServletRequest request) {
final String targetService = request.getParameter(CasProtocolConstants.PARAMETER_TARGET_SERVICE);
final String service = request.getParameter(CasProtocolConstants.PARAMETER_SERVICE);
final Object serviceAttribute = request.getAttribute(CasProtocolConstants.PARAMETER_SERVICE);
String serviceToUse = null;
if (StringUtils.isNotBlank(targetService)) {
serviceToUse = targetService;
} else if (StringUtils.isNotBlank(service)) {
serviceToUse = service;
} else if (serviceAttribute != null) {
if (serviceAttribute instanceof Service) {
serviceToUse = ((Service) serviceAttribute).getId();
} else {
serviceToUse = serviceAttribute.toString();
}
}
if (StringUtils.isBlank(serviceToUse)) {
return null;
}
return serviceToUse;
}
@Override
public WebApplicationService createService(final String id) {
return newWebApplicationService(WebUtils.getHttpServletRequestFromRequestAttributes(), id);
}
}