Project

General

Profile

Download (11.9 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2018 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
package eu.etaxonomy.cdm.model.common;
10

    
11
import java.util.Calendar;
12
import java.util.Date;
13

    
14
import javax.persistence.Embeddable;
15
import javax.persistence.Transient;
16
import javax.xml.bind.annotation.XmlAccessType;
17
import javax.xml.bind.annotation.XmlAccessorType;
18
import javax.xml.bind.annotation.XmlElement;
19
import javax.xml.bind.annotation.XmlRootElement;
20
import javax.xml.bind.annotation.XmlType;
21
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
22

    
23
import org.apache.log4j.Logger;
24
import org.hibernate.annotations.Type;
25
import org.hibernate.search.annotations.Analyze;
26
import org.hibernate.search.annotations.Field;
27
import org.hibernate.search.annotations.FieldBridge;
28
import org.joda.time.DateTimeFieldType;
29
import org.joda.time.Partial;
30
import org.joda.time.ReadableInstant;
31

    
32
import com.fasterxml.jackson.annotation.JsonIgnore;
33

    
34
import eu.etaxonomy.cdm.format.common.ExtendedTimePeriodFormatter;
35
import eu.etaxonomy.cdm.hibernate.search.PartialBridge;
36
import eu.etaxonomy.cdm.jaxb.PartialAdapter;
37

    
38
/**
39
 * TimePeriod class with extended time period for "extreme" phases
40
 * like secondary flowering time.
41
 *
42
 * @author a.mueller
43
 * @since 28.04.2020
44
 */
45
@XmlAccessorType(XmlAccessType.FIELD)
46
@XmlType(name = "ExtendedTimePeriod", propOrder = {
47
    "extremeStart",
48
    "extremeEnd"
49
})
50
@XmlRootElement(name = "ExtendedTimePeriod")
51
@Embeddable
52
public class ExtendedTimePeriod extends TimePeriod {
53

    
54
    private static final long serialVersionUID = -6543644293635460526L;
55
    @SuppressWarnings("unused")
56
    private static final Logger logger = Logger.getLogger(ExtendedTimePeriod.class);
57

    
58
    private static ExtendedTimePeriodFormatter formatter = ExtendedTimePeriodFormatter.NewDefaultInstance();
59

    
60
    @XmlElement(name = "ExtremeStart")
61
    @XmlJavaTypeAdapter(value = PartialAdapter.class)
62
    @Type(type="partialUserType")
63
    @Field(analyze = Analyze.NO)
64
    @FieldBridge(impl = PartialBridge.class)
65
    @JsonIgnore // currently used for swagger model scanner
66
    private Partial extremeStart;
67

    
68
    @XmlElement(name = "ExtremeEnd")
69
    @XmlJavaTypeAdapter(value = PartialAdapter.class)
70
    @Type(type="partialUserType")
71
    @Field(analyze = Analyze.NO)
72
    @FieldBridge(impl = PartialBridge.class)
73
    @JsonIgnore // currently used for swagger model scanner
74
    private Partial extremeEnd;
75

    
76
 // ********************** FACTORY METHODS **************************/
77

    
78
    public static final ExtendedTimePeriod NewExtendedInstance(){
79
         return new ExtendedTimePeriod();
80
     }
81

    
82
     public static final ExtendedTimePeriod NewExtendedInstance(Partial startDate){
83
         return new ExtendedTimePeriod(startDate, null, null, null, null);
84
     }
85

    
86
     public static final ExtendedTimePeriod NewExtendedInstance(Partial startDate, Partial endDate){
87
         return new ExtendedTimePeriod(startDate, endDate, null, null, null);
88
     }
89

    
90
     public static final ExtendedTimePeriod NewExtendedInstance(Partial startDate, Partial endDate, Partial extremeStartDate, Partial extremeStartEnd){
91
         return new ExtendedTimePeriod(startDate, endDate, null, extremeStartDate, extremeStartEnd);
92
     }
93

    
94
     public static final ExtendedTimePeriod NewExtendedYearInstance(Integer year){
95
         Integer endYear = null;
96
         return NewExtendedYearInstance(year, endYear, null, null);
97
     }
98

    
99
     public static final ExtendedTimePeriod NewExtendedYearInstance(Integer startYear, Integer endYear){
100
         return NewExtendedYearInstance(startYear, endYear, null, null);
101
     }
102

    
103
     public static final ExtendedTimePeriod NewExtendedYearInstance(Integer startYear, Integer endYear, Integer extremeStartYear, Integer extremeEndYear){
104
         return NewExtendedInstance(yearToPartial(startYear), yearToPartial(endYear), yearToPartial(extremeStartYear), yearToPartial(extremeEndYear));
105
     }
106

    
107
     public static final ExtendedTimePeriod NewExtendedMonthInstance(Integer startMonth, Integer endMonth){
108
         return NewExtendedMonthInstance(startMonth, endMonth, null, null);
109
     }
110

    
111
     public static final ExtendedTimePeriod NewExtendedMonthInstance(Integer startMonth, Integer endMonth, Integer extremeStartMonth, Integer extremeEndMonth){
112
         return NewExtendedInstance(monthToPartial(startMonth), monthToPartial(endMonth), monthToPartial(extremeStartMonth), monthToPartial(extremeEndMonth));
113
     }
114
     public static final ExtendedTimePeriod NewExtendedMonthAndDayInstance(Integer startMonth, Integer startDay, Integer endMonth, Integer endDay, Integer extremeStartMonth, Integer extremeStartDay, Integer extremeEndMonth, Integer extremeEndDay){
115
         return NewExtendedInstance(monthAndDayToPartial(startMonth,startDay), monthAndDayToPartial(endMonth,endDay), monthAndDayToPartial(extremeStartMonth,extremeStartDay), monthAndDayToPartial(extremeEndMonth,extremeEndDay));
116
     }
117

    
118
     /**
119
      * Factory method to create a TimePeriod from a <code>Calendar</code>. The Calendar is stored as the starting instant.
120
      * @return
121
      */
122
     public static final ExtendedTimePeriod NewExtendedInstance(Calendar startCalendar){
123
         return NewExtendedInstance(startCalendar, null, null, null);
124
     }
125

    
126
     /**
127
      * Factory method to create a TimePeriod from a starting and an ending <code>Calendar</code>.
128
      */
129
     public static final ExtendedTimePeriod NewExtendedInstance(Calendar startCalendar, Calendar endCalendar, Calendar extremeStartCalendar, Calendar extremeEndCalendar){
130
         return NewExtendedInstance(calendarToPartial(startCalendar), calendarToPartial(endCalendar), calendarToPartial(extremeStartCalendar), calendarToPartial(extremeEndCalendar));
131
     }
132

    
133
     /**
134
      * Factory method to create an ExtendedTimePeriod from a starting and an ending <code>Date</code>
135
      */
136
     public static final ExtendedTimePeriod NewExtendedInstance(Date startDate, Date endDate, Date extremeStartDate, Date extremeEndDate){
137
         return NewExtendedInstance(dateToPartial(startDate), dateToPartial(endDate), dateToPartial(extremeStartDate), dateToPartial(extremeEndDate));
138
     }
139

    
140
     /**
141
      * Factory method to create a TimePeriod from a <code>ReadableInstant</code>(e.g. <code>DateTime</code>).
142
      * The <code>ReadableInstant</code> is stored as the starting instant.
143
      */
144
     public static final ExtendedTimePeriod NewExtendedInstance(ReadableInstant readableInstant){
145
         return NewExtendedInstance(readableInstant, null, null, null);
146
     }
147

    
148
     /**
149
      * Factory method to create an ExtendedTimePeriod from a starting and an ending <code>ReadableInstant</code>(e.g. <code>DateTime</code>)
150
      * @return
151
      */
152
     public static final ExtendedTimePeriod NewExtendedInstance(ReadableInstant startInstant, ReadableInstant endInstant, ReadableInstant extremeStartInstant, ReadableInstant extremeEndInstant){
153
         return NewExtendedInstance(readableInstantToPartial(startInstant), readableInstantToPartial(endInstant), readableInstantToPartial(extremeStartInstant), readableInstantToPartial(extremeEndInstant));
154
     }
155

    
156

    
157
//*********************** CONSTRUCTOR *********************************/
158

    
159
    protected ExtendedTimePeriod() {
160
        super();
161
    }
162
    private ExtendedTimePeriod(Partial startDate, Partial endDate, String freeText,
163
            Partial extremeStartDate, Partial extremeEndDate) {
164
        super(startDate, endDate, freeText);
165
        this.extremeStart = extremeStartDate;
166
        this.extremeEnd = extremeEndDate;
167
    }
168

    
169
// ***************************** GETTER /SETTER *********************/
170

    
171
    public Partial getExtremeStart() {
172
        return extremeStart;
173
    }
174
    public void setExtremeStart(Partial extremeStart) {
175
        this.extremeStart = extremeStart;
176
    }
177

    
178
    public Partial getExtremeEnd() {
179
        return isContinued() ? null : extremeEnd;
180
    }
181
    public void setExtremeEnd(Partial extremeEnd) {
182
        this.extremeEnd = extremeEnd;
183
    }
184

    
185
    @Override
186
    public void setContinued(boolean isContinued) {
187
        super.setContinued(isContinued);
188
        if (isContinued == true){
189
            this.extremeEnd = CONTINUED;
190
        }else if (isContinued()){
191
            this.extremeEnd = null;
192
        }
193
    }
194

    
195
// ************************************ TRANSIENT **************************/
196

    
197
    /**
198
     * <code>true</code>, if there is no start date, no end date and no freetext representation.
199
     * Also there must be no extreme start or end date or freetext representation.
200
     */
201
    @Override
202
    @Transient
203
    public boolean isEmpty(){
204
        boolean result = super.isEmpty();
205
        if (result == true && isEmpty(extremeStart) && isEmpty(extremeEnd)){
206
            return true;
207
        }else{
208
            return false;
209
        }
210
    }
211

    
212
    @Transient
213
    public Integer getExtremeStartYear(){
214
        return getPartialValue(extremeStart, YEAR_TYPE);
215
    }
216

    
217
    @Transient
218
    public Integer getExtremeStartMonth(){
219
        return getPartialValue(extremeStart, MONTH_TYPE);
220
    }
221

    
222
    @Transient
223
    public Integer getExtremeStartDay(){
224
        return getPartialValue(extremeStart, DAY_TYPE);
225
    }
226

    
227
    @Transient
228
    public Integer getExtremeEndYear(){
229
        return getPartialValue(getExtremeEnd(), YEAR_TYPE);
230
    }
231

    
232
    @Transient
233
    public Integer getExtremeEndMonth(){
234
        return getPartialValue(getExtremeEnd(), MONTH_TYPE);
235
    }
236

    
237
    @Transient
238
    public Integer getExtremeEndDay(){
239
        return getPartialValue(getExtremeEnd(), DAY_TYPE);
240
    }
241

    
242
    public TimePeriod setExtremeStartYear(Integer year){
243
        return setExtremeStartField(year, YEAR_TYPE);
244
    }
245

    
246
    public TimePeriod setExtremeStartMonth(Integer month) throws IndexOutOfBoundsException{
247
        return setExtremeStartField(month, MONTH_TYPE);
248
    }
249

    
250
    public TimePeriod setExtremeStartDay(Integer day) throws IndexOutOfBoundsException{
251
        return setExtremeStartField(day, DAY_TYPE);
252
    }
253

    
254
    public TimePeriod setExtremeEndYear(Integer year){
255
        return setExtremeEndField(year, YEAR_TYPE);
256
    }
257

    
258
    public TimePeriod setExtremeEndMonth(Integer month) throws IndexOutOfBoundsException{
259
        return setExtremeEndField(month, MONTH_TYPE);
260
    }
261

    
262
    public TimePeriod setExtremeEndDay(Integer day) throws IndexOutOfBoundsException{
263
        return setExtremeEndField(day, DAY_TYPE);
264
    }
265

    
266
    @Transient
267
    private TimePeriod setExtremeStartField(Integer value, DateTimeFieldType type)
268
            throws IndexOutOfBoundsException{
269
        extremeStart = setPartialField(extremeStart, value, type);
270
        return this;
271
    }
272

    
273
    @Transient
274
    private TimePeriod setExtremeEndField(Integer value, DateTimeFieldType type)
275
            throws IndexOutOfBoundsException{
276
        extremeEnd = setPartialField(getExtremeEnd(), value, type);
277
        return this;
278
    }
279

    
280
//*********** EQUALS **********************************/
281

    
282
    //we want ExtendedTimePeriod and TimePeriod to be equal
283
    //if both are equal in the TimePeriod part and if
284
    //ExtendedTimePeriod has no verbatimDate defined
285

    
286
    @Override
287
    public boolean equals(Object obj) {
288
        return super.equals(obj);
289
    }
290

    
291
    @Override
292
    public int hashCode() {
293
        int hashCode = super.hashCode();
294
        hashCode += (extremeStart == null? 43: extremeStart.hashCode()) +
295
                (extremeEnd == null? 47: extremeEnd.hashCode());
296
        return hashCode;
297
    }
298

    
299
//**************************** to String ****************************************
300

    
301
    /**
302
     * Returns the {@link #getFreeText()} value if free text is not <code>null</code>.
303
     * Otherwise the concatenation of <code>start</code> and <code>end</code> is returned.
304
     *
305
     * @see java.lang.Object#toString()
306
     */
307
      @Override
308
      public String toString(){
309
         return formatter.format(this);
310
     }
311

    
312
//*********** CLONE **********************************/
313

    
314
    @Override
315
    public ExtendedTimePeriod clone()  {
316
            ExtendedTimePeriod result = (ExtendedTimePeriod)super.clone();
317
            return result;
318
    }
319
}
(10-10/56)