/******************************************************************************* * 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; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import org.opensheet.client.services.HolidayService; import org.opensheet.server.dao.HolidaysDAO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.extjs.gxt.ui.client.data.BaseModelData; import com.google.gwt.user.server.rpc.RemoteServiceServlet; @Service("HolidayService") public class HolidayServiceImpl extends RemoteServiceServlet implements HolidayService{ /** * */ private static final long serialVersionUID = 145945755813482192L; @Autowired private HolidaysDAO holidays; @SuppressWarnings({ "rawtypes", "unchecked", "deprecation" }) @Override public List<BaseModelData> getHolidays(Date date) { int weeks; int firstWeek; int lastWeek; Calendar cal = new GregorianCalendar(); cal.set(Calendar.YEAR, date.getYear()+1900); cal.set(Calendar.MONTH, date.getMonth()); cal.set(Calendar.DAY_OF_MONTH, 1); int firstWeekDayOfFirstDay = cal.get(Calendar.DAY_OF_WEEK); int row = 1; firstWeekDayOfFirstDay--; firstWeek = cal.get(Calendar.WEEK_OF_YEAR); cal.set(Calendar.DAY_OF_MONTH,cal.getActualMaximum(Calendar.DAY_OF_MONTH)); lastWeek = cal.get(Calendar.WEEK_OF_YEAR); weeks = lastWeek - firstWeek; if(weeks < 0 ){ weeks=5; } weeks++; Map<Integer,Map<Integer,Integer>> weeksMap = new HashMap<Integer,Map<Integer,Integer>>(weeks); HashMap<Integer,Boolean> holidaysMap = holidays.getHolidays(cal); for(int w =1;w<=weeks;w++){ Map<Integer,Integer> weekMapTemp = new HashMap<Integer,Integer>(7); for(int temp = 1; temp<=7;temp++){ weekMapTemp.put(temp, 0); } weeksMap.put(w, weekMapTemp); } int maxDays = cal.getActualMaximum(Calendar.DAY_OF_MONTH); int step = firstWeekDayOfFirstDay; if(step == 0) step = 7; for(int day = 1; day<=maxDays; day++){ cal.set(Calendar.DAY_OF_MONTH, day); Map<Integer,Integer> wee = weeksMap.get(row); wee.put(step, day); weeksMap.put(row, wee); if(step == 7 ){ row++; step = 1; }else{ step++; } } List<BaseModelData> list = new ArrayList<BaseModelData>(weeksMap.size()); Set s = weeksMap.entrySet(); Iterator iter = s.iterator(); while(iter.hasNext()){ Map.Entry m =(Map.Entry) iter.next(); BaseModelData holidayBaseModel = new BaseModelData(); holidayBaseModel.set("week", m.getKey()); Set ss = weeksMap.get(m.getKey()).entrySet(); Iterator weekIter = ss.iterator(); while(weekIter.hasNext()){ Map.Entry<Integer,Integer> weekM = (Entry<Integer, Integer>) weekIter.next(); holidayBaseModel.set("day_"+weekM.getKey(), weekM.getValue()); holidayBaseModel.set("id", weekM.getValue()); holidayBaseModel.set("status_"+weekM.getKey(), holidaysMap.get(weekM.getValue())); } list.add(holidayBaseModel); } return list; } @Override public List<BaseModelData> setAndUpdateHolidays(Date date,Boolean status) { Calendar cal = Calendar.getInstance(); cal.setTime(date); holidays.saveOrUpdateDay(cal, status); return this.getHolidays(date); } }