~mortenoh/+junk/dhis2-detailed-import-export

« back to all changes in this revision

Viewing changes to dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/SixMonthlyPeriodType.java

  • Committer: larshelge at gmail
  • Date: 2009-03-03 16:46:36 UTC
  • Revision ID: larshelge@gmail.com-20090303164636-2sjlrquo7ib1gf7r
Initial check-in

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package org.hisp.dhis.period;
 
2
 
 
3
/*
 
4
 * Copyright (c) 2004-2007, University of Oslo
 
5
 * All rights reserved.
 
6
 *
 
7
 * Redistribution and use in source and binary forms, with or without
 
8
 * modification, are permitted provided that the following conditions are met:
 
9
 * * Redistributions of source code must retain the above copyright notice, this
 
10
 *   list of conditions and the following disclaimer.
 
11
 * * Redistributions in binary form must reproduce the above copyright notice,
 
12
 *   this list of conditions and the following disclaimer in the documentation
 
13
 *   and/or other materials provided with the distribution.
 
14
 * * Neither the name of the HISP project nor the names of its contributors may
 
15
 *   be used to endorse or promote products derived from this software without
 
16
 *   specific prior written permission.
 
17
 *
 
18
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 
19
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 
20
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 
21
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 
22
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 
23
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 
24
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 
25
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 
26
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 
27
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
28
 */
 
29
 
 
30
import java.util.ArrayList;
 
31
import java.util.Calendar;
 
32
import java.util.Date;
 
33
import java.util.List;
 
34
 
 
35
/**
 
36
 * PeriodType for six-monthly Periods. A valid six-monthly Period has startDate
 
37
 * set to either January 1st or July 1st, and endDate set to the last day of the
 
38
 * fifth month after the startDate.
 
39
 * 
 
40
 * @author Torgeir Lorange Ostby
 
41
 * @version $Id: SixMonthlyPeriodType.java 2971 2007-03-03 18:54:56Z torgeilo $
 
42
 */
 
43
public class SixMonthlyPeriodType
 
44
    extends CalendarPeriodType
 
45
{
 
46
    /**
 
47
     * The name of the SixMonthlyPeriodType, which is "SixMonthly".
 
48
     */
 
49
    public static final String NAME = "SixMonthly";
 
50
 
 
51
    // -------------------------------------------------------------------------
 
52
    // PeriodType functionality
 
53
    // -------------------------------------------------------------------------
 
54
 
 
55
    @Override
 
56
    public String getName()
 
57
    {
 
58
        return NAME;
 
59
    }
 
60
 
 
61
    @Override
 
62
    public Period createPeriod()
 
63
    {
 
64
        return createPeriod( createCalendarInstance() );
 
65
    }
 
66
 
 
67
    @Override
 
68
    public Period createPeriod( Date date )
 
69
    {
 
70
        return createPeriod( createCalendarInstance( date ) );
 
71
    }
 
72
 
 
73
    private Period createPeriod( Calendar cal )
 
74
    {
 
75
        cal.set( Calendar.MONTH, cal.get( Calendar.MONTH ) - cal.get( Calendar.MONTH ) % 6 );
 
76
        cal.set( Calendar.DAY_OF_MONTH, 1 );
 
77
 
 
78
        Date startDate = cal.getTime();
 
79
 
 
80
        cal.add( Calendar.MONTH, 5 );
 
81
        cal.set( Calendar.DAY_OF_MONTH, cal.getActualMaximum( Calendar.DAY_OF_MONTH ) );
 
82
 
 
83
        return new Period( this, startDate, cal.getTime() );
 
84
    }
 
85
 
 
86
    // -------------------------------------------------------------------------
 
87
    // CalendarPeriodType functionality
 
88
    // -------------------------------------------------------------------------
 
89
 
 
90
    @Override
 
91
    public Period getNextPeriod( Period period )
 
92
    {
 
93
        Calendar cal = createCalendarInstance( period.getStartDate() );
 
94
        cal.set( Calendar.MONTH, cal.get( Calendar.MONTH ) - cal.get( Calendar.MONTH ) % 6 + 6 );
 
95
        cal.set( Calendar.DAY_OF_MONTH, 1 );
 
96
 
 
97
        Date startDate = cal.getTime();
 
98
 
 
99
        cal.add( Calendar.MONTH, 5 );
 
100
        cal.set( Calendar.DAY_OF_MONTH, cal.getActualMaximum( Calendar.DAY_OF_MONTH ) );
 
101
 
 
102
        return new Period( this, startDate, cal.getTime() );
 
103
    }
 
104
 
 
105
    @Override
 
106
    public Period getPreviousPeriod( Period period )
 
107
    {
 
108
        Calendar cal = createCalendarInstance( period.getStartDate() );
 
109
        cal.set( Calendar.MONTH, cal.get( Calendar.MONTH ) - cal.get( Calendar.MONTH ) % 6 - 6 );
 
110
        cal.set( Calendar.DAY_OF_MONTH, 1 );
 
111
 
 
112
        Date startDate = cal.getTime();
 
113
 
 
114
        cal.add( Calendar.MONTH, 5 );
 
115
        cal.set( Calendar.DAY_OF_MONTH, cal.getActualMaximum( Calendar.DAY_OF_MONTH ) );
 
116
 
 
117
        return new Period( this, startDate, cal.getTime() );
 
118
    }
 
119
 
 
120
    /**
 
121
     * Generates six-monthly Periods for a rounded-off 5 years span in which the
 
122
     * given Period's startDate exists.
 
123
     */
 
124
    @Override
 
125
    public List<Period> generatePeriods( Period period )
 
126
    {
 
127
        Calendar cal = createCalendarInstance( period.getStartDate() );
 
128
        cal.add( Calendar.YEAR, -(cal.get( Calendar.YEAR ) % 5) );
 
129
        cal.set( Calendar.DAY_OF_YEAR, 1 );
 
130
 
 
131
        ArrayList<Period> sixMonths = new ArrayList<Period>();
 
132
 
 
133
        for ( int i = 0; i < 10; ++i )
 
134
        {
 
135
            Date startDate = cal.getTime();
 
136
            cal.add( Calendar.MONTH, 5 );
 
137
            cal.set( Calendar.DAY_OF_MONTH, cal.getActualMaximum( Calendar.DAY_OF_MONTH ) );
 
138
            sixMonths.add( new Period( this, startDate, cal.getTime() ) );
 
139
            cal.add( Calendar.DAY_OF_YEAR, 1 );
 
140
        }
 
141
 
 
142
        return sixMonths;
 
143
    }
 
144
}