package org.apereo.cas.support.events.jpa; import org.apereo.cas.support.events.dao.AbstractCasEventRepository; import org.apereo.cas.support.events.dao.CasEvent; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import java.time.ZonedDateTime; import java.util.Collection; /** * This is {@link JpaCasEventRepository} that stores event data into a RDBMS database. * * @author Misagh Moayyed * @since 5.0.0 */ @EnableTransactionManagement(proxyTargetClass = true) @Transactional(transactionManager = "transactionManagerEvents") public class JpaCasEventRepository extends AbstractCasEventRepository { private static final String SELECT_QUERY = "SELECT r from CasEvent r "; @PersistenceContext(unitName = "eventsEntityManagerFactory") private EntityManager entityManager; @Override public String toString() { return getClass().getSimpleName(); } @Override public void save(final CasEvent event) { this.entityManager.merge(event); } @Override public Collection<CasEvent> load() { return this.entityManager.createQuery(SELECT_QUERY.trim(), CasEvent.class).getResultList(); } @Override public Collection<CasEvent> getEventsForPrincipal(final String id) { return this.entityManager.createQuery(SELECT_QUERY.concat("where r.principalId = :principalId"), CasEvent.class).setParameter(PRINCIPAL_ID_PARAM, id).getResultList(); } @Override public Collection<CasEvent> load(final ZonedDateTime dateTime) { return this.entityManager.createQuery(SELECT_QUERY.concat("where r.creationTime >= :creationTime"), CasEvent.class).setParameter(CREATION_TIME_PARAM, dateTime.toString()).getResultList(); } @Override public Collection<CasEvent> getEventsOfTypeForPrincipal(final String type, final String principal, final ZonedDateTime dateTime) { return this.entityManager.createQuery( SELECT_QUERY.concat("where r.type = :type and r.creationTime >= :creationTime and r.principalId = :principalId"), CasEvent.class) .setParameter(TYPE_PARAM, type) .setParameter(PRINCIPAL_ID_PARAM, principal) .setParameter(CREATION_TIME_PARAM, dateTime.toString()) .getResultList(); } @Override public Collection<CasEvent> getEventsOfType(final String type, final ZonedDateTime dateTime) { return this.entityManager.createQuery( SELECT_QUERY.concat("where r.type = :type and r.creationTime >= :creationTime"), CasEvent.class) .setParameter(TYPE_PARAM, type) .setParameter(CREATION_TIME_PARAM, dateTime.toString()) .getResultList(); } @Override public Collection<CasEvent> getEventsForPrincipal(final String id, final ZonedDateTime dateTime) { return this.entityManager.createQuery( SELECT_QUERY.concat("where r.principalId = :principalId and r.creationTime >= :creationTime"), CasEvent.class) .setParameter(PRINCIPAL_ID_PARAM, id) .setParameter(CREATION_TIME_PARAM, dateTime.toString()) .getResultList(); } @Override public Collection<CasEvent> getEventsOfType(final String type) { return this.entityManager.createQuery( SELECT_QUERY.concat("where r.type = :type"), CasEvent.class) .setParameter(TYPE_PARAM, type) .getResultList(); } @Override public Collection<CasEvent> getEventsOfTypeForPrincipal(final String type, final String principal) { return this.entityManager.createQuery( SELECT_QUERY.concat("where r.type = :type and r.principalId = :principalId"), CasEvent.class) .setParameter(TYPE_PARAM, type) .setParameter(PRINCIPAL_ID_PARAM, principal) .getResultList(); } }