| 1 124 package com.ivata.groupware.business.calendar.struts; 125 126 import java.util.Collection ; 127 import java.util.GregorianCalendar ; 128 import java.util.HashMap ; 129 import java.util.Iterator ; 130 import java.util.Map ; 131 import java.util.TimeZone ; 132 import java.util.TreeSet ; 133 import java.util.Vector ; 134 135 import javax.servlet.http.HttpServletRequest ; 136 import javax.servlet.http.HttpServletResponse ; 137 import javax.servlet.http.HttpSession ; 138 139 import org.apache.struts.action.ActionErrors; 140 import org.apache.struts.action.ActionForm; 141 import org.apache.struts.action.ActionMapping; 142 143 import com.ivata.groupware.admin.security.server.SecuritySession; 144 import com.ivata.groupware.admin.security.user.UserDO; 145 import com.ivata.groupware.admin.setting.Settings; 146 import com.ivata.groupware.admin.setting.SettingsDataTypeException; 147 import com.ivata.groupware.business.calendar.Calendar; 148 import com.ivata.groupware.business.calendar.event.EventDO; 149 import com.ivata.groupware.util.SettingDateFormatter; 150 import com.ivata.mask.MaskFactory; 151 import com.ivata.mask.util.StringHandling; 152 import com.ivata.mask.util.SystemException; 153 import com.ivata.mask.web.format.DateFormatterConstants; 154 import com.ivata.mask.web.struts.MaskAction; 155 import com.ivata.mask.web.struts.MaskAuthenticator; 156 157 158 168 public class IndexAction extends MaskAction { 169 private Calendar calendar; 170 private SettingDateFormatter dateFormatter; 171 private Settings settings; 172 183 public IndexAction(Calendar calendar, Settings settings, SettingDateFormatter 184 dateFormatter, MaskFactory maskFactory, 185 MaskAuthenticator authenticator) { 186 super(maskFactory, authenticator); 187 this.calendar = calendar; 188 this.settings = settings; 189 this.dateFormatter = dateFormatter; 190 } 191 192 215 public String execute(final ActionMapping mapping, 216 final ActionErrors errors, 217 final ActionForm form, 218 final HttpServletRequest request, 219 final HttpServletResponse response, 220 final HttpSession session) throws SystemException { 221 SecuritySession securitySession = (SecuritySession) session.getAttribute("securitySession"); 222 UserDO user = securitySession.getUser(); 223 IndexForm indexForm = (IndexForm) form; 224 TimeZone timeZone; 225 timeZone = 226 TimeZone.getTimeZone( 227 settings.getStringSetting( 228 securitySession, 229 "i18nTimeZone", 230 user)); 231 232 GregorianCalendar day = indexForm.getCurrentDay(); 233 day.setTimeZone(timeZone); 234 235 Integer view = indexForm.getView(); 237 Integer requestView = StringHandling.integerValue(request.getParameter("view")); 239 if (requestView != null) { 240 indexForm.setView(view = requestView); 241 } 242 243 if ((view == null) 246 || (request.getParameter("today") != null)) { 247 day.setTime(new java.util.Date ()); 248 day.set(GregorianCalendar.HOUR_OF_DAY, 0); 249 day.set(GregorianCalendar.MINUTE, 0); 250 day.set(GregorianCalendar.SECOND, 0); 251 day.set(GregorianCalendar.MILLISECOND, 0); 252 253 if (view == null) { 256 try { 257 indexForm.setView(view = settings.getIntegerSetting(securitySession, 258 "calendarDefaultView", user)); 259 } catch (SettingsDataTypeException e2) { 260 throw new SystemException(e2); 261 } 262 } 263 } 264 265 266 if (request.getParameter("day") != null) { 268 day.set( GregorianCalendar.DATE, 269 new Integer (request.getParameter("day")).intValue()); 270 day.set( GregorianCalendar.MONTH, 271 new Integer (request.getParameter("month")).intValue()); 272 day.set( GregorianCalendar.YEAR, 273 new Integer (request.getParameter("year")).intValue()); 274 day.set(GregorianCalendar.HOUR_OF_DAY, 0); 275 day.set(GregorianCalendar.MINUTE, 0); 276 day.set(GregorianCalendar.SECOND, 0); 277 day.set(GregorianCalendar.MILLISECOND, 0); 278 } 279 280 283 if (IndexFormConstants.VIEW_DAY.equals(view)) { 285 indexForm.setViewPage("/calendar/dayview.jsp"); 286 indexForm.setHelpKey("calendar.day"); 287 288 if (request.getParameter("next") != null) { 290 day.set(GregorianCalendar.DAY_OF_YEAR, 291 day.get(GregorianCalendar.DAY_OF_YEAR) + 1); 292 } else if (request.getParameter("previous") != null) { 293 day.set(GregorianCalendar.DAY_OF_YEAR, 294 day.get(GregorianCalendar.DAY_OF_YEAR)-1); 295 } 296 Map eventsDay = new HashMap (); 297 Map [] events = {eventsDay}; 298 indexForm.setEvents(events); 299 Vector allDayEventsDay = new Vector (); 300 Vector [] allDayEvents = {allDayEventsDay}; 301 indexForm.setAllDayEvents(allDayEvents); 302 findDayEvents(securitySession, indexForm, day, allDayEventsDay, eventsDay); 303 304 } else { 305 int firstDay; 307 firstDay = 308 (settings 309 .getIntegerSetting( 310 securitySession, 311 "calendarFirstWeekDay", 312 user)) 313 .intValue(); 314 315 int numberOfDays = 7; 317 if (IndexFormConstants.VIEW_WORK_WEEK.equals(view)) { 318 firstDay = 1; 319 numberOfDays = 5; 320 } 321 322 GregorianCalendar firstWeekDay = new GregorianCalendar (timeZone); 326 GregorianCalendar firstMonthDay = null; 327 328 if (IndexFormConstants.VIEW_MONTH.equals(view)) { 330 if (request.getParameter("next") != null) { 332 day.set(GregorianCalendar.MONTH, 333 day.get(GregorianCalendar.MONTH) + 1); 334 } else if (request.getParameter("previous") != null) { 335 day.set(GregorianCalendar.MONTH, 336 day.get(GregorianCalendar.MONTH) - 1); 337 } 338 339 firstMonthDay = new GregorianCalendar (timeZone); 340 firstMonthDay.setTime(day.getTime()); 341 firstMonthDay.set(GregorianCalendar.DAY_OF_MONTH, 1); 342 firstWeekDay.setTime(firstMonthDay.getTime()); 343 } else { 344 if (request.getParameter("next") != null) { 346 day.set(GregorianCalendar.DAY_OF_YEAR, 347 day.get(GregorianCalendar.DAY_OF_YEAR) + 7); 348 } else if (request.getParameter("previous") != null) { 349 day.set(GregorianCalendar.DAY_OF_YEAR, 350 day.get(GregorianCalendar.DAY_OF_YEAR)-7); 351 } 352 353 firstWeekDay.setTime(day.getTime()); 355 } 356 357 firstWeekDay.set(GregorianCalendar.DAY_OF_YEAR, 358 firstWeekDay.get(GregorianCalendar.DAY_OF_YEAR) 359 - ((firstWeekDay.get(GregorianCalendar.DAY_OF_WEEK) + 6 - firstDay) % 7) ); 360 firstWeekDay.set(GregorianCalendar.HOUR_OF_DAY, 0); 361 firstWeekDay.set(GregorianCalendar.MINUTE, 0); 362 firstWeekDay.set(GregorianCalendar.SECOND, 0); 363 firstWeekDay.set(GregorianCalendar.MILLISECOND, 0); 364 indexForm.setFirstWeekDay(firstWeekDay); 365 366 GregorianCalendar thisDay = new GregorianCalendar (timeZone); 368 369 if (IndexFormConstants.VIEW_MONTH.equals(view)) { 372 376 int dayOfWeek = firstWeekDay.get(GregorianCalendar.DAY_OF_WEEK); 378 int dayBeforeOfWeek = dayOfWeek - 1; 379 if (dayBeforeOfWeek < 0) { 380 dayBeforeOfWeek += 7; 381 } 382 int twoDaysBeforeOfWeek = dayBeforeOfWeek - 1; 383 if (twoDaysBeforeOfWeek < 0) { 384 twoDaysBeforeOfWeek += 7; 385 } 386 int numberOfWeeks = 0; 387 388 if ((firstMonthDay.getActualMaximum(GregorianCalendar.DAY_OF_MONTH) == 28) 391 && (firstMonthDay.get(GregorianCalendar.DAY_OF_WEEK) == dayOfWeek)) { 392 numberOfWeeks = 4; 393 } else if (((firstMonthDay.getActualMaximum(GregorianCalendar.DAY_OF_MONTH)==31) 394 && (firstMonthDay.get(GregorianCalendar.DAY_OF_WEEK) == twoDaysBeforeOfWeek)) 395 || ((firstMonthDay.get(GregorianCalendar.DAY_OF_WEEK) == dayBeforeOfWeek) 396 && (firstMonthDay.getActualMaximum(GregorianCalendar.DAY_OF_MONTH) >=30))) { 397 numberOfWeeks = 6; 404 } else { 406 numberOfWeeks = 5; 407 } 408 409 Map [] events = new Map [numberOfWeeks]; 410 indexForm.setEvents(events); 411 int thisMonth = firstMonthDay.get(GregorianCalendar.MONTH); 413 thisDay.setTime(firstWeekDay.getTime()); 414 for (int week = 0; week < numberOfWeeks; ++week) { 415 events[week] = new HashMap (); 416 for (int dayNumber = 0; dayNumber < 7; ++dayNumber) { 418 if (thisMonth==thisDay.get(GregorianCalendar.MONTH)) { 423 EventHourComparator comparator = new EventHourComparator(); 425 comparator.setDay(thisDay); 426 TreeSet eventsThisDay = new TreeSet (comparator); 427 eventsThisDay.addAll(calendar.findEventsForDay(securitySession, thisDay)); 428 events[week].put(new Integer (dayNumber), eventsThisDay); 429 } 430 thisDay.set(GregorianCalendar.DAY_OF_YEAR, 431 thisDay.get(GregorianCalendar.DAY_OF_YEAR) + 1); 432 } 433 } 434 435 indexForm.setViewPage("/calendar/monthview.jsp"); 436 indexForm.setHelpKey("calendar.month"); 437 438 } else { 440 if ((day.get(GregorianCalendar.DAY_OF_WEEK)==GregorianCalendar.SATURDAY) 442 || (day.get(GregorianCalendar.DAY_OF_WEEK)==GregorianCalendar.SUNDAY)) { 443 indexForm.setView(view = IndexFormConstants.VIEW_WEEK); 444 } 445 446 Map [] events = new Map [numberOfDays]; 449 indexForm.setEvents(events); 450 Vector [] allDayEvents = new Vector [numberOfDays]; 451 indexForm.setAllDayEvents(allDayEvents); 452 thisDay.setTime(firstWeekDay.getTime()); 453 for (int index = 0; index < numberOfDays; ++index) { 454 events[index] = new HashMap (); 455 allDayEvents[index] = new Vector (); 456 findDayEvents(securitySession, indexForm, thisDay, 457 allDayEvents[index], events[index]); 458 thisDay.set(GregorianCalendar.DAY_OF_YEAR, 459 thisDay.get(GregorianCalendar.DAY_OF_YEAR) + 1); 460 } 461 462 indexForm.setViewPage("/calendar/weekview.jsp"); 463 indexForm.setHelpKey("calendar.week"); 464 } 465 466 } 467 468 return null; 472 } 473 474 495 private void findDayEvents(final SecuritySession securitySession, 496 final IndexForm indexForm, 497 final GregorianCalendar day, 498 final Vector allDayEvents, 499 final Map events) throws SystemException { 500 EventHourComparator comparator = new EventHourComparator(); 502 comparator.setDay(day); 503 504 Collection eventsForDay; 505 eventsForDay = calendar.findEventsForDay(securitySession, day); 506 String fromKey, toKey; 507 508 dateFormatter.setDateFormat(DateFormatterConstants.DATE_LONG_DAY); 510 dateFormatter.setTimeFormat(DateFormatterConstants.TIME_SHORT); 511 512 for (Iterator i = eventsForDay.iterator(); i.hasNext(); ) { 516 EventDO event = (EventDO) i.next(); 517 518 Integer key = null; 519 if (event.isAllDayEvent() 522 || (comparator.isAfterDay(event) && (event.getStart().before(day)))) { 523 allDayEvents.add(event); 524 525 } else if (!event.getStart().before(day)) { 528 key = new Integer (event.getStart().get(GregorianCalendar.HOUR_OF_DAY)); 530 531 if (event.getStart().get(GregorianCalendar.HOUR_OF_DAY) < indexForm.getDayStartHour()) { 533 indexForm.setDayStartHour(event.getStart().get(GregorianCalendar.HOUR_OF_DAY)); 534 } 535 if (event.getStart().get(GregorianCalendar.HOUR_OF_DAY) > indexForm.getDayFinishHour()) { 537 indexForm.setDayFinishHour(event.getStart().get(GregorianCalendar.HOUR_OF_DAY)); 538 539 } 540 541 } else if (!comparator.isAfterDay(event)) { 544 key = new Integer (event.getFinish().get(GregorianCalendar.HOUR_OF_DAY)); 546 547 if (event.getFinish().get(GregorianCalendar.HOUR_OF_DAY) > indexForm.getDayFinishHour()) { 549 indexForm.setDayFinishHour(event.getFinish().get(GregorianCalendar.HOUR_OF_DAY)); 550 } 551 if (event.getFinish().get(GregorianCalendar.HOUR_OF_DAY) < indexForm.getDayStartHour()) { 552 indexForm.setDayStartHour(event.getFinish().get(GregorianCalendar.HOUR_OF_DAY)); 553 } 554 } 555 if (key != null) { 557 TreeSet treeSet = (TreeSet ) events.get(key); 559 if (treeSet == null) { 560 events.put(key, treeSet = new TreeSet (comparator)); 562 } 563 treeSet.add(event); 564 } 565 } 566 } 567 } 568 | Popular Tags |