package org.apereo.cas.services; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import java.util.List; /** * Implementation of the ServiceRegistryDao based on JPA. * * @author Scott Battaglia * @author Dmitriy Kopylenko * @since 3.1 */ @EnableTransactionManagement(proxyTargetClass = true) @Transactional(transactionManager = "transactionManagerServiceReg", readOnly = false) public class JpaServiceRegistryDaoImpl implements ServiceRegistryDao { @PersistenceContext(unitName = "serviceEntityManagerFactory") private EntityManager entityManager; @Override public boolean delete(final RegisteredService registeredService) { if (this.entityManager.contains(registeredService)) { this.entityManager.remove(registeredService); } else { this.entityManager.remove(this.entityManager.merge(registeredService)); } return true; } @Override public List<RegisteredService> load() { return this.entityManager.createQuery("select r from AbstractRegisteredService r", RegisteredService.class).getResultList(); } @Override public RegisteredService save(final RegisteredService registeredService) { final boolean isNew = registeredService.getId() == RegisteredService.INITIAL_IDENTIFIER_VALUE; final RegisteredService r = this.entityManager.merge(registeredService); if (!isNew) { this.entityManager.persist(r); } return r; } @Override public RegisteredService findServiceById(final long id) { return this.entityManager.find(AbstractRegisteredService.class, id); } @Override public RegisteredService findServiceById(final String id) { return load().stream().filter(r -> r.matches(id)).findFirst().orElse(null); } @Override public long size() { return this.entityManager.createQuery("select count(r) from AbstractRegisteredService r", Long.class).getSingleResult(); } @Override public String toString() { return getClass().getSimpleName(); } }