001/** 002 * Copyright 2005-2017 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package org.kuali.rice.ksb.messaging.dao.impl; 017 018import org.kuali.rice.core.api.config.CoreConfigHelper; 019import org.kuali.rice.core.api.exception.RiceRuntimeException; 020import org.kuali.rice.core.api.util.RiceUtilities; 021import org.kuali.rice.ksb.messaging.PersistedMessageBO; 022import org.kuali.rice.ksb.messaging.PersistedMessagePayload; 023import org.kuali.rice.ksb.messaging.dao.MessageQueueDAO; 024import org.kuali.rice.ksb.util.KSBConstants; 025 026import javax.persistence.EntityManager; 027import javax.persistence.Query; 028import javax.persistence.TypedQuery; 029import javax.persistence.criteria.CriteriaBuilder; 030import javax.persistence.criteria.CriteriaQuery; 031import javax.persistence.criteria.Predicate; 032import javax.persistence.criteria.Root; 033import javax.xml.namespace.QName; 034import java.util.List; 035import java.util.Map; 036 037public class MessageQueueDaoJpa implements MessageQueueDAO { 038 039 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(MessageQueueDaoJpa.class); 040 041 private EntityManager entityManager; 042 043 public List<PersistedMessageBO> findAll() { 044 if (LOG.isDebugEnabled()) { 045 LOG.debug("Returning all persisted messages"); 046 } 047 048 Query query = entityManager.createNamedQuery("PersistedMessageBO.FindAll"); 049 return query.getResultList(); 050 } 051 052 @SuppressWarnings("unchecked") 053 public List<PersistedMessageBO> findAll(int maxRows) { 054 if (LOG.isDebugEnabled()) { 055 LOG.debug("Finding next " + maxRows + " messages"); 056 } 057 058 TypedQuery<PersistedMessageBO> query = entityManager.createNamedQuery("PersistedMessageBO.FindAll", 059 PersistedMessageBO.class); 060 query.setMaxResults(maxRows); 061 062 return query.getResultList(); 063 } 064 065 public PersistedMessagePayload findByPersistedMessageByRouteQueueId(Long routeQueueId) { 066 return entityManager.find(PersistedMessagePayload.class, routeQueueId); 067 } 068 069 public PersistedMessageBO findByRouteQueueId(Long routeQueueId) { 070 return entityManager.find(PersistedMessageBO.class, routeQueueId); 071 } 072 073 public List<PersistedMessageBO> findByServiceName(QName serviceName, String methodName) { 074 if (LOG.isDebugEnabled()) { 075 LOG.debug("Finding messages for service name " + serviceName); 076 } 077 078 TypedQuery<PersistedMessageBO> query = entityManager.createNamedQuery("PersistedMessageBO.FindByServiceName", 079 PersistedMessageBO.class); 080 query.setParameter("serviceName", serviceName.toString()); 081 query.setParameter("methodName", methodName); 082 083 return query.getResultList(); 084 } 085 086 public List<PersistedMessageBO> findByValues(Map<String, String> criteriaValues, int maxRows) { 087 CriteriaBuilder builder = entityManager.getCriteriaBuilder(); 088 CriteriaQuery<PersistedMessageBO> query = builder.createQuery(PersistedMessageBO.class); 089 Root<PersistedMessageBO> message = query.from(PersistedMessageBO.class); 090 Predicate predicate = builder.conjunction(); 091 for (Map.Entry<String, String> entry : criteriaValues.entrySet()) { 092 predicate = builder.and(predicate, builder.equal(message.get(entry.getKey()), entry.getValue())); 093 } 094 query.where(predicate); 095 TypedQuery<PersistedMessageBO> typedQuery = entityManager.createQuery(query); 096 return typedQuery.getResultList(); 097 } 098 099 public List<PersistedMessageBO> getNextDocuments(Integer maxDocuments) { 100 String applicationId = CoreConfigHelper.getApplicationId(); 101 102 TypedQuery<PersistedMessageBO> query = entityManager.createNamedQuery("PersistedMessageBO.GetNextDocuments", 103 PersistedMessageBO.class); 104 query.setParameter("applicationId", applicationId); 105 query.setParameter("queueStatus", KSBConstants.ROUTE_QUEUE_EXCEPTION); 106 query.setParameter("ipNumber", RiceUtilities.getIpNumber()); 107 108 if (maxDocuments != null) { 109 query.setMaxResults(maxDocuments); 110 } 111 112 return query.getResultList(); 113 } 114 115 public void remove(PersistedMessageBO routeQueue) { 116 if (LOG.isDebugEnabled()) { 117 LOG.debug("Removing message " + routeQueue); 118 } 119 if (routeQueue.getRouteQueueId() == null) { 120 throw new RiceRuntimeException("can't delete a PersistedMessageBO with no id"); 121 } 122 123 routeQueue = entityManager.merge(routeQueue); 124 entityManager.remove(routeQueue); 125 126 if (routeQueue.getPayload() != null) { 127 PersistedMessagePayload payload = entityManager.merge(routeQueue.getPayload()); 128 entityManager.remove(payload); 129 } 130 } 131 132 public PersistedMessageBO save(PersistedMessageBO routeQueue) { 133 if (LOG.isDebugEnabled()) { 134 LOG.debug("Persisting message " + routeQueue); 135 } 136 routeQueue = entityManager.merge(routeQueue); 137 entityManager.flush(); 138 PersistedMessagePayload payload = routeQueue.getPayload(); 139 if (payload != null) { 140 payload.setRouteQueueId(routeQueue.getRouteQueueId()); 141 payload = entityManager.merge(payload); 142 entityManager.flush(); 143 routeQueue.setPayload(payload); 144 } 145 return routeQueue; 146 } 147 148 public EntityManager getEntityManager() { 149 return this.entityManager; 150 } 151 152 public void setEntityManager(EntityManager entityManager) { 153 this.entityManager = entityManager; 154 } 155 156}