package org.apereo.cas.web.support; import org.apereo.cas.authentication.principal.ServiceFactory; import org.apereo.cas.authentication.principal.WebApplicationService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServletRequest; import java.util.List; import java.util.Objects; /** * The default argument extractor is responsible for creating service * objects based on requests. The task of creating services is delegated to * a service factory that is pluggable for each instance of the extractor. * * @author Misagh Moayyed * @since 4.2 */ public class DefaultArgumentExtractor extends AbstractArgumentExtractor { private static final Logger LOGGER = LoggerFactory.getLogger(DefaultArgumentExtractor.class); /** * Instantiates a new argument extractor. * * @param serviceFactory the service factory */ public DefaultArgumentExtractor(final ServiceFactory<? extends WebApplicationService> serviceFactory) { super(serviceFactory); } /** * Instantiates a new argument extractor. * * @param serviceFactoryList the service factory list */ public DefaultArgumentExtractor(final List<ServiceFactory<? extends WebApplicationService>> serviceFactoryList) { super(serviceFactoryList); } @Override public WebApplicationService extractServiceInternal(final HttpServletRequest request) { return getServiceFactories().stream().map(factory -> { final WebApplicationService service = factory.createService(request); if (service != null) { LOGGER.debug("Created [{}] based on [{}]", service, factory); return service; } return null; }).filter(Objects::nonNull).findFirst().orElseGet(() -> { LOGGER.debug("No service could be extracted based on the given request"); return null; }); } }