OpenConcerto

Dépôt officiel du code source de l'ERP OpenConcerto
sonarqube

svn://code.openconcerto.org/openconcerto

Rev

Rev 80 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 80 Rev 180
Line 12... Line 12...
12
 */
12
 */
13
 
13
 
14
 package org.openconcerto.openoffice;
14
 package org.openconcerto.openoffice;
15
 
15
 
16
import org.openconcerto.utils.TimeUtils;
16
import org.openconcerto.utils.TimeUtils;
-
 
17
import org.openconcerto.utils.cache.LRUMap;
-
 
18
import org.openconcerto.utils.cc.CachedTransformer;
17
 
19
 
18
import java.math.BigDecimal;
20
import java.math.BigDecimal;
19
import java.math.BigInteger;
21
import java.math.BigInteger;
20
import java.math.MathContext;
22
import java.math.MathContext;
21
import java.text.DateFormat;
23
import java.text.DateFormat;
22
import java.text.ParseException;
24
import java.text.ParseException;
23
import java.text.SimpleDateFormat;
25
import java.text.SimpleDateFormat;
24
import java.util.Calendar;
26
import java.util.Calendar;
25
import java.util.LinkedHashMap;
-
 
26
import java.util.Map;
-
 
27
import java.util.TimeZone;
27
import java.util.TimeZone;
28
 
28
 
29
import javax.xml.datatype.DatatypeConstants;
29
import javax.xml.datatype.DatatypeConstants;
30
import javax.xml.datatype.Duration;
30
import javax.xml.datatype.Duration;
31
 
31
 
Line 41... Line 41...
41
    static private final BigDecimal MS_PER_DAY = BigDecimal.valueOf(24l * 60l * 60l * 1000l);
41
    static private final BigDecimal MS_PER_DAY = BigDecimal.valueOf(24l * 60l * 60l * 1000l);
42
    @GuardedBy("DATE_FORMAT")
42
    @GuardedBy("DATE_FORMAT")
43
    static private final DateFormat DATE_FORMAT;
43
    static private final DateFormat DATE_FORMAT;
44
    static private final ODEpoch DEFAULT_EPOCH;
44
    static private final ODEpoch DEFAULT_EPOCH;
45
    @GuardedBy("cache")
45
    @GuardedBy("cache")
46
    static private final Map<String, ODEpoch> cache = new LinkedHashMap<String, ODEpoch>(4, 0.75f, true) {
46
    static private final CachedTransformer<String, ODEpoch, ParseException> cache = new CachedTransformer<>(new LRUMap<>(16, 4), ODEpoch::new);
47
        @Override
-
 
48
        protected boolean removeEldestEntry(Map.Entry<String, ODEpoch> eldest) {
-
 
49
            return this.size() > 16;
-
 
50
        }
-
 
51
    };
-
 
52
 
47
 
53
    static {
48
    static {
54
        DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
49
        DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
55
        DATE_FORMAT.setCalendar(Calendar.getInstance(TimeZone.getTimeZone("UTC")));
50
        DATE_FORMAT.setCalendar(Calendar.getInstance(TimeZone.getTimeZone("UTC")));
56
        try {
51
        try {
Line 68... Line 63...
68
    static public final ODEpoch getInstance(String date) throws ParseException {
63
    static public final ODEpoch getInstance(String date) throws ParseException {
69
        if (date == null || date.equals(DEFAULT_EPOCH.getDateString())) {
64
        if (date == null || date.equals(DEFAULT_EPOCH.getDateString())) {
70
            return DEFAULT_EPOCH;
65
            return DEFAULT_EPOCH;
71
        } else {
66
        } else {
72
            synchronized (cache) {
67
            synchronized (cache) {
73
                ODEpoch res = cache.get(date);
68
                return cache.transformChecked(date);
74
                if (res == null) {
-
 
75
                    res = new ODEpoch(date);
-
 
76
                    cache.put(date, res);
-
 
77
                }
-
 
78
                return res;
-
 
79
            }
69
            }
80
        }
70
        }
81
    }
71
    }
82
 
72
 
-
 
73
    public static final BigDecimal getDays(final java.time.Duration d) {
-
 
74
        return getDays(d.toMillis());
-
 
75
    }
-
 
76
 
-
 
77
    public static final BigDecimal getDays(final long millis) {
-
 
78
        return BigDecimal.valueOf(millis).divide(MS_PER_DAY, MathContext.DECIMAL128);
-
 
79
    }
-
 
80
 
83
    static private final Calendar parse(final String date) throws ParseException {
81
    static private final Calendar parse(final String date) throws ParseException {
84
        synchronized (DATE_FORMAT) {
82
        synchronized (DATE_FORMAT) {
85
            final Calendar cal = (Calendar) DATE_FORMAT.getCalendar().clone();
83
            final Calendar cal = (Calendar) DATE_FORMAT.getCalendar().clone();
86
            cal.setTime(DATE_FORMAT.parse(date));
84
            cal.setTime(DATE_FORMAT.parse(date));
87
            return cal;
85
            return cal;
Line 137... Line 135...
137
 
135
 
138
    public final BigDecimal getDays(final Calendar cal) {
136
    public final BigDecimal getDays(final Calendar cal) {
139
        // can't use Duration.normalizeWith() since it doesn't handle DST, i.e. going from winter to
137
        // can't use Duration.normalizeWith() since it doesn't handle DST, i.e. going from winter to
140
        // summer at midnight will miss a day
138
        // summer at midnight will miss a day
141
        final long diff = TimeUtils.normalizeLocalTime(cal) - this.epochUTC.getTimeInMillis();
139
        final long diff = TimeUtils.normalizeLocalTime(cal) - this.epochUTC.getTimeInMillis();
142
        return BigDecimal.valueOf(diff).divide(MS_PER_DAY, MathContext.DECIMAL128);
140
        return getDays(diff);
143
    }
141
    }
144
 
142
 
145
    public final Calendar getDate(final BigDecimal days) {
143
    public final Calendar getDate(final BigDecimal days) {
146
        return getDate(days, ODValueType.getCalendar());
144
        return getDate(days, ODValueType.getCalendar());
147
    }
145
    }