package org.apereo.cas.services; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.util.Assert; import java.util.List; import java.util.regex.Pattern; /** * <p>Implementation of {@code ServiceRegistryDao} that uses a MongoDb repository as the backend * persistence mechanism. The repository is configured by the Spring application context. </p> * <p>The class will automatically create a default collection to use with services. The name * of the collection may be specified. * It also presents the ability to drop an existing collection and start afresh. * * @author Misagh Moayyed * @since 4.1 */ public class MongoServiceRegistryDao implements ServiceRegistryDao { private static final Logger LOGGER = LoggerFactory.getLogger(MongoServiceRegistryDao.class); private String collectionName; private boolean dropCollection; private MongoOperations mongoTemplate; /** * Ctor. * * @param mongoTemplate mongoTemplate * @param collectionName collectionName * @param dropCollection dropCollection */ public MongoServiceRegistryDao(final MongoOperations mongoTemplate, final String collectionName, final boolean dropCollection) { this.mongoTemplate = mongoTemplate; this.collectionName = collectionName; this.dropCollection = dropCollection; Assert.notNull(this.mongoTemplate); if (this.dropCollection) { LOGGER.debug("Dropping database collection: [{}]", this.collectionName); this.mongoTemplate.dropCollection(this.collectionName); } if (!this.mongoTemplate.collectionExists(this.collectionName)) { LOGGER.debug("Creating database collection: [{}]", this.collectionName); this.mongoTemplate.createCollection(this.collectionName); } } public MongoServiceRegistryDao() { } @Override public boolean delete(final RegisteredService svc) { if (this.findServiceById(svc.getId()) != null) { this.mongoTemplate.remove(svc, this.collectionName); LOGGER.debug("Removed registered service: [{}]", svc); return true; } return false; } @Override public RegisteredService findServiceById(final long svcId) { return this.mongoTemplate.findOne(new Query(Criteria.where("id").is(svcId)), RegisteredService.class, this.collectionName); } @Override public RegisteredService findServiceById(final String id) { final Pattern pattern = Pattern.compile(id, Pattern.CASE_INSENSITIVE); return this.mongoTemplate.findOne(new Query(Criteria.where("serviceId").regex(pattern)), RegisteredService.class, this.collectionName); } @Override public List<RegisteredService> load() { return this.mongoTemplate.findAll(RegisteredService.class, this.collectionName); } @Override public RegisteredService save(final RegisteredService svc) { if (svc.getId() == AbstractRegisteredService.INITIAL_IDENTIFIER_VALUE) { ((AbstractRegisteredService) svc).setId(svc.hashCode()); } this.mongoTemplate.save(svc, this.collectionName); LOGGER.debug("Saved registered service: [{}]", svc); return this.findServiceById(svc.getId()); } @Override public String toString() { return getClass().getSimpleName(); } @Override public long size() { return this.mongoTemplate.count(new Query(), RegisteredService.class, this.collectionName); } }