embulk-output-kintone 0.4.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +63 -5
  3. data/build.gradle +1 -0
  4. data/classpath/commons-csv-1.9.0.jar +0 -0
  5. data/classpath/embulk-output-kintone-1.1.0.jar +0 -0
  6. data/classpath/externalsortinginjava-0.6.2.jar +0 -0
  7. data/classpath/{shadow-kintone-java-client-0.4.1-all.jar → shadow-kintone-java-client-1.1.0-all.jar} +0 -0
  8. data/src/main/java/org/embulk/output/kintone/KintoneColumnOption.java +6 -2
  9. data/src/main/java/org/embulk/output/kintone/KintoneColumnType.java +572 -0
  10. data/src/main/java/org/embulk/output/kintone/KintoneColumnVisitor.java +214 -135
  11. data/src/main/java/org/embulk/output/kintone/KintoneMode.java +0 -1
  12. data/src/main/java/org/embulk/output/kintone/KintoneOutputPlugin.java +12 -5
  13. data/src/main/java/org/embulk/output/kintone/KintonePageOutput.java +180 -160
  14. data/src/main/java/org/embulk/output/kintone/KintoneSortColumn.java +33 -0
  15. data/src/main/java/org/embulk/output/kintone/PluginTask.java +35 -0
  16. data/src/main/java/org/embulk/output/kintone/deserializer/DeserializeApplier.java +19 -0
  17. data/src/main/java/org/embulk/output/kintone/deserializer/DeserializeException.java +7 -0
  18. data/src/main/java/org/embulk/output/kintone/deserializer/Deserializer.java +279 -0
  19. data/src/main/java/org/embulk/output/kintone/reducer/CSVInputColumnVisitor.java +78 -0
  20. data/src/main/java/org/embulk/output/kintone/reducer/CSVOutputColumnVisitor.java +79 -0
  21. data/src/main/java/org/embulk/output/kintone/reducer/ReduceException.java +11 -0
  22. data/src/main/java/org/embulk/output/kintone/reducer/ReduceType.java +190 -0
  23. data/src/main/java/org/embulk/output/kintone/reducer/ReducedPageOutput.java +100 -0
  24. data/src/main/java/org/embulk/output/kintone/reducer/Reducer.java +355 -0
  25. data/src/test/java/org/embulk/output/kintone/KintoneColumnOptionBuilder.java +9 -3
  26. data/src/test/java/org/embulk/output/kintone/KintoneColumnTypeTest.java +194 -0
  27. data/src/test/java/org/embulk/output/kintone/KintoneColumnVisitorTest.java +703 -61
  28. data/src/test/java/org/embulk/output/kintone/KintoneColumnVisitorVerifier.java +45 -14
  29. data/src/test/java/org/embulk/output/kintone/KintonePageOutputVerifier.java +43 -5
  30. data/src/test/java/org/embulk/output/kintone/TestKintoneOutputPlugin.java +106 -16
  31. data/src/test/java/org/embulk/output/kintone/TestTaskMode.java +12 -0
  32. data/src/test/java/org/embulk/output/kintone/TestTaskReduce.java +46 -0
  33. data/src/test/java/org/embulk/output/kintone/TestTaskReduceException.java +50 -0
  34. data/src/test/java/org/embulk/output/kintone/TestTaskReduceSubtable.java +46 -0
  35. data/src/test/java/org/embulk/output/kintone/deserializer/DeserializerTest.java +165 -0
  36. data/src/test/java/org/embulk/output/kintone/reducer/ReduceTypeTest.java +154 -0
  37. data/src/test/resources/org/embulk/output/kintone/task/config.yml +1 -1
  38. data/src/test/resources/org/embulk/output/kintone/task/mode/config.yml +110 -0
  39. data/src/test/resources/org/embulk/output/kintone/task/mode/input.csv +7 -7
  40. data/src/test/resources/org/embulk/output/kintone/task/mode/insert_add_ignore_nulls_records.jsonl +6 -0
  41. data/src/test/resources/org/embulk/output/kintone/task/mode/insert_add_prefer_nulls_records.jsonl +6 -0
  42. data/src/test/resources/org/embulk/output/kintone/task/mode/insert_add_records.jsonl +6 -6
  43. data/src/test/resources/org/embulk/output/kintone/task/mode/update_update_ignore_nulls_records.jsonl +3 -0
  44. data/src/test/resources/org/embulk/output/kintone/task/mode/update_update_prefer_nulls_records.jsonl +3 -0
  45. data/src/test/resources/org/embulk/output/kintone/task/mode/update_update_records.jsonl +6 -3
  46. data/src/test/resources/org/embulk/output/kintone/task/mode/upsert_add_ignore_nulls_records.jsonl +3 -0
  47. data/src/test/resources/org/embulk/output/kintone/task/mode/upsert_add_prefer_nulls_records.jsonl +3 -0
  48. data/src/test/resources/org/embulk/output/kintone/task/mode/upsert_add_records.jsonl +2 -2
  49. data/src/test/resources/org/embulk/output/kintone/task/mode/upsert_update_ignore_nulls_records.jsonl +3 -0
  50. data/src/test/resources/org/embulk/output/kintone/task/mode/upsert_update_prefer_nulls_records.jsonl +3 -0
  51. data/src/test/resources/org/embulk/output/kintone/task/mode/upsert_update_records.jsonl +4 -4
  52. data/src/test/resources/org/embulk/output/kintone/task/mode/values_ignore_nulls.json +1 -0
  53. data/src/test/resources/org/embulk/output/kintone/task/mode/values_prefer_nulls.json +1 -0
  54. data/src/test/resources/org/embulk/output/kintone/task/reduce/config.yml +171 -0
  55. data/src/test/resources/org/embulk/output/kintone/task/reduce/input.csv +7 -0
  56. data/src/test/resources/org/embulk/output/kintone/task/reduce/insert_add_ignore_nulls_records.jsonl +6 -0
  57. data/src/test/resources/org/embulk/output/kintone/task/reduce/insert_add_prefer_nulls_records.jsonl +6 -0
  58. data/src/test/resources/org/embulk/output/kintone/task/reduce/insert_add_records.jsonl +6 -0
  59. data/src/test/resources/org/embulk/output/kintone/task/reduce/update_update_ignore_nulls_records.jsonl +3 -0
  60. data/src/test/resources/org/embulk/output/kintone/task/reduce/update_update_prefer_nulls_records.jsonl +3 -0
  61. data/src/test/resources/org/embulk/output/kintone/task/reduce/update_update_records.jsonl +6 -0
  62. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_add_ignore_nulls_records.jsonl +3 -0
  63. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_add_prefer_nulls_records.jsonl +3 -0
  64. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_add_records.jsonl +2 -0
  65. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_update_ignore_nulls_records.jsonl +3 -0
  66. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_update_prefer_nulls_records.jsonl +3 -0
  67. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_update_records.jsonl +4 -0
  68. data/src/test/resources/org/embulk/output/kintone/task/reduce/values.json +1 -0
  69. data/src/test/resources/org/embulk/output/kintone/task/reduce/values_ignore_nulls.json +1 -0
  70. data/src/test/resources/org/embulk/output/kintone/task/reduce/values_prefer_nulls.json +1 -0
  71. data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/config.yml +36 -0
  72. data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/derived_columns.json +1 -0
  73. data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/input.csv +13 -0
  74. data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/insert_add_records.jsonl +2 -0
  75. data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/update_update_records.jsonl +2 -0
  76. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/config.yml +343 -0
  77. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/derived_columns.json +1 -0
  78. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/input.csv +13 -0
  79. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/insert_add_ignore_nulls_records.jsonl +6 -0
  80. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/insert_add_prefer_nulls_records.jsonl +6 -0
  81. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/insert_add_records.jsonl +6 -0
  82. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/update_update_ignore_nulls_records.jsonl +3 -0
  83. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/update_update_prefer_nulls_records.jsonl +3 -0
  84. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/update_update_records.jsonl +6 -0
  85. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_add_ignore_nulls_records.jsonl +3 -0
  86. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_add_prefer_nulls_records.jsonl +3 -0
  87. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_add_records.jsonl +0 -0
  88. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_update_ignore_nulls_records.jsonl +3 -0
  89. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_update_prefer_nulls_records.jsonl +3 -0
  90. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_update_records.jsonl +6 -0
  91. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/values.json +1 -0
  92. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/values_ignore_nulls.json +1 -0
  93. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/values_prefer_nulls.json +1 -0
  94. metadata +73 -4
  95. data/classpath/embulk-output-kintone-0.4.1.jar +0 -0
