View Javadoc
1   /*
2    * #%L
3    * Nuiton Utils
4    * %%
5    * Copyright (C) 2004 - 2010 CodeLutin
6    * %%
7    * This program is free software: you can redistribute it and/or modify
8    * it under the terms of the GNU Lesser General Public License as 
9    * published by the Free Software Foundation, either version 3 of the 
10   * License, or (at your option) any later version.
11   * 
12   * This program is distributed in the hope that it will be useful,
13   * but WITHOUT ANY WARRANTY; without even the implied warranty of
14   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   * GNU General Lesser Public License for more details.
16   * 
17   * You should have received a copy of the GNU General Lesser Public 
18   * License along with this program.  If not, see
19   * <http://www.gnu.org/licenses/lgpl-3.0.html>.
20   * #L%
21   */
22  
23  package org.nuiton.util;
24  
25  import java.io.Serializable;
26  import java.util.ArrayList;
27  import java.util.Calendar;
28  import java.util.Date;
29  import java.util.List;
30  
31  /**
32   * TODO tchemit 2010-08-25 JAVADOC + I18N
33   * PeriodDates.java
34   *
35   * Created on 2009-08-13
36   *
37   * @author fdesbois
38   */
39  public class PeriodDates implements Serializable {
40  
41      private static final long serialVersionUID = 1L;
42  
43      private String pattern;
44  
45      private Calendar fromCalendar;
46  
47      private Calendar thruCalendar;
48  
49      public PeriodDates() {
50      }
51  
52      public PeriodDates(Date fromDate, Date thruDate) throws IllegalArgumentException {
53          if (thruDate != null && fromDate != null && fromDate.after(thruDate)) {
54              throw new IllegalArgumentException("The fromDate can't be after the thruDate !");
55          }
56  
57          setFromDate(fromDate);
58          setThruDate(thruDate);
59  
60          pattern = DateUtil.DEFAULT_PATTERN;
61      }
62  
63      public PeriodDates(Calendar fromCalendar, Calendar thruCalendar) throws IllegalArgumentException {
64          if (thruCalendar != null && fromCalendar != null && fromCalendar.after(thruCalendar)) {
65              throw new IllegalArgumentException("The fromDate can't be after the thruDate !");
66          }
67          this.fromCalendar = fromCalendar;
68          this.thruCalendar = thruCalendar;
69  
70          pattern = DateUtil.DEFAULT_PATTERN;
71      }
72  
73      /**
74       * Create a period from the date of today. If monthAfter is negative, the current day will be
75       * the thruDate of the period. The period extremities will be initialized (first day of month for
76       * fromDate and last day of month for thruDate). Time is set to 0 for both
77       * dates.
78       * <pre>
79       * Ex 1 :
80       * Today = 12/05/2009
81       * monthAfter = 5
82       * Period = 01/05/2009 to 31/10/2009
83       * Ex 2 :
84       * Today = 12/05/2009
85       * monthAfter = -4
86       * Period = 01/01/2009 to 31/05/2009
87       * </pre>
88       *
89       * @param monthAfter the number of month from the current one
90       * @return a new PeriodDates
91       */
92      public static PeriodDates createMonthsPeriodFromToday(int monthAfter) {
93          Calendar calendarFrom = Calendar.getInstance();
94          Calendar calendarThru = Calendar.getInstance();
95  
96          // Reset time
97          Date minTime = DateUtil.setMinTimeOfDay(new Date());
98          calendarFrom.setTime(minTime);
99          calendarThru.setTime(minTime);
100 
101         if (monthAfter < 0) {
102             calendarFrom.add(Calendar.MONTH, monthAfter);
103         } else {
104             calendarThru.add(Calendar.MONTH, monthAfter);
105         }
106 
107         PeriodDates period = new PeriodDates(calendarFrom, calendarThru);
108         period.initDayOfMonthExtremities();
109         period.setPattern(DateUtil.MONTH_PATTERN);
110         return period;
111     }
112 
113     public String getPattern() {
114         return pattern;
115     }
116 
117     public void setPattern(String pattern) {
118         this.pattern = pattern;
119     }
120 
121     /** Set first day of month for dateFrom and last day of month for dateThru */
122     public void initDayOfMonthExtremities() {
123         if (fromCalendar == null || thruCalendar == null) {
124             throw new NullPointerException("fromDate or thruDate can't be null to" +
125                                            " change dayOfMonth extremities");
126         }
127         Date fromDate = fromCalendar.getTime();
128         fromDate = DateUtil.setFirstDayOfMonth(fromDate);
129         fromDate = DateUtil.setMinTimeOfDay(fromDate);
130         fromCalendar.setTime(fromDate);
131 
132         Date thruDate = thruCalendar.getTime();
133         thruDate = DateUtil.setLastDayOfMonth(thruDate);
134         thruDate = DateUtil.setMaxTimeOfDay(thruDate);
135         thruCalendar.setTime(thruDate);
136     }
137 
138     public void setFromDate(Date fromDate) {
139         //this.fromDate = fromDate;
140         if (fromDate != null) {
141             if (thruCalendar != null && fromDate.after(thruCalendar.getTime())) {
142                 throw new IllegalArgumentException("The fromDate can't be after the thruDate !");
143             }
144             if (fromCalendar == null) {
145                 fromCalendar = Calendar.getInstance();
146             }
147             fromCalendar.setTime(fromDate);
148         } else {
149             fromCalendar = null;
150         }
151     }
152 
153     public Date getFromDate() {
154         return fromCalendar != null ? fromCalendar.getTime() : null;
155     }
156 
157     public int getFromMonth() {
158         return fromCalendar.get(Calendar.MONTH);
159     }
160 
161     public void setThruDate(Date thruDate) {
162         //this.thruDate = thruDate;
163         if (thruDate != null) {
164             if (fromCalendar != null && thruDate.before(fromCalendar.getTime())) {
165                 throw new IllegalArgumentException("The thruDate can't be before the fromDate !");
166             }
167             if (thruCalendar == null) {
168                 thruCalendar = Calendar.getInstance();
169             }
170             thruCalendar.setTime(thruDate);
171         } else {
172             thruCalendar = null;
173         }
174     }
175 
176     public Date getThruDate() {
177         return thruCalendar != null ? thruCalendar.getTime() : null;
178     }
179 
180     public List<Date> getMonths() {
181         List<Date> months = new ArrayList<Date>();
182         if (fromCalendar == null || thruCalendar == null) {
183             return months;
184         }
185 
186 //        Calendar current = (Calendar) fromCalendar.clone();
187 //        current.set(Calendar.DAY_OF_MONTH, 1);
188 //        Calendar end = (Calendar) thruCalendar.clone();
189 //        end.set(Calendar.DAY_OF_MONTH, 1);
190 
191         // Prepare calendars for while condition :
192         // set first day of month + reset time to 00:00:00.000
193         Date tmp = DateUtil.setFirstDayOfMonth(fromCalendar.getTime());
194         tmp = DateUtil.setMinTimeOfDay(tmp);
195         Calendar current = DateUtil.getDefaultCalendar(tmp);
196 
197         tmp = DateUtil.setFirstDayOfMonth(thruCalendar.getTime());
198         tmp = DateUtil.setMinTimeOfDay(tmp);
199         Calendar end = DateUtil.getDefaultCalendar(tmp);
200 
201         while (!current.equals(end)) {
202             months.add(current.getTime());
203             current.add(Calendar.MONTH, 1);
204         }
205         months.add(current.getTime());
206 
207         return months;
208     }
209 
210     public List<String> getFormatedMonths() {
211         List<String> results = new ArrayList<String>();
212         for (Date date : getMonths()) {
213             String str = DateUtil.formatDate(date, pattern);
214             results.add(str);
215         }
216         return results;
217     }
218 
219     public boolean beforeEnd(Calendar calendar) {
220         return calendar.before(thruCalendar) || calendar.equals(thruCalendar);
221     }
222 
223     public boolean afterEnd(Calendar calendar) {
224         return calendar.after(thruCalendar);
225     }
226 
227     public boolean afterBegin(Calendar calendar) {
228         return calendar.after(fromCalendar) || calendar.equals(fromCalendar);
229     }
230 
231     public boolean between(Calendar calendar) {
232         return beforeEnd(calendar) && afterBegin(calendar);
233     }
234 
235     public boolean beforeEnd(Date date) {
236         Calendar calendar = DateUtil.getDefaultCalendar(date);
237         return beforeEnd(calendar);
238     }
239 
240     public boolean afterEnd(Date date) {
241         Calendar calendar = DateUtil.getDefaultCalendar(date);
242         return afterEnd(calendar);
243     }
244 
245     public boolean afterBegin(Date date) {
246         Calendar calendar = DateUtil.getDefaultCalendar(date);
247         return afterBegin(calendar);
248     }
249 
250     public boolean between(Date date) {
251         Calendar calendar = DateUtil.getDefaultCalendar(date);
252         return between(calendar);
253     }
254 
255 
256     @Override
257     public String toString() {
258         String fromStr = DateUtil.formatDate(getFromDate(), pattern);
259         String thruStr = DateUtil.formatDate(getThruDate(), pattern);
260         return "[ " + getFromDate() + " (pattern: " + fromStr + ") → " +
261                getThruDate() + " (pattern: " + thruStr + ") ]";
262     }
263 
264 }