28c3ed45fdd77f16b8357e70a3c7a2c8c359f4b7
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / format / common / TimePeriodFormatter.java
1 /**
2 * Copyright (C) 2020 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.format.common;
10
11 import org.apache.commons.lang.StringUtils;
12 import org.joda.time.DateTimeFieldType;
13 import org.joda.time.Partial;
14 import org.joda.time.format.DateTimeFormatter;
15
16 import eu.etaxonomy.cdm.common.CdmUtils;
17 import eu.etaxonomy.cdm.model.common.TimePeriod;
18
19 /**
20 * @author a.mueller
21 * @since 27.06.2020
22 */
23 public class TimePeriodFormatter {
24
25 public static final DateTimeFieldType YEAR_TYPE = DateTimeFieldType.year();
26 public static final DateTimeFieldType MONTH_TYPE = DateTimeFieldType.monthOfYear();
27 public static final DateTimeFieldType DAY_TYPE = DateTimeFieldType.dayOfMonth();
28 public static final DateTimeFieldType HOUR_TYPE = DateTimeFieldType.hourOfDay();
29 public static final DateTimeFieldType MINUTE_TYPE = DateTimeFieldType.minuteOfHour();
30
31 public static final TimePeriodFormatter NewDefaultInstance(){
32 return new TimePeriodFormatter();
33 }
34
35 private TimePeriodFormatter(){}
36
37 public String format (TimePeriod timePeriod){
38 String result = null;
39 if ( StringUtils.isNotBlank(timePeriod.getFreeText())){
40 result = timePeriod.getFreeText();
41 }else{
42 result = getTimePeriod(timePeriod);
43 }
44 return result;
45 }
46
47 /**
48 * Returns the concatenation of <code>start</code> and <code>end</code>
49 */
50 public String getTimePeriod(TimePeriod tp){
51 String result = null;
52 DateTimeFormatter formatter = TimePeriodPartialFormatter.NewInstance();
53 if (tp.isContinued()){
54 String strStart = tp.getStart() != null ? tp.getStart().toString(formatter): null;
55 result = CdmUtils.concat("", strStart, "+");
56 }else{
57 Partial start = tp.getStart();
58 Partial end = tp.getEnd();
59 if (start != null && end != null){
60 if (start.isSupported(YEAR_TYPE) && end.isSupported(YEAR_TYPE)
61 && start.get(YEAR_TYPE) == end.get(YEAR_TYPE)){
62 if (start.getFields().length == 1){
63 end = null;
64 }else{
65 start = start.without(YEAR_TYPE);
66 }
67 }
68 if (end != null && !start.isSupported(YEAR_TYPE) && start.isSupported(MONTH_TYPE) &&
69 end.isSupported(MONTH_TYPE) && start.get(MONTH_TYPE) == end.get(MONTH_TYPE)){
70 start = start.without(MONTH_TYPE);
71 }
72 }
73 String strStart = start != null ? start.toString(formatter): null;
74 String strEnd = end != null ? end.toString(formatter): null;
75 result = CdmUtils.concat(TimePeriod.SEP, strStart, strEnd);
76 }
77
78 return result;
79 }
80
81 public String getYear(TimePeriod tp){
82 String result = "";
83 if (tp.getStartYear() != null){
84 result += String.valueOf(tp.getStartYear());
85 if (tp.getEndYear() != null && !tp.getStartYear().equals(tp.getEndYear())){
86 result += TimePeriod.SEP + String.valueOf(tp.getEndYear());
87 }
88 }else{
89 if (tp.getEndYear() != null){
90 result += String.valueOf(tp.getEndYear());
91 }
92 }
93 if (tp.isContinued()){
94 result += "+";
95 }
96 return result;
97 }
98 }