Statistics
| Revision:

gvsig-tools / org.gvsig.tools / library / trunk / org.gvsig.tools / org.gvsig.tools.lib / src / main / java / org / gvsig / tools / dataTypes / DataTypeUtils.java @ 2630

History | View | Annotate | Download (16.3 KB)

1 1882 jjdelcerro
package org.gvsig.tools.dataTypes;
2
3 2177 jjdelcerro
import java.math.BigDecimal;
4 2424 jjdelcerro
import java.sql.Timestamp;
5
import java.time.Instant;
6 2208 jjdelcerro
import java.time.LocalDate;
7
import java.time.LocalDateTime;
8
import java.time.LocalTime;
9
import java.time.ZoneId;
10 2424 jjdelcerro
import java.time.chrono.ChronoLocalDate;
11
import java.time.chrono.ChronoLocalDateTime;
12
import java.time.chrono.ChronoZonedDateTime;
13 2208 jjdelcerro
import java.time.temporal.TemporalAccessor;
14 2105 jjdelcerro
import java.util.Date;
15 2080 jjdelcerro
import java.util.Locale;
16 1882 jjdelcerro
import org.gvsig.tools.ToolsLocator;
17
18
/**
19
 *
20
 * @author jjdelcerro
21
 */
22
public class DataTypeUtils {
23
24 2080 jjdelcerro
    private static CoercionContextLocale COERCE_CONTEXT_DEFAULT_LOCALE ;
25
    private static CoercionContextDecimal COERCE_CONTEXT_DEFAULT_DECIMAL ;
26
27 1946 jjdelcerro
    protected DataTypeUtils() {
28 1882 jjdelcerro
29
    }
30 2080 jjdelcerro
31
    public static CoercionContextLocale coerceContextLocale(Locale locale) {
32 2190 jjdelcerro
      return CoercionContextLocale.create(locale);
33 2080 jjdelcerro
    }
34 1882 jjdelcerro
35 2080 jjdelcerro
    public static CoercionContextLocale coerceContextDefaultLocale() {
36
      if( COERCE_CONTEXT_DEFAULT_LOCALE==null ||
37
          Locale.getDefault()!=COERCE_CONTEXT_DEFAULT_LOCALE.locale() ) {
38 2190 jjdelcerro
        COERCE_CONTEXT_DEFAULT_LOCALE = CoercionContextLocale.create(Locale.getDefault());
39 2080 jjdelcerro
      }
40
      return COERCE_CONTEXT_DEFAULT_LOCALE;
41
    }
42
43
    public static CoercionContextDecimal coerceContextDefaultDecimal() {
44 2172 jjdelcerro
      if( COERCE_CONTEXT_DEFAULT_DECIMAL==null ) {
45 2190 jjdelcerro
        COERCE_CONTEXT_DEFAULT_DECIMAL = CoercionContextDecimal.create(
46 2172 jjdelcerro
                Locale.ENGLISH
47 2080 jjdelcerro
        );
48
      }
49
      return COERCE_CONTEXT_DEFAULT_DECIMAL;
50
    }
51
52
    public static CoercionContextDecimal coerceContextDecimal(Locale locale) {
53 2231 jjdelcerro
      if( COERCE_CONTEXT_DEFAULT_DECIMAL!=null &&
54 2080 jjdelcerro
          locale==COERCE_CONTEXT_DEFAULT_DECIMAL.locale() ) {
55
          return COERCE_CONTEXT_DEFAULT_DECIMAL;
56
      }
57 2190 jjdelcerro
      return CoercionContextDecimal.create(locale);
58 2080 jjdelcerro
    }
59
60
    public static CoercionContextDecimal coerceContextDecimal(Locale locale, int precision, int scale, int roundMode) {
61 2190 jjdelcerro
      return CoercionContextDecimal.create(locale,precision, scale, roundMode);
62 2080 jjdelcerro
    }
63
64 2190 jjdelcerro
    public static Coercion getCoercion(int type) {
65 1882 jjdelcerro
        DataTypesManager manager = ToolsLocator.getDataTypesManager();
66
        DataType dataType = manager.get(type);
67 2190 jjdelcerro
        Coercion c = dataType.getCoercion();
68
        return c;
69
    }
70
71
    public static Object coerce(int type, Object value, Object defaultValue) {
72
        Coercion coercer = getCoercion(type);
73 1882 jjdelcerro
        try {
74 2190 jjdelcerro
            Object x = coercer.coerce(value);
75 1882 jjdelcerro
            if( x == null ) {
76
                return defaultValue;
77
            }
78
            return x;
79
        } catch (CoercionException ex) {
80
            return defaultValue;
81
        }
82
    }
83
84 2105 jjdelcerro
    public static Object coerce(int type, Object value) throws CoercionException {
85 2190 jjdelcerro
        Coercion c = getCoercion(type);
86
        Object x = c.coerce(value);
87 2105 jjdelcerro
        return x;
88
    }
89
90 2197 jjdelcerro
    public static int toInteger(Object value, int defaultValue) {
91 1882 jjdelcerro
        return (int) coerce(DataTypes.INT, value, defaultValue);
92
    }
93
94 2197 jjdelcerro
    public static short toShort(Object value, short defaultValue) {
95
      try {
96
        return (short) coerce(DataTypes.INT, value, defaultValue);
97
      } catch(Throwable th) {
98
        return defaultValue;
99
      }
100
    }
101
102
    public static int toByte(Object value, byte defaultValue) {
103
        return (int) coerce(DataTypes.BYTE, value, defaultValue);
104
    }
105
106
    public static long toLong(Object value, long defaultValue) {
107 2105 jjdelcerro
        return (long) coerce(DataTypes.LONG, value, defaultValue);
108
    }
109
110 2197 jjdelcerro
    public static boolean toBoolean(Object value, boolean defaultValue) {
111 2604 jjdelcerro
        if( value == null ) {
112
            return defaultValue;
113
        }
114
        if( value instanceof Boolean ) {
115
            return (boolean) value;
116
        }
117 2172 jjdelcerro
        return (boolean) coerce(DataTypes.BOOLEAN, value, defaultValue);
118
    }
119
120 2537 jjdelcerro
    public static boolean isTrue(Object value, boolean defaultValue) {
121 2604 jjdelcerro
        if( value == null ) {
122
            return false;
123
        }
124
        if( value instanceof Boolean ) {
125
            return (boolean) value;
126
        }
127 2537 jjdelcerro
        return (boolean) coerce(DataTypes.BOOLEAN, value, defaultValue);
128
    }
129
130
    public static boolean isFalse(Object value, boolean defaultValue) {
131 2604 jjdelcerro
        if( value == null ) {
132
            return true;
133
        }
134
        if( value instanceof Boolean ) {
135
            return ! (boolean) value;
136
        }
137 2537 jjdelcerro
        return ! (boolean) coerce(DataTypes.BOOLEAN, value, defaultValue);
138
    }
139
140 2197 jjdelcerro
    public static float toFloat(Object value, float defaultValue) {
141 2105 jjdelcerro
        return (float) coerce(DataTypes.FLOAT, value, defaultValue);
142
    }
143
144 2197 jjdelcerro
    public static double toDouble(Object value, double defaultValue) {
145 1882 jjdelcerro
        return (double) coerce(DataTypes.DOUBLE, value, defaultValue);
146
    }
147
148
    public static String toString(Object value, String defaultValue) {
149
        return (String) coerce(DataTypes.STRING, value, defaultValue);
150
    }
151 2630 omartinez
152
    public static String toString(Locale locale, Object value, String defaultValue) {
153
        Coercion coercer = getCoercion(DataTypes.STRING);
154
        try {
155
            String x = (String) coercer.coerce(value, CoercionContextLocale.create(locale));
156
            if( x == null ) {
157
                return defaultValue;
158
            }
159
            return x;
160
        } catch (CoercionException ex) {
161
            return defaultValue;
162
        }
163
    }
164 1897 jjdelcerro
165 2105 jjdelcerro
    public static Date toDate(Object value, Date defaultValue) {
166
        return (Date) coerce(DataTypes.DATE, value, defaultValue);
167
    }
168
169
    public static Date toTime(Object value, Date defaultValue) {
170
        return (Date) coerce(DataTypes.TIME, value, defaultValue);
171
    }
172
173
    public static Date toTimestamp(Object value, Date defaultValue) {
174
        return (Date) coerce(DataTypes.TIMESTAMP, value, defaultValue);
175
    }
176 2172 jjdelcerro
177 2424 jjdelcerro
    public static LocalDate toLocalDate(Object value) {
178
        // De momento, dejo esta implementacion para convertir a localdate
179
        // rapidamente, pero habria que ver de repasarsela.
180 2208 jjdelcerro
        if( value instanceof LocalDateTime ) {
181 2424 jjdelcerro
          return (LocalDate) value;
182 2208 jjdelcerro
        }
183
        if( value instanceof TemporalAccessor ) {
184
          try {
185 2424 jjdelcerro
            return LocalDate.from((TemporalAccessor) value);
186 2208 jjdelcerro
          } catch(Exception ex) {
187
          }
188
        }
189 2424 jjdelcerro
        Date d;
190
        if( value instanceof Date ) {
191
            d = (Date) value;
192
        } else {
193
            d = (Date) coerce(DataTypes.TIMESTAMP, value, null);
194
            if( d == null ) {
195
              return null;
196
            }
197 2208 jjdelcerro
        }
198 2424 jjdelcerro
        return LocalDateTime.ofInstant(d.toInstant(), ZoneId.systemDefault()).toLocalDate();
199 2208 jjdelcerro
    }
200
201 2424 jjdelcerro
    public static LocalDate toLocalDate(java.util.Date value) {
202
        return toLocalDate(value.toInstant());
203
    }
204
205
    public static LocalDate toLocalDate(ChronoLocalDateTime value) {
206
        return toLocalDate(value.atZone(ZoneId.systemDefault()));
207
    }
208
209
    public static LocalDate toLocalDate(ChronoLocalDate value) {
210
        return toLocalDate(value.atTime(LocalTime.MIN).atZone(ZoneId.systemDefault()));
211
    }
212
213
    public static LocalDate toLocalDate(LocalTime value) {
214
        return toLocalDate(Instant.ofEpochSecond(value.toSecondOfDay(), value.getSecond()));
215
    }
216
217
    public static LocalDate toLocalDate(ChronoZonedDateTime value) {
218
        return toLocalDate(((ChronoZonedDateTime)value).toInstant());
219
    }
220
221
    public static LocalDate toLocalDate(Instant value) {
222
        return LocalDateTime.ofInstant(value, ZoneId.systemDefault()).toLocalDate();
223
    }
224
225
    public static LocalDateTime toLocalDateTime(Object value) {
226
        // De momento, dejo esta implementacion para convertir a localdatetime
227
        // rapidamente, pero habria que repasarsela.
228 2208 jjdelcerro
        if( value instanceof LocalDateTime ) {
229 2424 jjdelcerro
          return (LocalDateTime) value;
230 2208 jjdelcerro
        }
231
        if( value instanceof TemporalAccessor ) {
232
          try {
233 2424 jjdelcerro
            return LocalDateTime.from((TemporalAccessor) value);
234 2208 jjdelcerro
          } catch(Exception ex) {
235
          }
236
        }
237 2424 jjdelcerro
        Date d;
238
        if( value instanceof Date ) {
239
            d = (Date) value;
240
        } else {
241
            d = (Date) coerce(DataTypes.TIMESTAMP, value, null);
242
            if( d == null ) {
243
              return null;
244
            }
245 2208 jjdelcerro
        }
246 2424 jjdelcerro
        return LocalDateTime.ofInstant(d.toInstant(), ZoneId.systemDefault());
247 2208 jjdelcerro
    }
248
249 2424 jjdelcerro
    public static LocalDateTime toLocalDateTime(java.util.Date value) {
250
        return toLocalDateTime(value.toInstant());
251
    }
252
253
    public static LocalDateTime toLocalDateTime(ChronoLocalDateTime value) {
254
        return toLocalDateTime(value.atZone(ZoneId.systemDefault()));
255
    }
256
257
    public static LocalDateTime toLocalDateTime(ChronoLocalDate value) {
258
        return toLocalDateTime(value.atTime(LocalTime.MIN).atZone(ZoneId.systemDefault()));
259
    }
260
261
    public static LocalDateTime toLocalDateTime(LocalTime value) {
262
        return toLocalDateTime(Instant.ofEpochSecond(value.toSecondOfDay(), value.getSecond()));
263
    }
264
265
    public static LocalDateTime toLocalDateTime(ChronoZonedDateTime value) {
266
        return toLocalDateTime(((ChronoZonedDateTime)value).toInstant());
267
    }
268
269
    public static LocalDateTime toLocalDateTime(Instant value) {
270
        return LocalDateTime.ofInstant(value, ZoneId.systemDefault());
271
    }
272
273 2208 jjdelcerro
    public static LocalTime toLocalTime(Object value) {
274
        // De momento, dejo esta implementacion para convertir a localtime
275
        // rapidamente, pero habria que ver de repasarsela.
276
        if( value instanceof LocalTime ) {
277
          return (LocalTime) value;
278
        }
279
        if( value instanceof TemporalAccessor ) {
280
          try {
281
            return LocalTime.from((TemporalAccessor) value);
282
          } catch(Exception ex) {
283
          }
284
        }
285 2424 jjdelcerro
        Date d;
286
        if( value instanceof Date ) {
287
            d = (Date) value;
288
        } else {
289
            d = (Date) coerce(DataTypes.TIMESTAMP, value, null);
290
            if( d == null ) {
291
              return null;
292
            }
293 2208 jjdelcerro
        }
294
        return LocalDateTime.ofInstant(d.toInstant(), ZoneId.systemDefault()).toLocalTime();
295
    }
296
297 2424 jjdelcerro
    public static LocalTime toLocalTime(java.util.Date value) {
298
        return toLocalTime(value.toInstant());
299
    }
300
301
    public static LocalTime toLocalTime(ChronoLocalDateTime value) {
302
        return toLocalTime(value.atZone(ZoneId.systemDefault()));
303
    }
304
305
    public static LocalTime toLocalTime(ChronoLocalDate value) {
306
        return toLocalTime(value.atTime(LocalTime.MIN).atZone(ZoneId.systemDefault()));
307
    }
308
309
    public static LocalTime toLocalTime(LocalTime value) {
310
        return toLocalTime(Instant.ofEpochSecond(value.toSecondOfDay(), value.getSecond()));
311
    }
312
313
    public static LocalTime toLocalTime(ChronoZonedDateTime value) {
314
        return toLocalTime(((ChronoZonedDateTime)value).toInstant());
315
    }
316
317
    public static LocalTime toLocalTime(Instant value) {
318
        return LocalDateTime.ofInstant(value, ZoneId.systemDefault()).toLocalTime();
319
    }
320
321 2172 jjdelcerro
    public static String toString(Object value) {
322
        return (String) coerce(DataTypes.STRING, value, null);
323
    }
324
325 2424 jjdelcerro
326
    public static java.sql.Date toDate(Object value) {
327
        if( value == null ) {
328
            return null;
329
        }
330
        return (java.sql.Date) coerce(DataTypes.DATE, value, null);
331 2172 jjdelcerro
    }
332
333 2424 jjdelcerro
    public static java.sql.Date toDate(ChronoLocalDateTime value) {
334
        if( value == null ) {
335
            return null;
336
        }
337
        return toDate(value.atZone(ZoneId.systemDefault()));
338 2172 jjdelcerro
    }
339
340 2424 jjdelcerro
    public static java.sql.Date toDate(ChronoLocalDate value) {
341
        if( value == null ) {
342
            return null;
343
        }
344
        return toDate(value.atTime(LocalTime.MIN).atZone(ZoneId.systemDefault()));
345 2172 jjdelcerro
    }
346
347 2424 jjdelcerro
    public static java.sql.Date toDate(LocalTime value) {
348
        if( value == null ) {
349
            return null;
350
        }
351
        return toDate(Instant.ofEpochSecond(value.toSecondOfDay(), value.getSecond()));
352
    }
353
354
    public static java.sql.Date toDate(ChronoZonedDateTime value) {
355
        if( value == null ) {
356
            return null;
357
        }
358
        return toDate(((ChronoZonedDateTime)value).toInstant());
359
    }
360
361
    public static java.sql.Date toDate(Instant value) {
362
        if( value == null ) {
363
            return null;
364
        }
365
        return (java.sql.Date) java.sql.Date.from(value);
366
    }
367
368
    public static java.sql.Time toTime(Object value) {
369
        if( value == null ) {
370
            return null;
371
        }
372
        return (java.sql.Time) coerce(DataTypes.TIME, value, null);
373
    }
374
375
    public static java.sql.Time toTime(ChronoLocalDateTime value) {
376
        if( value == null ) {
377
            return null;
378
        }
379
        return toTime(value.atZone(ZoneId.systemDefault()));
380
    }
381
382
    public static java.sql.Time toTime(ChronoLocalDate value) {
383
        if( value == null ) {
384
            return null;
385
        }
386
        return toTime(value.atTime(LocalTime.MIN).atZone(ZoneId.systemDefault()));
387
    }
388
389
    public static java.sql.Time toTime(LocalTime value) {
390
        if( value == null ) {
391
            return null;
392
        }
393
        return toTime(Instant.ofEpochSecond(value.toSecondOfDay(), value.getSecond()));
394
    }
395
396
    public static java.sql.Time toTime(ChronoZonedDateTime value) {
397
        if( value == null ) {
398
            return null;
399
        }
400
        return toTime(((ChronoZonedDateTime)value).toInstant());
401
    }
402
403
    public static java.sql.Time toTime(Instant value) {
404
        if( value == null ) {
405
            return null;
406
        }
407
        return (java.sql.Time) java.sql.Time.from(value);
408
    }
409
410
    public static java.sql.Timestamp toTimestamp(Object value) {
411
        if( value == null ) {
412
            return null;
413
        }
414
        return (java.sql.Timestamp) coerce(DataTypes.TIMESTAMP, value, null);
415
    }
416
417
    public static java.sql.Timestamp toTimestamp(java.util.Date value) {
418
        if( value == null ) {
419
            return null;
420
        }
421
        return (java.sql.Timestamp) new Timestamp(value.getTime());
422
    }
423
424
    public static java.sql.Timestamp toTimestamp(java.sql.Timestamp value) {
425
        return value;
426
    }
427
428
    public static java.sql.Timestamp toTimestamp(ChronoLocalDateTime value) {
429
        if( value == null ) {
430
            return null;
431
        }
432
        return toTimestamp(value.atZone(ZoneId.systemDefault()));
433
    }
434
435
    public static java.sql.Timestamp toTimestamp(ChronoLocalDate value) {
436
        if( value == null ) {
437
            return null;
438
        }
439
        return toTimestamp(value.atTime(LocalTime.MIN).atZone(ZoneId.systemDefault()));
440
    }
441
442
    public static java.sql.Timestamp toTimestamp(LocalTime value) {
443
        if( value == null ) {
444
            return null;
445
        }
446
        return toTimestamp(Instant.ofEpochSecond(value.toSecondOfDay(), value.getSecond()));
447
    }
448
449
    public static java.sql.Timestamp toTimestamp(ChronoZonedDateTime value) {
450
        if( value == null ) {
451
            return null;
452
        }
453
        return toTimestamp(((ChronoZonedDateTime)value).toInstant());
454
    }
455
456
    public static java.sql.Timestamp toTimestamp(Instant value) {
457
        if( value == null ) {
458
            return null;
459
        }
460
        return (java.sql.Timestamp) java.sql.Timestamp.from(value);
461
    }
462
463 2172 jjdelcerro
    public static float toFloat(Object value) {
464
        return (float) coerce(DataTypes.FLOAT, value, Float.NaN);
465
    }
466
467
    public static double toDouble(Object value) {
468
        return (double) coerce(DataTypes.DOUBLE, value, Double.NaN);
469
    }
470
471
    public static int toInteger(Object value) {
472
        return (int) coerce(DataTypes.INT, value, -1);
473
    }
474
475 2197 jjdelcerro
    public static int toByte(Object value) {
476
        return (int) coerce(DataTypes.BYTE, value, -1);
477
    }
478
479
    public static short toShort(Object value) {
480
      try {
481
        return (short) coerce(DataTypes.INT, value, -1);
482
      } catch(Throwable th) {
483
        return -1;
484
      }
485
    }
486
487 2172 jjdelcerro
    public static long toLong(Object value) {
488
        return (long) coerce(DataTypes.LONG, value, -1);
489
    }
490
491
    public static boolean toBoolean(Object value) {
492
        return (boolean) coerce(DataTypes.BOOLEAN, value, false);
493
    }
494 2177 jjdelcerro
495
    public static BigDecimal toBigDecimal(Object value, int precision, int scale, BigDecimal defaultValue) {
496 2190 jjdelcerro
      CoercionContextDecimal context = CoercionContextDecimal.create(precision, scale);
497
      Coercion c = getCoercion(DataTypes.DECIMAL);
498 2177 jjdelcerro
      try {
499 2190 jjdelcerro
          BigDecimal x = (BigDecimal) c.coerce(value,context);
500 2177 jjdelcerro
          if( x == null ) {
501
              return defaultValue;
502
          }
503
          return x;
504
      } catch (CoercionException ex) {
505
          return defaultValue;
506
      }
507
    }
508
509
    public static BigDecimal toBigDecimal(Object value, int precision, int scale) {
510
      return toBigDecimal(value, precision, scale, null);
511
    }
512 1882 jjdelcerro
}