package org.apereo.cas.services; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.PostConstruct; import java.util.List; /** * Initializes a given service registry data store with available * JSON service definitions if necessary (based on configuration flag). * * @author Dmitriy Kopylenko * @author Misagh Moayyed * @since 5.0.0 */ public class ServiceRegistryInitializer { private static final Logger LOGGER = LoggerFactory.getLogger(ServiceRegistryInitializer.class); private ServiceRegistryDao serviceRegistryDao; private ServiceRegistryDao jsonServiceRegistryDao; private ServicesManager servicesManager; private boolean initFromJson; public ServiceRegistryInitializer() { } public ServiceRegistryInitializer(final ServiceRegistryDao jsonServiceRegistryDao, final ServiceRegistryDao serviceRegistryDao, final ServicesManager servicesManager, final boolean initFromJson) { this.jsonServiceRegistryDao = jsonServiceRegistryDao; this.serviceRegistryDao = serviceRegistryDao; this.servicesManager = servicesManager; this.initFromJson = initFromJson; } /** * Init service registry if necessary. */ @PostConstruct public void initServiceRegistryIfNecessary() { final long size = this.serviceRegistryDao.size(); LOGGER.debug("Service registry contains [{}] service definitions", size); if (!this.initFromJson) { LOGGER.info("The service registry database will not be initialized from default JSON services. " + "If the service registry database ends up empty, CAS will refuse to authenticate services " + "until service definitions are added to the registry. To auto-initialize the service registry, " + "set 'cas.serviceRegistry.initFromJson=true' in your CAS settings."); return; } LOGGER.debug("Service registry will be auto-initialized from default JSON services"); final List<RegisteredService> servicesLoaded = this.jsonServiceRegistryDao.load(); LOGGER.debug("Loading JSON services are [{}]", servicesLoaded); for (final RegisteredService r : servicesLoaded) { RegisteredService match = this.serviceRegistryDao.findServiceById(r.getServiceId()); if (match != null) { LOGGER.warn("Skipping [{}] JSON service definition as a matching service [{}] is found in the registry", r.getName(), match.getName()); continue; } match = this.serviceRegistryDao.findServiceById(r.getId()); if (match != null) { LOGGER.warn("Skipping [{}] JSON service definition as a matching numeric id [{}] is found in the registry", r.getName(), match.getId()); continue; } LOGGER.debug("Initializing service registry with the [{}] JSON service definition...", r); this.serviceRegistryDao.save(r); } this.servicesManager.load(); LOGGER.info("Service registry contains [{}] service definitions", this.servicesManager.count()); } }