@@ -0,0 +1,572 @@
1
+ package org.embulk.output.kintone;
2
+
3
+ import com.kintone.client.model.record.CheckBoxFieldValue;
4
+ import com.kintone.client.model.record.DateFieldValue;
5
+ import com.kintone.client.model.record.DateTimeFieldValue;
6
+ import com.kintone.client.model.record.DropDownFieldValue;
7
+ import com.kintone.client.model.record.FieldValue;
8
+ import com.kintone.client.model.record.FileFieldValue;
9
+ import com.kintone.client.model.record.GroupSelectFieldValue;
10
+ import com.kintone.client.model.record.LinkFieldValue;
11
+ import com.kintone.client.model.record.MultiLineTextFieldValue;
12
+ import com.kintone.client.model.record.MultiSelectFieldValue;
13
+ import com.kintone.client.model.record.NumberFieldValue;
14
+ import com.kintone.client.model.record.OrganizationSelectFieldValue;
15
+ import com.kintone.client.model.record.RadioButtonFieldValue;
16
+ import com.kintone.client.model.record.RichTextFieldValue;
17
+ import com.kintone.client.model.record.SingleLineTextFieldValue;
18
+ import com.kintone.client.model.record.SubtableFieldValue;
19
+ import com.kintone.client.model.record.TimeFieldValue;
20
+ import com.kintone.client.model.record.UpdateKey;
21
+ import com.kintone.client.model.record.UserSelectFieldValue;
22
+ import java.math.BigDecimal;
23
+ import java.time.Instant;
24
+ import java.time.LocalDate;
25
+ import java.time.LocalTime;
26
+ import java.time.ZoneId;
27
+ import java.time.ZoneOffset;
28
+ import java.time.ZonedDateTime;
29
+ import java.util.Arrays;
30
+ import java.util.Collections;
31
+ import java.util.List;
32
+ import java.util.stream.Collectors;
33
+ import org.embulk.output.kintone.deserializer.Deserializer;
34
+ import org.embulk.spi.time.Timestamp;
35
+ import org.embulk.spi.type.Type;
36
+ import org.embulk.spi.type.Types;
37
+ import org.msgpack.value.Value;
38
+ import org.msgpack.value.ValueFactory;
39
+
40
+ public enum KintoneColumnType {
41
+ SINGLE_LINE_TEXT {
42
+ @Override
43
+ public SingleLineTextFieldValue getFieldValue() {
44
+ return new SingleLineTextFieldValue(null);
45
+ }
46
+
47
+ @Override
48
+ public SingleLineTextFieldValue getFieldValue(String value, KintoneColumnOption option) {
49
+ return new SingleLineTextFieldValue(value);
50
+ }
51
+
52
+ @Override
53
+ public void setUpdateKey(UpdateKey updateKey, String field) {
54
+ updateKey.setField(field);
55
+ }
56
+
57
+ @Override
58
+ public void setUpdateKey(UpdateKey updateKey, String field, FieldValue value) {
59
+ updateKey.setField(field).setValue(((SingleLineTextFieldValue) value).getValue());
60
+ }
61
+
62
+ @Override
63
+ public Value asValue(FieldValue value) {
64
+ return ValueFactory.newString(((SingleLineTextFieldValue) value).getValue());
65
+ }
66
+
67
+ @Override
68
+ protected List<Type> getSupportedTypes() {
69
+ return Arrays.asList(Types.BOOLEAN, Types.LONG, Types.DOUBLE, Types.TIMESTAMP, Types.JSON);
70
+ }
71
+ },
72
+ MULTI_LINE_TEXT {
73
+ @Override
74
+ public MultiLineTextFieldValue getFieldValue() {
75
+ return new MultiLineTextFieldValue(null);
76
+ }
77
+
78
+ @Override
79
+ public MultiLineTextFieldValue getFieldValue(String value, KintoneColumnOption option) {
80
+ return new MultiLineTextFieldValue(value);
81
+ }
82
+
83
+ @Override
84
+ public Value asValue(FieldValue value) {
85
+ return ValueFactory.newString(((MultiLineTextFieldValue) value).getValue());
86
+ }
87
+
88
+ @Override
89
+ protected List<Type> getSupportedTypes() {
90
+ return Arrays.asList(Types.BOOLEAN, Types.LONG, Types.DOUBLE, Types.TIMESTAMP, Types.JSON);
91
+ }
92
+ },
93
+ RICH_TEXT {
94
+ @Override
95
+ public RichTextFieldValue getFieldValue() {
96
+ return new RichTextFieldValue(null);
97
+ }
98
+
99
+ @Override
100
+ public RichTextFieldValue getFieldValue(String value, KintoneColumnOption option) {
101
+ return new RichTextFieldValue(value);
102
+ }
103
+
104
+ @Override
105
+ public Value asValue(FieldValue value) {
106
+ return ValueFactory.newString(((RichTextFieldValue) value).getValue());
107
+ }
108
+
109
+ @Override
110
+ protected List<Type> getSupportedTypes() {
111
+ return Arrays.asList(Types.BOOLEAN, Types.LONG, Types.DOUBLE, Types.TIMESTAMP, Types.JSON);
112
+ }
113
+ },
114
+ NUMBER {
115
+ @Override
116
+ public NumberFieldValue getFieldValue() {
117
+ return new NumberFieldValue(null);
118
+ }
119
+
120
+ @Override
121
+ public NumberFieldValue getFieldValue(boolean value, KintoneColumnOption option) {
122
+ return getFieldValue(value ? "1" : "0", option);
123
+ }
124
+
125
+ @Override
126
+ public NumberFieldValue getFieldValue(String value, KintoneColumnOption option) {
127
+ return new NumberFieldValue(new BigDecimal(value.isEmpty() ? "0" : value));
128
+ }
129
+
130
+ @Override
131
+ public NumberFieldValue getFieldValue(Timestamp value, KintoneColumnOption option) {
132
+ return (NumberFieldValue) getFieldValue(value.getEpochSecond(), option);
133
+ }
134
+
135
+ @Override
136
+ public void setUpdateKey(UpdateKey updateKey, String field) {
137
+ updateKey.setField(field);
138
+ }
139
+
140
+ @Override
141
+ public void setUpdateKey(UpdateKey updateKey, String field, FieldValue value) {
142
+ updateKey.setField(field).setValue(((NumberFieldValue) value).getValue());
143
+ }
144
+
145
+ @Override
146
+ public Value asValue(FieldValue value) {
147
+ return ValueFactory.newString(((NumberFieldValue) value).getValue().toString());
148
+ }
149
+
150
+ @Override
151
+ protected List<Type> getSupportedTypes() {
152
+ return Arrays.asList(Types.BOOLEAN, Types.LONG, Types.DOUBLE, Types.TIMESTAMP);
153
+ }
154
+ },
155
+ CHECK_BOX {
156
+ @Override
157
+ public CheckBoxFieldValue getFieldValue() {
158
+ return new CheckBoxFieldValue();
159
+ }
160
+
161
+ @Override
162
+ public CheckBoxFieldValue getFieldValue(String value, KintoneColumnOption option) {
163
+ return new CheckBoxFieldValue(asList(value, option));
164
+ }
165
+
166
+ @Override
167
+ public Value asValue(FieldValue value) {
168
+ return ValueFactory.newArray(
169
+ ((CheckBoxFieldValue) value)
170
+ .getValues().stream().map(ValueFactory::newString).collect(Collectors.toList()));
171
+ }
172
+
173
+ @Override
174
+ protected List<Type> getSupportedTypes() {
175
+ return Collections.emptyList();
176
+ }
177
+ },
178
+ RADIO_BUTTON {
179
+ @Override
180
+ public RadioButtonFieldValue getFieldValue() {
181
+ return new RadioButtonFieldValue(null);
182
+ }
183
+
184
+ @Override
185
+ public RadioButtonFieldValue getFieldValue(String value, KintoneColumnOption option) {
186
+ return new RadioButtonFieldValue(value);
187
+ }
188
+
189
+ @Override
190
+ public Value asValue(FieldValue value) {
191
+ return ValueFactory.newString(((RadioButtonFieldValue) value).getValue());
192
+ }
193
+
194
+ @Override
195
+ protected List<Type> getSupportedTypes() {
196
+ return Collections.emptyList();
197
+ }
198
+ },
199
+ MULTI_SELECT {
200
+ @Override
201
+ public MultiSelectFieldValue getFieldValue() {
202
+ return new MultiSelectFieldValue();
203
+ }
204
+
205
+ @Override
206
+ public MultiSelectFieldValue getFieldValue(String value, KintoneColumnOption option) {
207
+ return new MultiSelectFieldValue(asList(value, option));
208
+ }
209
+
210
+ @Override
211
+ public Value asValue(FieldValue value) {
212
+ return ValueFactory.newArray(
213
+ ((MultiSelectFieldValue) value)
214
+ .getValues().stream().map(ValueFactory::newString).collect(Collectors.toList()));
215
+ }
216
+
217
+ @Override
218
+ protected List<Type> getSupportedTypes() {
219
+ return Collections.emptyList();
220
+ }
221
+ },
222
+ DROP_DOWN {
223
+ @Override
224
+ public DropDownFieldValue getFieldValue() {
225
+ return new DropDownFieldValue(null);
226
+ }
227
+
228
+ @Override
229
+ public DropDownFieldValue getFieldValue(String value, KintoneColumnOption option) {
230
+ return new DropDownFieldValue(value);
231
+ }
232
+
233
+ @Override
234
+ public Value asValue(FieldValue value) {
235
+ return ValueFactory.newString(((DropDownFieldValue) value).getValue());
236
+ }
237
+
238
+ @Override
239
+ protected List<Type> getSupportedTypes() {
240
+ return Collections.emptyList();
241
+ }
242
+ },
243
+ USER_SELECT {
244
+ @Override
245
+ public UserSelectFieldValue getFieldValue() {
246
+ return new UserSelectFieldValue();
247
+ }
248
+
249
+ @Override
250
+ public UserSelectFieldValue getFieldValue(String value, KintoneColumnOption option) {
251
+ throw new UnsupportedOperationException();
252
+ }
253
+
254
+ @Override
255
+ public Value asValue(FieldValue value) {
256
+ throw new UnsupportedOperationException();
257
+ }
258
+
259
+ @Override
260
+ protected List<Type> getSupportedTypes() {
261
+ return Collections.emptyList();
262
+ }
263
+ },
264
+ ORGANIZATION_SELECT {
265
+ @Override
266
+ public OrganizationSelectFieldValue getFieldValue() {
267
+ return new OrganizationSelectFieldValue();
268
+ }
269
+
270
+ @Override
271
+ public OrganizationSelectFieldValue getFieldValue(String value, KintoneColumnOption option) {
272
+ throw new UnsupportedOperationException();
273
+ }
274
+
275
+ @Override
276
+ public Value asValue(FieldValue value) {
277
+ throw new UnsupportedOperationException();
278
+ }
279
+
280
+ @Override
281
+ protected List<Type> getSupportedTypes() {
282
+ return Collections.emptyList();
283
+ }
284
+ },
285
+ GROUP_SELECT {
286
+ @Override
287
+ public GroupSelectFieldValue getFieldValue() {
288
+ return new GroupSelectFieldValue();
289
+ }
290
+
291
+ @Override
292
+ public GroupSelectFieldValue getFieldValue(String value, KintoneColumnOption option) {
293
+ throw new UnsupportedOperationException();
294
+ }
295
+
296
+ @Override
297
+ public Value asValue(FieldValue value) {
298
+ throw new UnsupportedOperationException();
299
+ }
300
+
301
+ @Override
302
+ protected List<Type> getSupportedTypes() {
303
+ return Collections.emptyList();
304
+ }
305
+ },
306
+ DATE {
307
+ @Override
308
+ public DateFieldValue getFieldValue() {
309
+ return new DateFieldValue(null);
310
+ }
311
+
312
+ @Override
313
+ public DateFieldValue getFieldValue(long value, KintoneColumnOption option) {
314
+ return getFieldValue(Timestamp.ofEpochSecond(value), option);
315
+ }
316
+
317
+ @Override
318
+ public DateFieldValue getFieldValue(double value, KintoneColumnOption option) {
319
+ return getFieldValue(Double.valueOf(value).longValue(), option);
320
+ }
321
+
322
+ @Override
323
+ public DateFieldValue getFieldValue(String value, KintoneColumnOption option) {
324
+ return value.isEmpty()
325
+ ? getFieldValue(EPOCH, option)
326
+ : new DateFieldValue(
327
+ LocalDate.parse(value)
328
+ .atStartOfDay(ZoneOffset.UTC)
329
+ .withZoneSameInstant(getZoneId(option))
330
+ .toLocalDate());
331
+ }
332
+
333
+ @Override
334
+ public DateFieldValue getFieldValue(Timestamp value, KintoneColumnOption option) {
335
+ return new DateFieldValue(value.getInstant().atZone(getZoneId(option)).toLocalDate());
336
+ }
337
+
338
+ @Override
339
+ public Value asValue(FieldValue value) {
340
+ return ValueFactory.newString(((DateFieldValue) value).getValue().toString());
341
+ }
342
+
343
+ @Override
344
+ protected List<Type> getSupportedTypes() {
345
+ return Arrays.asList(Types.LONG, Types.DOUBLE, Types.TIMESTAMP);
346
+ }
347
+ },
348
+ TIME {
349
+ @Override
350
+ public TimeFieldValue getFieldValue() {
351
+ return new TimeFieldValue(null);
352
+ }
353
+
354
+ @Override
355
+ public TimeFieldValue getFieldValue(long value, KintoneColumnOption option) {
356
+ return getFieldValue(Timestamp.ofEpochSecond(value), option);
357
+ }
358
+
359
+ @Override
360
+ public TimeFieldValue getFieldValue(double value, KintoneColumnOption option) {
361
+ return getFieldValue(Double.valueOf(value).longValue(), option);
362
+ }
363
+
364
+ @Override
365
+ public TimeFieldValue getFieldValue(String value, KintoneColumnOption option) {
366
+ return value.isEmpty()
367
+ ? getFieldValue(EPOCH, option)
368
+ : new TimeFieldValue(
369
+ LocalTime.parse(value)
370
+ .atOffset(ZoneOffset.UTC)
371
+ .withOffsetSameInstant(getZoneOffset(option))
372
+ .toLocalTime());
373
+ }
374
+
375
+ @Override
376
+ public TimeFieldValue getFieldValue(Timestamp value, KintoneColumnOption option) {
377
+ return new TimeFieldValue(value.getInstant().atZone(getZoneId(option)).toLocalTime());
378
+ }
379
+
380
+ @Override
381
+ public Value asValue(FieldValue value) {
382
+ return ValueFactory.newString(((TimeFieldValue) value).getValue().toString());
383
+ }
384
+
385
+ @Override
386
+ protected List<Type> getSupportedTypes() {
387
+ return Arrays.asList(Types.LONG, Types.DOUBLE, Types.TIMESTAMP);
388
+ }
389
+ },
390
+ DATETIME {
391
+ @Override
392
+ public DateTimeFieldValue getFieldValue() {
393
+ return new DateTimeFieldValue(null);
394
+ }
395
+
396
+ @Override
397
+ public DateTimeFieldValue getFieldValue(long value, KintoneColumnOption option) {
398
+ return getFieldValue(Timestamp.ofEpochSecond(value), option);
399
+ }
400
+
401
+ @Override
402
+ public DateTimeFieldValue getFieldValue(double value, KintoneColumnOption option) {
403
+ return getFieldValue(Double.valueOf(value).longValue(), option);
404
+ }
405
+
406
+ @Override
407
+ public DateTimeFieldValue getFieldValue(String value, KintoneColumnOption option) {
408
+ return value.isEmpty()
409
+ ? getFieldValue(EPOCH, option)
410
+ : new DateTimeFieldValue(ZonedDateTime.parse(value));
411
+ }
412
+
413
+ @Override
414
+ public DateTimeFieldValue getFieldValue(Timestamp value, KintoneColumnOption option) {
415
+ return new DateTimeFieldValue(value.getInstant().atZone(ZoneOffset.UTC));
416
+ }
417
+
418
+ @Override
419
+ public Value asValue(FieldValue value) {
420
+ return ValueFactory.newString(((DateTimeFieldValue) value).getValue().toString());
421
+ }
422
+
423
+ @Override
424
+ protected List<Type> getSupportedTypes() {
425
+ return Arrays.asList(Types.LONG, Types.DOUBLE, Types.TIMESTAMP);
426
+ }
427
+ },
428
+ LINK {
429
+ @Override
430
+ public LinkFieldValue getFieldValue() {
431
+ return new LinkFieldValue(null);
432
+ }
433
+
434
+ @Override
435
+ public LinkFieldValue getFieldValue(String value, KintoneColumnOption option) {
436
+ return new LinkFieldValue(value);
437
+ }
438
+
439
+ @Override
440
+ public Value asValue(FieldValue value) {
441
+ return ValueFactory.newString(((LinkFieldValue) value).getValue());
442
+ }
443
+
444
+ @Override
445
+ protected List<Type> getSupportedTypes() {
446
+ return Collections.emptyList();
447
+ }
448
+ },
449
+ FILE {
450
+ @Override
451
+ public FileFieldValue getFieldValue() {
452
+ return new FileFieldValue();
453
+ }
454
+
455
+ @Override
456
+ public FileFieldValue getFieldValue(String value, KintoneColumnOption option) {
457
+ throw new UnsupportedOperationException();
458
+ }
459
+
460
+ @Override
461
+ public Value asValue(FieldValue value) {
462
+ throw new UnsupportedOperationException();
463
+ }
464
+
465
+ @Override
466
+ protected List<Type> getSupportedTypes() {
467
+ return Collections.emptyList();
468
+ }
469
+ },
470
+ SUBTABLE {
471
+ @Override
472
+ public SubtableFieldValue getFieldValue() {
473
+ return new SubtableFieldValue();
474
+ }
475
+
476
+ @Override
477
+ public SubtableFieldValue getFieldValue(String value, KintoneColumnOption option) {
478
+ return DESERIALIZER.deserialize(value.isEmpty() ? "[]" : value, SubtableFieldValue.class);
479
+ }
480
+
481
+ @Override
482
+ public Value asValue(FieldValue value) {
483
+ throw new UnsupportedOperationException();
484
+ }
485
+
486
+ @Override
487
+ protected List<Type> getSupportedTypes() {
488
+ return Collections.singletonList(Types.JSON);
489
+ }
490
+ };
491
+ private static final Deserializer DESERIALIZER = new Deserializer();
492
+ private static final Timestamp EPOCH = Timestamp.ofInstant(Instant.EPOCH);
493
+
494
+ public static KintoneColumnType getType(
495
+ KintoneColumnOption option, KintoneColumnType defaultType) {
496
+ return option != null ? valueOf(option.getType()) : defaultType;
497
+ }
498
+
499
+ public abstract FieldValue getFieldValue();
500
+
501
+ public FieldValue getFieldValue(boolean value, KintoneColumnOption option) {
502
+ if (getSupportedTypes().contains(Types.BOOLEAN)) {
503
+ return getFieldValue(String.valueOf(value), option);
504
+ } else {
505
+ throw new UnsupportedOperationException();
506
+ }
507
+ }
508
+
509
+ public FieldValue getFieldValue(long value, KintoneColumnOption option) {
510
+ if (getSupportedTypes().contains(Types.LONG)) {
511
+ return getFieldValue(String.valueOf(value), option);
512
+ } else {
513
+ throw new UnsupportedOperationException();
514
+ }
515
+ }
516
+
517
+ public FieldValue getFieldValue(double value, KintoneColumnOption option) {
518
+ if (getSupportedTypes().contains(Types.DOUBLE)) {
519
+ return getFieldValue(String.valueOf(value), option);
520
+ } else {
521
+ throw new UnsupportedOperationException();
522
+ }
523
+ }
524
+
525
+ public abstract FieldValue getFieldValue(String value, KintoneColumnOption option);
526
+
527
+ public FieldValue getFieldValue(Timestamp value, KintoneColumnOption option) {
528
+ if (getSupportedTypes().contains(Types.TIMESTAMP)) {
529
+ return getFieldValue(value.getInstant().toString(), option);
530
+ } else {
531
+ throw new UnsupportedOperationException();
532
+ }
533
+ }
534
+
535
+ public FieldValue getFieldValue(Value value, KintoneColumnOption option) {
536
+ if (getSupportedTypes().contains(Types.JSON)) {
537
+ return getFieldValue(value.toJson(), option);
538
+ } else {
539
+ throw new UnsupportedOperationException();
540
+ }
541
+ }
542
+
543
+ public void setUpdateKey(UpdateKey updateKey, String field) {
544
+ throw new UnsupportedOperationException();
545
+ }
546
+
547
+ public void setUpdateKey(UpdateKey updateKey, String field, FieldValue value) {
548
+ throw new UnsupportedOperationException();
549
+ }
550
+
551
+ public abstract Value asValue(FieldValue value);
552
+
553
+ protected abstract List<Type> getSupportedTypes();
554
+
555
+ private static List<String> asList(String value, KintoneColumnOption option) {
556
+ return value.isEmpty()
557
+ ? Collections.emptyList()
558
+ : Arrays.asList(value.split(getValueSeparator(option), 0));
559
+ }
560
+
561
+ private static ZoneOffset getZoneOffset(KintoneColumnOption option) {
562
+ return getZoneId(option).getRules().getOffset(Instant.EPOCH);
563
+ }
564
+
565
+ private static ZoneId getZoneId(KintoneColumnOption option) {
566
+ return ZoneId.of(option != null ? option.getTimezone() : "UTC");
567
+ }
568
+
569
+ private static String getValueSeparator(KintoneColumnOption option) {
570
+ return option != null ? option.getValueSeparator() : ",";
571
+ }
572
+ }