1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portlet.calendar.util.comparator;
16  
17  import com.liferay.portal.kernel.util.Time;
18  import com.liferay.portlet.calendar.model.CalEvent;
19  import com.liferay.portlet.calendar.util.CalUtil;
20  
21  import java.util.Calendar;
22  import java.util.Comparator;
23  import java.util.Date;
24  import java.util.Locale;
25  import java.util.TimeZone;
26  
27  /**
28   * <a href="EventTimeComparator.java.html"><b><i>View Source</i></b></a>
29   *
30   * @author Samuel Kong
31   */
32  public class EventTimeComparator implements Comparator<CalEvent> {
33  
34      public EventTimeComparator(TimeZone timeZone, Locale locale) {
35          _timeZone = timeZone;
36          _locale = locale;
37      }
38  
39      public int compare(CalEvent event1, CalEvent event2) {
40          boolean allDay1 = CalUtil.isAllDay(event1, _timeZone, _locale);
41          boolean allDay2 = CalUtil.isAllDay(event2, _timeZone, _locale);
42  
43          if (allDay1 && allDay2) {
44              return compareTitle(event1, event2);
45          }
46          else if (allDay1) {
47              return -1;
48          }
49          else if (allDay2) {
50              return 1;
51          }
52  
53          int value = compareTime(
54              getStartDate(event1, _timeZone), getStartDate(event2, _timeZone));
55  
56          if (value != 0) {
57              return value;
58          }
59  
60          value = compareTime(
61              getEndDate(event1, _timeZone), getEndDate(event2, _timeZone));
62  
63          if (value != 0) {
64              return value;
65          }
66  
67          return compareTitle(event1, event2);
68      }
69  
70      protected int compareTitle(CalEvent event1, CalEvent event2) {
71          return event1.getTitle().toLowerCase().compareTo(
72              event2.getTitle().toLowerCase());
73      }
74  
75      protected int compareTime(Date date1, Date date2) {
76          Calendar cal1 = Calendar.getInstance(_timeZone, _locale);
77  
78          cal1.setTime(date1);
79  
80          cal1.set(Calendar.YEAR, 1970);
81          cal1.set(Calendar.MONTH, 1);
82          cal1.set(Calendar.DAY_OF_YEAR, 1);
83  
84          Calendar cal2 = Calendar.getInstance(_timeZone, _locale);
85  
86          cal2.setTime(date2);
87  
88          cal2.set(Calendar.YEAR, 1970);
89          cal2.set(Calendar.MONTH, 1);
90          cal2.set(Calendar.DAY_OF_YEAR, 1);
91  
92          return cal1.compareTo(cal2);
93      }
94  
95      protected Date getEndDate(CalEvent event, TimeZone timeZone) {
96          if (event.isTimeZoneSensitive()) {
97              return Time.getDate(CalUtil.getEndTime(event), timeZone);
98          }
99          else {
100             return CalUtil.getEndTime(event);
101         }
102     }
103 
104     protected Date getStartDate(CalEvent event, TimeZone timeZone) {
105         if (event.isTimeZoneSensitive()) {
106             return Time.getDate(event.getStartDate(), timeZone);
107         }
108         else {
109             return event.getStartDate();
110         }
111     }
112 
113     private TimeZone _timeZone;
114     private Locale _locale;
115 
116 }