Java tutorial
/* * Copyright 2007 The JA-SIG Collaborative. All rights reserved. See license * distributed with this file and available online at * http://www.uportal.org/license.html */ package org.jasig.cas.services; import java.util.Collection; import java.util.Collections; import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; import org.jasig.cas.authentication.principal.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * Default implementation of the {@link ServicesManager} interface. If there are * no services registered with the server, it considers the ServicecsManager * disabled and will not prevent any service from using CAS. * * @author Scott Battaglia * @version $Revision: 46386 $ $Date: 2009-07-29 15:31:31 -0400 (Wed, 29 Jul 2009) $ * @since 3.1 */ public final class DefaultServicesManagerImpl implements ReloadableServicesManager { private final Log log = LogFactory.getLog(getClass()); /** Instance of ServiceRegistryDao. */ private ServiceRegistryDao serviceRegistryDao; /** Map to store all services. */ private ConcurrentHashMap<Long, RegisteredService> services = new ConcurrentHashMap<Long, RegisteredService>(); /** Default service to return if none have been registered. */ private RegisteredService disabledRegisteredService; public DefaultServicesManagerImpl(final ServiceRegistryDao serviceRegistryDao) { this(serviceRegistryDao, new String[0]); } /** * Constructs an instance of the {@link DefaultServicesManagerImpl} where the default RegisteredService * can include a set of default attributes to use if no services are defined in the registry. * * @param serviceRegistryDao the Service Registry Dao. * @param defaultAttributes the list of default attributes to use. */ public DefaultServicesManagerImpl(final ServiceRegistryDao serviceRegistryDao, final String[] defaultAttributes) { Assert.notNull(serviceRegistryDao, "serviceRegistryDao cannot be null."); this.serviceRegistryDao = serviceRegistryDao; this.disabledRegisteredService = constructDefaultRegisteredService(defaultAttributes); load(); } @Transactional(readOnly = false) public synchronized RegisteredService delete(final long id) { final RegisteredService r = findServiceBy(id); if (r == null) { return null; } this.serviceRegistryDao.delete(r); this.services.remove(id); return r; } /** * Note, if the repository is empty, this implementation will return a default service to grant all access. * <p> * This preserves default CAS behavior. */ public RegisteredService findServiceBy(final Service service) { final Collection<RegisteredService> c = convertToTreeSet(); if (c.isEmpty()) { return this.disabledRegisteredService; } for (final RegisteredService r : c) { if (r.matches(service)) { return r; } } return null; } public RegisteredService findServiceBy(final long id) { final RegisteredService r = this.services.get(id); try { return r == null ? null : (RegisteredService) r.clone(); } catch (final CloneNotSupportedException e) { return r; } } protected TreeSet<RegisteredService> convertToTreeSet() { return new TreeSet<RegisteredService>(this.services.values()); } public Collection<RegisteredService> getAllServices() { return Collections.unmodifiableCollection(this.services.values()); } public boolean matchesExistingService(final Service service) { return findServiceBy(service) != null; } @Transactional(readOnly = false) public synchronized void save(final RegisteredService registeredService) { final RegisteredService r = this.serviceRegistryDao.save(registeredService); this.services.put(r.getId(), r); } public void reload() { log.info("Reloading registered services."); load(); } private void load() { final ConcurrentHashMap<Long, RegisteredService> localServices = new ConcurrentHashMap<Long, RegisteredService>(); for (final RegisteredService r : this.serviceRegistryDao.load()) { log.debug("Adding registered service " + r.getServiceId()); localServices.put(r.getId(), r); } this.services = localServices; log.info(String.format("Loaded %s services.", this.services.size())); } private RegisteredService constructDefaultRegisteredService(final String[] attributes) { final RegisteredServiceImpl r = new RegisteredServiceImpl(); r.setAllowedToProxy(true); r.setAnonymousAccess(false); r.setEnabled(true); r.setSsoEnabled(true); r.setAllowedAttributes(attributes); if (attributes == null || attributes.length == 0) { r.setIgnoreAttributes(true); } return r; } }