001/**
002 * Copyright 2011-2013 The Kuali Foundation Licensed under the
003 * Educational Community License, Version 2.0 (the "License"); you may
004 * not use this file except in compliance with the License. You may
005 * obtain a copy of the License at
006 *
007 * http://www.osedu.org/licenses/ECL-2.0
008 *
009 * Unless required by applicable law or agreed to in writing,
010 * software distributed under the License is distributed on an "AS IS"
011 * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
012 * or implied. See the License for the specific language governing
013 * permissions and limitations under the License.
014 */
015
016package org.kuali.mobility.emergencyinfo.dao;
017
018import java.util.ArrayList;
019import java.util.List;
020
021import javax.persistence.EntityManager;
022import javax.persistence.NoResultException;
023import javax.persistence.OptimisticLockException;
024import javax.persistence.PersistenceContext;
025import javax.persistence.Query;
026
027import org.apache.log4j.Logger;
028import org.kuali.mobility.emergencyinfo.entity.EmergencyInfo;
029
030import org.kuali.mobility.emergencyinfo.entity.EmergencyInfoJPAImpl;
031import org.springframework.stereotype.Repository;
032import org.springframework.transaction.annotation.Transactional;
033
034@Repository
035public class EmergencyInfoDaoImpl implements EmergencyInfoDao {
036
037        private static final Logger LOG = Logger.getLogger(EmergencyInfoDaoImpl.class);
038
039        @PersistenceContext
040        private EntityManager entityManager;
041
042        @SuppressWarnings("unchecked")
043        public List<EmergencyInfoJPAImpl> findAllEmergencyInfo() {
044                List<EmergencyInfoJPAImpl> contacts = new ArrayList<EmergencyInfoJPAImpl>();
045                Query query = entityManager.createNamedQuery("EmergencyInfo.findAll");
046                try {
047                        contacts = query.getResultList();
048                } catch (NoResultException e) {
049                        LOG.error("No results found in Emergency Info table.", e);
050                }
051                return contacts;
052        }
053
054        public EmergencyInfo findEmergencyInfoById(Long id) {
055                EmergencyInfo contact = null;
056                Query query = entityManager.createNamedQuery("EmergencyInfo.findById");
057                query.setParameter("id", id);
058                try {
059                        contact = (EmergencyInfoJPAImpl) query.getSingleResult();
060                } catch (NoResultException e) {
061                        LOG.error("No emergency info found for id=" + id, e);
062                }
063                return contact;
064        }
065
066        @SuppressWarnings("unchecked")
067        public List<? extends EmergencyInfo> findAllEmergencyInfoByCampus(String campus) {
068                List<? extends EmergencyInfo> contacts = new ArrayList<EmergencyInfoJPAImpl>();
069                Query query = entityManager.createNamedQuery("EmergencyInfo.findByCampus");
070                query.setParameter("campus", campus);
071                try {
072                        contacts = query.getResultList();
073                } catch (NoResultException e) {
074                        LOG.error("No results found in Emergency Info table for campus=" + campus, e);
075                }
076                return contacts;
077        }
078
079        @Transactional
080        public Long saveEmergencyInfo(EmergencyInfo emergencyInfo) {
081                Long id = null;
082                if (emergencyInfo != null) {
083                        LOG.debug("BEGIN: Save emergency info for " + emergencyInfo.getTitle());
084                        try {
085                                if (emergencyInfo.getEmergencyInfoId() == null) {
086                                        entityManager.persist(emergencyInfo);
087                                } else {
088                                        entityManager.merge(emergencyInfo);
089                                }
090                                id = emergencyInfo.getEmergencyInfoId();
091                        } catch (OptimisticLockException oe) {
092                                LOG.error("Unable to save emergency info for " + emergencyInfo.getTitle(), oe);
093                                id = null;
094                        }
095                        LOG.debug("END: Save emergency info for " + emergencyInfo.getTitle());
096                }
097                return id;
098        }
099
100        @Transactional
101        public void deleteEmergencyInfoById(Long id) {
102                if (null != id) {
103                        Query query = entityManager.createNamedQuery("EmergencyInfo.deleteById");
104                        query.setParameter("id", id);
105                        query.executeUpdate();
106                }
107        }
108
109        @Transactional
110        public void reorder(Long id, boolean up) {
111                List<? extends EmergencyInfo> list = findAllEmergencyInfo();
112                EmergencyInfo last = null;
113                boolean flag = false;
114                int index = -1;
115                int count = list.get(0).getOrder();
116                for (EmergencyInfo emergencyInfo : list) {
117                        index++;
118                        if (emergencyInfo.getEmergencyInfoId().equals(id)) {
119                                if (up && last != null) {
120                                        swap(last, emergencyInfo);
121                                        count = last.getOrder() + 1;
122                                        continue;
123                                } else if (!up) {
124                                        EmergencyInfo next = list.get(index + 1);
125                                        swap(emergencyInfo, next);
126                                        count = next.getOrder() + 1;
127                                        continue;
128                                }
129                                flag = true;
130                        }
131                        if (flag) {
132                                emergencyInfo.setOrder(count);
133                                entityManager.merge(emergencyInfo);
134                        }
135                        count++;
136                        last = emergencyInfo;
137                }
138        }
139
140        @Transactional
141        private void swap(EmergencyInfo one, EmergencyInfo two) {
142                int temp = one.getOrder();
143                one.setOrder(two.getOrder());
144                two.setOrder(temp);
145                entityManager.merge(one);
146                entityManager.merge(two);
147        }
148
149        public EntityManager getEntityManager() {
150                return entityManager;
151        }
152
153        public void setEntityManager(EntityManager entityManager) {
154                this.entityManager = entityManager;
155        }
156
157}