001 /** 002 * Copyright 2005-2013 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 */ 016 package org.kuali.rice.ksb.messaging.dao.impl; 017 018 import org.kuali.rice.core.api.config.CoreConfigHelper; 019 import org.kuali.rice.core.api.exception.RiceRuntimeException; 020 import org.kuali.rice.core.api.util.RiceUtilities; 021 import org.kuali.rice.core.framework.persistence.jpa.criteria.Criteria; 022 import org.kuali.rice.core.framework.persistence.jpa.criteria.QueryByCriteria; 023 import org.kuali.rice.ksb.messaging.PersistedMessageBO; 024 import org.kuali.rice.ksb.messaging.PersistedMessagePayload; 025 import org.kuali.rice.ksb.messaging.dao.MessageQueueDAO; 026 import org.kuali.rice.ksb.util.KSBConstants; 027 028 import javax.persistence.EntityManager; 029 import javax.persistence.PersistenceContext; 030 import javax.persistence.Query; 031 import javax.xml.namespace.QName; 032 import java.util.List; 033 import java.util.Map; 034 035 036 public class MessageQueueDAOJpaImpl implements MessageQueueDAO { 037 038 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(MessageQueueDAOJpaImpl.class); 039 040 @PersistenceContext 041 private EntityManager entityManager; 042 043 @SuppressWarnings("unchecked") 044 public List<PersistedMessageBO> findAll() { 045 if (LOG.isDebugEnabled()) { 046 LOG.debug("Returning all persisted messages"); 047 } 048 049 Query query = entityManager.createNamedQuery("PersistedMessageBO.FindAll"); 050 return (List<PersistedMessageBO>) query.getResultList(); 051 } 052 053 @SuppressWarnings("unchecked") 054 public List<PersistedMessageBO> findAll(int maxRows) { 055 if (LOG.isDebugEnabled()) { 056 LOG.debug("Finding next " + maxRows + " messages"); 057 } 058 059 Query query = entityManager.createNamedQuery("PersistedMessageBO.FindAll"); 060 query.setMaxResults(maxRows); 061 062 return (List<PersistedMessageBO>) query.getResultList(); 063 } 064 065 066 public PersistedMessagePayload findByPersistedMessageByRouteQueueId(Long routeQueueId) { 067 return (PersistedMessagePayload) entityManager.find(PersistedMessagePayload.class, routeQueueId); 068 } 069 070 071 public PersistedMessageBO findByRouteQueueId(Long routeQueueId) { 072 return (PersistedMessageBO) entityManager.find(PersistedMessageBO.class, routeQueueId); 073 } 074 075 @SuppressWarnings("unchecked") 076 public List<PersistedMessageBO> findByServiceName(QName serviceName, String methodName) { 077 if (LOG.isDebugEnabled()) { 078 LOG.debug("Finding messages for service name " + serviceName); 079 } 080 081 Query query = entityManager.createNamedQuery("PersistedMessageBO.FindByServiceName"); 082 query.setParameter("serviceName", serviceName.toString()); 083 query.setParameter("methodName", methodName); 084 085 return (List<PersistedMessageBO>) query.getResultList(); 086 } 087 088 @SuppressWarnings("unchecked") 089 public List<PersistedMessageBO> findByValues(Map<String, String> criteriaValues, int maxRows) { 090 Criteria criteria = new Criteria(PersistedMessageBO.class.getName()); 091 for(Map.Entry<String, String> entry : criteriaValues.entrySet()) { 092 criteria.eq(entry.getKey(), entry.getValue()); 093 } 094 095 QueryByCriteria query = new QueryByCriteria(entityManager, criteria); 096 097 return query.toQuery().getResultList(); 098 } 099 100 @SuppressWarnings("unchecked") 101 public List<PersistedMessageBO> getNextDocuments(Integer maxDocuments) { 102 String applicationId = CoreConfigHelper.getApplicationId(); 103 104 Query query = entityManager.createNamedQuery("PersistedMessageBO.GetNextDocuments"); 105 query.setParameter("applicationId", applicationId); 106 query.setParameter("queueStatus", KSBConstants.ROUTE_QUEUE_EXCEPTION); 107 query.setParameter("ipNumber", RiceUtilities.getIpNumber()); 108 109 if (maxDocuments != null) 110 query.setMaxResults(maxDocuments); 111 112 return (List<PersistedMessageBO>) query.getResultList(); 113 } 114 115 116 public void remove(PersistedMessageBO routeQueue) { 117 if (LOG.isDebugEnabled()) { 118 LOG.debug("Removing message " + routeQueue); 119 } 120 if (routeQueue.getRouteQueueId() == null) { 121 throw new RiceRuntimeException("can't delete a PersistedMessageBO with no id"); 122 } 123 124 routeQueue = entityManager.merge(routeQueue); 125 entityManager.remove(routeQueue); 126 127 if (routeQueue.getPayload() != null) { 128 PersistedMessagePayload payload = entityManager.merge(routeQueue.getPayload()); 129 entityManager.remove(payload); 130 } 131 } 132 133 134 public void save(PersistedMessageBO routeQueue) { 135 if (LOG.isDebugEnabled()) { 136 LOG.debug("Persisting message " + routeQueue); 137 } 138 PersistedMessageBO jpaInstance = entityManager.merge(routeQueue); 139 Long routeQueueId = jpaInstance.getRouteQueueId(); 140 Integer verNo = jpaInstance.getLockVerNbr(); 141 routeQueue.setRouteQueueId(routeQueueId); 142 routeQueue.setLockVerNbr(verNo); 143 144 if (routeQueue.getPayload() != null) { 145 routeQueue.getPayload().setRouteQueueId(routeQueueId); 146 entityManager.merge(routeQueue.getPayload()); 147 } 148 } 149 150 public EntityManager getEntityManager() { 151 return this.entityManager; 152 } 153 154 public void setEntityManager(EntityManager entityManager) { 155 this.entityManager = entityManager; 156 } 157 158 }