/*******************************************************************************
* Copyright (c) 2012 Dmitry Tikhomirov.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* Dmitry Tikhomirov - initial API and implementation
******************************************************************************/
package org.opensheet.server.dao.impl;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import org.hibernate.SessionFactory;
import org.opensheet.server.dao.HolidaysDAO;
import org.opensheet.shared.model.Holiday;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@Repository
public class HolidaysDAOImpl implements HolidaysDAO{
@Autowired
private SessionFactory sessionFactory;
@SuppressWarnings({"static-access" })
@Override
@Transactional
public HashMap<Integer,Boolean> getHolidays(Calendar cal){
int maxDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
HashMap<Integer, Boolean> hm = new HashMap<Integer, Boolean>();
HashMap<Integer, Holiday> holidayMap = getHolidayMap(cal);
for(Integer i=1;i<=maxDay;i++){
cal.set(Calendar.getInstance().DAY_OF_MONTH,i);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
if(dayOfWeek == 1 || dayOfWeek == 7 ){
if(holidayMap.containsKey(cal.get(Calendar.DATE))){
hm.put(i,holidayMap.get(cal.get(Calendar.DATE)).getStatus());
}else{
hm.put(i,true);
}
}else{
if(holidayMap.containsKey(cal.get(Calendar.DATE))){
hm.put(i,holidayMap.get(cal.get(Calendar.DATE)).getStatus());
}else{
hm.put(i,false);
}
}
}
return hm;
}
@Override
public Boolean checkDay(Calendar c) {
Holiday h = getDay(c);
if(h.getStatus() == true){
return true;
}else{
return false;
}
}
@Override
@Transactional
public void saveOrUpdateDay(Calendar c, Boolean status) {
Holiday h = getDay(c);
if(h != null){
h.setStatus(status);
sessionFactory.getCurrentSession().saveOrUpdate(h);
}else{
Holiday newHoliday = new Holiday();
newHoliday.setDate(c.getTime());
newHoliday.setStatus(status);
sessionFactory.getCurrentSession().saveOrUpdate(newHoliday);
}
}
@Override
@Transactional
public Holiday getDay(Calendar c) {
Holiday h = (Holiday) sessionFactory.getCurrentSession().
createQuery("from Holiday h where h.date=?")
.setCalendar(0, c)
.uniqueResult();
return h;
}
@SuppressWarnings({ "unchecked", "deprecation" })
@Override
@Transactional
public HashMap<Integer, Holiday> getHolidayMap(Calendar c) {
Integer maxDays = c.getActualMaximum(Calendar.DAY_OF_MONTH);
Calendar firstDay = (Calendar) c.clone();
firstDay.set(Calendar.DATE,1);
Calendar lastDay = (Calendar) c.clone();
lastDay.set(Calendar.DATE,maxDays);
HashMap<Integer, Holiday> map = new HashMap<Integer, Holiday>();
List<Holiday> list = (List<Holiday>) sessionFactory.getCurrentSession().
createQuery("from Holiday h where h.date >= ? and h.date <= ?")
.setCalendar(0, firstDay)
.setCalendar(1, lastDay)
.list();
for(Holiday h: list){
map.put(h.getDate().getDate(), h);
}
return map;
}
}