package org.apereo.cas.services;
import org.apache.commons.lang3.ObjectUtils;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
/**
* Default In Memory Service Registry Dao for test/demonstration purposes.
*
* @author Scott Battaglia
* @since 3.1
*/
public class InMemoryServiceRegistry implements ServiceRegistryDao {
private List<RegisteredService> registeredServices = new ArrayList<>();
/**
* Instantiates a new In memory service registry.
*/
public InMemoryServiceRegistry() {
}
/**
* Instantiates a new In memory service registry dao.
*
* @param registeredServices the registered services
*/
public InMemoryServiceRegistry(final List<RegisteredService> registeredServices) {
this.registeredServices = registeredServices;
}
@Override
public boolean delete(final RegisteredService registeredService) {
return this.registeredServices.remove(registeredService);
}
@Override
public RegisteredService findServiceById(final long id) {
return this.registeredServices.stream().filter(r -> r.getId() == id).findFirst().orElse(null);
}
@Override
public RegisteredService findServiceById(final String id) {
return this.registeredServices.stream().filter(r -> r.matches(id)).findFirst().orElse(null);
}
@Override
public List<RegisteredService> load() {
return this.registeredServices;
}
@Override
public RegisteredService save(final RegisteredService registeredService) {
if (registeredService.getId() == RegisteredService.INITIAL_IDENTIFIER_VALUE) {
((AbstractRegisteredService) registeredService).setId(findHighestId() + 1);
}
final RegisteredService svc = findServiceById(registeredService.getId());
if (svc != null) {
this.registeredServices.remove(svc);
}
this.registeredServices.add(registeredService);
return registeredService;
}
public void setRegisteredServices(final List registeredServices) {
this.registeredServices = ObjectUtils.defaultIfNull(registeredServices, new ArrayList<>());
}
/**
* This isn't super-fast but we don't expect thousands of services.
*
* @return the highest service id in the list of registered services
*/
private long findHighestId() {
return this.registeredServices.stream().map(RegisteredService::getId).max(Comparator.naturalOrder()).orElse((long) 0);
}
@Override
public String toString() {
return getClass().getSimpleName();
}
@Override
public long size() {
return registeredServices.size();
}
}