embulk-output-kintone 1.0.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +65 -1
- data/build.gradle +1 -0
- data/classpath/commons-csv-1.9.0.jar +0 -0
- data/classpath/embulk-output-kintone-1.2.0.jar +0 -0
- data/classpath/externalsortinginjava-0.6.2.jar +0 -0
- data/classpath/{shadow-kintone-java-client-1.0.0-all.jar → shadow-kintone-java-client-1.2.0-all.jar} +0 -0
- data/src/main/java/org/embulk/output/kintone/KintoneClient.java +117 -0
- data/src/main/java/org/embulk/output/kintone/KintoneColumnOption.java +5 -0
- data/src/main/java/org/embulk/output/kintone/KintoneColumnType.java +226 -5
- data/src/main/java/org/embulk/output/kintone/KintoneColumnVisitor.java +82 -13
- data/src/main/java/org/embulk/output/kintone/KintoneMode.java +52 -4
- data/src/main/java/org/embulk/output/kintone/KintoneOutputPlugin.java +12 -20
- data/src/main/java/org/embulk/output/kintone/KintonePageOutput.java +123 -127
- data/src/main/java/org/embulk/output/kintone/KintoneSortColumn.java +33 -0
- data/src/main/java/org/embulk/output/kintone/PluginTask.java +32 -0
- data/src/main/java/org/embulk/output/kintone/deserializer/DeserializeApplier.java +19 -0
- data/src/main/java/org/embulk/output/kintone/deserializer/DeserializeException.java +7 -0
- data/src/main/java/org/embulk/output/kintone/deserializer/Deserializer.java +279 -0
- data/src/main/java/org/embulk/output/kintone/record/Id.java +18 -0
- data/src/main/java/org/embulk/output/kintone/record/IdOrUpdateKey.java +45 -0
- data/src/main/java/org/embulk/output/kintone/record/Skip.java +14 -0
- data/src/main/java/org/embulk/output/kintone/reducer/CSVInputColumnVisitor.java +78 -0
- data/src/main/java/org/embulk/output/kintone/reducer/CSVOutputColumnVisitor.java +79 -0
- data/src/main/java/org/embulk/output/kintone/reducer/ReduceException.java +11 -0
- data/src/main/java/org/embulk/output/kintone/reducer/ReduceType.java +190 -0
- data/src/main/java/org/embulk/output/kintone/reducer/ReducedPageOutput.java +100 -0
- data/src/main/java/org/embulk/output/kintone/reducer/Reducer.java +355 -0
- data/src/main/java/org/embulk/output/kintone/util/Lazy.java +20 -0
- data/src/test/java/org/embulk/output/kintone/KintoneClientTest.java +139 -0
- data/src/test/java/org/embulk/output/kintone/KintoneColumnOptionBuilder.java +7 -0
- data/src/test/java/org/embulk/output/kintone/KintoneColumnTypeTest.java +194 -0
- data/src/test/java/org/embulk/output/kintone/KintoneColumnVisitorTest.java +183 -64
- data/src/test/java/org/embulk/output/kintone/KintoneColumnVisitorVerifier.java +19 -9
- data/src/test/java/org/embulk/output/kintone/KintonePageOutputVerifier.java +120 -51
- data/src/test/java/org/embulk/output/kintone/MockClient.java +112 -0
- data/src/test/java/org/embulk/output/kintone/TestKintoneOutputPlugin.java +147 -22
- data/src/test/java/org/embulk/output/kintone/TestTaskMode.java +1 -0
- data/src/test/java/org/embulk/output/kintone/TestTaskReduce.java +47 -0
- data/src/test/java/org/embulk/output/kintone/TestTaskReduceException.java +50 -0
- data/src/test/java/org/embulk/output/kintone/TestTaskReduceSubtable.java +47 -0
- data/src/test/java/org/embulk/output/kintone/TestTaskSkip.java +80 -0
- data/src/test/java/org/embulk/output/kintone/TestTaskSkipId.java +80 -0
- data/src/test/java/org/embulk/output/kintone/deserializer/DeserializerTest.java +165 -0
- data/src/test/java/org/embulk/output/kintone/reducer/ReduceTypeTest.java +154 -0
- data/src/test/resources/org/embulk/output/kintone/client/config.yml +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/config.yml +2 -1
- data/src/test/resources/org/embulk/output/kintone/task/mode/config.yml +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/mode/input.csv +7 -7
- data/src/test/resources/org/embulk/output/kintone/task/mode/insert_add_records.jsonl +6 -6
- data/src/test/resources/org/embulk/output/kintone/task/mode/{insert_add_ignore_nulls_records.jsonl → insert_ignore_nulls_add_records.jsonl} +2 -2
- data/src/test/resources/org/embulk/output/kintone/task/mode/{insert_add_prefer_nulls_records.jsonl → insert_prefer_nulls_add_records.jsonl} +6 -6
- data/src/test/resources/org/embulk/output/kintone/task/mode/{update_update_ignore_nulls_records.jsonl → update_ignore_nulls_update_records.jsonl} +2 -2
- data/src/test/resources/org/embulk/output/kintone/task/mode/{update_update_prefer_nulls_records.jsonl → update_prefer_nulls_update_records.jsonl} +3 -3
- data/src/test/resources/org/embulk/output/kintone/task/mode/update_update_records.jsonl +6 -6
- data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_add_records.jsonl → upsert_never_skip_add_records.jsonl} +2 -2
- data/src/test/resources/org/embulk/output/kintone/task/mode/upsert_never_skip_double_single_line_text_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_update_ignore_nulls_records.jsonl → upsert_never_skip_ignore_nulls_update_records.jsonl} +2 -2
- data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_add_prefer_nulls_records.jsonl → upsert_never_skip_prefer_nulls_add_records.jsonl} +3 -3
- data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_update_prefer_nulls_records.jsonl → upsert_never_skip_prefer_nulls_update_records.jsonl} +3 -3
- data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_update_records.jsonl → upsert_never_skip_update_records.jsonl} +4 -4
- data/src/test/resources/org/embulk/output/kintone/task/reduce/config.yml +171 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/input.csv +7 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/insert_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/insert_ignore_nulls_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/insert_prefer_nulls_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/update_ignore_nulls_update_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/update_prefer_nulls_update_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/update_update_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_add_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_double_single_line_text_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_double_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_ignore_nulls_add_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_ignore_nulls_double_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_ignore_nulls_update_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_prefer_nulls_add_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_prefer_nulls_double_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_prefer_nulls_update_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_update_records.jsonl +4 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/config.yml +36 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/derived_columns.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/input.csv +13 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/insert_add_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/update_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/config.yml +343 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/derived_columns.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/input.csv +13 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/insert_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/insert_ignore_nulls_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/insert_prefer_nulls_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/update_ignore_nulls_update_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/update_prefer_nulls_update_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/update_update_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_double_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_ignore_nulls_add_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_ignore_nulls_double_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_ignore_nulls_update_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_prefer_nulls_add_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_prefer_nulls_double_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_prefer_nulls_update_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_update_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/config.yml +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/input.csv +7 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/insert_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/insert_always_skip_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/insert_always_skip_prefer_nulls_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/insert_never_skip_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/insert_never_skip_prefer_nulls_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/insert_prefer_nulls_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_long_number_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_long_number_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_prefer_nulls_long_number_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_prefer_nulls_long_number_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_prefer_nulls_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_update_records.jsonl +5 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/update_never_skip_update_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/update_prefer_nulls_update_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/update_update_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_add_records.jsonl +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_prefer_nulls_string_single_line_text_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_prefer_nulls_string_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_prefer_nulls_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_string_single_line_text_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_string_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_add_records.jsonl +4 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_prefer_nulls_add_records.jsonl +4 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_prefer_nulls_string_single_line_text_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_prefer_nulls_string_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_prefer_nulls_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_string_single_line_text_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_string_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_prefer_nulls_add_records.jsonl +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_prefer_nulls_string_single_line_text_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_prefer_nulls_string_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_prefer_nulls_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_string_single_line_text_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_string_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/config.yml +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/input.csv +7 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_always_skip_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_always_skip_prefer_nulls_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_never_skip_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_never_skip_prefer_nulls_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_prefer_nulls_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip__id_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip__id_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip_prefer_nulls__id_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip_prefer_nulls__id_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip_prefer_nulls_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip_update_records.jsonl +5 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_never_skip_update_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_prefer_nulls_update_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_update_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert__id_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert__id_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip__id_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip__id_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip_prefer_nulls__id_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip_prefer_nulls__id_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip_prefer_nulls_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip_update_records.jsonl +5 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip__id_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip__id_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_add_records.jsonl +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_prefer_nulls__id_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_prefer_nulls__id_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_prefer_nulls_add_records.jsonl +4 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_prefer_nulls_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_update_records.jsonl +5 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_prefer_nulls__id_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_prefer_nulls__id_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_prefer_nulls_add_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_prefer_nulls_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_update_records.jsonl +5 -0
- metadata +163 -17
- data/classpath/embulk-output-kintone-1.0.0.jar +0 -0
- /data/src/test/resources/org/embulk/output/kintone/task/mode/{values.json → upsert_never_skip_double_single_line_text_values.json} +0 -0
- /data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_add_ignore_nulls_records.jsonl → upsert_never_skip_ignore_nulls_add_records.jsonl} +0 -0
- /data/src/test/resources/org/embulk/output/kintone/task/mode/{values_ignore_nulls.json → upsert_never_skip_ignore_nulls_double_single_line_text_values.json} +0 -0
- /data/src/test/resources/org/embulk/output/kintone/task/mode/{values_prefer_nulls.json → upsert_never_skip_prefer_nulls_double_single_line_text_values.json} +0 -0
@@ -0,0 +1,279 @@
|
|
1
|
+
package org.embulk.output.kintone.deserializer;
|
2
|
+
|
3
|
+
import com.fasterxml.jackson.core.JsonParser;
|
4
|
+
import com.fasterxml.jackson.core.ObjectCodec;
|
5
|
+
import com.fasterxml.jackson.databind.DeserializationContext;
|
6
|
+
import com.fasterxml.jackson.databind.JsonNode;
|
7
|
+
import com.fasterxml.jackson.databind.ObjectMapper;
|
8
|
+
import com.fasterxml.jackson.databind.module.SimpleModule;
|
9
|
+
import com.fasterxml.jackson.databind.node.TextNode;
|
10
|
+
import com.kintone.client.model.FileBody;
|
11
|
+
import com.kintone.client.model.Group;
|
12
|
+
import com.kintone.client.model.Organization;
|
13
|
+
import com.kintone.client.model.User;
|
14
|
+
import com.kintone.client.model.record.CalcFieldValue;
|
15
|
+
import com.kintone.client.model.record.CheckBoxFieldValue;
|
16
|
+
import com.kintone.client.model.record.DateFieldValue;
|
17
|
+
import com.kintone.client.model.record.DateTimeFieldValue;
|
18
|
+
import com.kintone.client.model.record.DropDownFieldValue;
|
19
|
+
import com.kintone.client.model.record.FieldType;
|
20
|
+
import com.kintone.client.model.record.FieldValue;
|
21
|
+
import com.kintone.client.model.record.FileFieldValue;
|
22
|
+
import com.kintone.client.model.record.GroupSelectFieldValue;
|
23
|
+
import com.kintone.client.model.record.LinkFieldValue;
|
24
|
+
import com.kintone.client.model.record.MultiLineTextFieldValue;
|
25
|
+
import com.kintone.client.model.record.MultiSelectFieldValue;
|
26
|
+
import com.kintone.client.model.record.NumberFieldValue;
|
27
|
+
import com.kintone.client.model.record.OrganizationSelectFieldValue;
|
28
|
+
import com.kintone.client.model.record.RadioButtonFieldValue;
|
29
|
+
import com.kintone.client.model.record.RichTextFieldValue;
|
30
|
+
import com.kintone.client.model.record.SingleLineTextFieldValue;
|
31
|
+
import com.kintone.client.model.record.SubtableFieldValue;
|
32
|
+
import com.kintone.client.model.record.TableRow;
|
33
|
+
import com.kintone.client.model.record.TimeFieldValue;
|
34
|
+
import com.kintone.client.model.record.UserSelectFieldValue;
|
35
|
+
import java.io.IOException;
|
36
|
+
import java.lang.invoke.MethodHandles;
|
37
|
+
import java.math.BigDecimal;
|
38
|
+
import java.time.LocalDate;
|
39
|
+
import java.time.LocalTime;
|
40
|
+
import java.time.ZonedDateTime;
|
41
|
+
import java.util.Iterator;
|
42
|
+
import java.util.List;
|
43
|
+
import java.util.Spliterator;
|
44
|
+
import java.util.Spliterators;
|
45
|
+
import java.util.function.BiFunction;
|
46
|
+
import java.util.function.Function;
|
47
|
+
import java.util.stream.Collectors;
|
48
|
+
import java.util.stream.Stream;
|
49
|
+
import java.util.stream.StreamSupport;
|
50
|
+
import org.slf4j.Logger;
|
51
|
+
import org.slf4j.LoggerFactory;
|
52
|
+
|
53
|
+
public class Deserializer {
|
54
|
+
private static final Logger LOGGER =
|
55
|
+
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
|
56
|
+
private static final JsonNode NULL = new TextNode(null);
|
57
|
+
private final ObjectMapper mapper = new ObjectMapper();
|
58
|
+
|
59
|
+
public Deserializer() {
|
60
|
+
SimpleModule module = new SimpleModule();
|
61
|
+
// spotless:off
|
62
|
+
addDeserializer(module, SubtableFieldValue.class, this::deserializeSubtable);
|
63
|
+
addDeserializer(module, TableRow.class, this::deserializeTableRow);
|
64
|
+
addDeserializer(module, SingleLineTextFieldValue.class, this::deserializeSingleLineText);
|
65
|
+
addDeserializer(module, MultiLineTextFieldValue.class, this::deserializeMultiLineText);
|
66
|
+
addDeserializer(module, RichTextFieldValue.class, this::deserializeRichText);
|
67
|
+
addDeserializer(module, NumberFieldValue.class, this::deserializeNumber);
|
68
|
+
addDeserializer(module, CalcFieldValue.class, this::deserializeCalc);
|
69
|
+
addDeserializer(module, CheckBoxFieldValue.class, this::deserializeCheckBox);
|
70
|
+
addDeserializer(module, RadioButtonFieldValue.class, this::deserializeRadioButton);
|
71
|
+
addDeserializer(module, MultiSelectFieldValue.class, this::deserializeMultiSelect);
|
72
|
+
addDeserializer(module, DropDownFieldValue.class, this::deserializeDropDown);
|
73
|
+
addDeserializer(module, UserSelectFieldValue.class, this::deserializeUserSelect);
|
74
|
+
addDeserializer(module, User.class, this::deserializeUser);
|
75
|
+
addDeserializer(module, OrganizationSelectFieldValue.class, this::deserializeOrganizationSelect);
|
76
|
+
addDeserializer(module, Organization.class, this::deserializeOrganization);
|
77
|
+
addDeserializer(module, GroupSelectFieldValue.class, this::deserializeGroupSelect);
|
78
|
+
addDeserializer(module, Group.class, this::deserializeGroup);
|
79
|
+
addDeserializer(module, DateFieldValue.class, this::deserializeDate);
|
80
|
+
addDeserializer(module, TimeFieldValue.class, this::deserializeTime);
|
81
|
+
addDeserializer(module, DateTimeFieldValue.class, this::deserializeDateTime);
|
82
|
+
addDeserializer(module, LinkFieldValue.class, this::deserializeLink);
|
83
|
+
addDeserializer(module, FileFieldValue.class, this::deserializeFile);
|
84
|
+
addDeserializer(module, FileBody.class, this::deserializeFileBody);
|
85
|
+
// spotless:on
|
86
|
+
mapper.registerModule(module);
|
87
|
+
}
|
88
|
+
|
89
|
+
public <T> T deserialize(String content, Class<T> type) {
|
90
|
+
try {
|
91
|
+
return mapper.readValue(content, type);
|
92
|
+
} catch (IOException e) {
|
93
|
+
throw new DeserializeException(e);
|
94
|
+
}
|
95
|
+
}
|
96
|
+
|
97
|
+
private <T> void addDeserializer(
|
98
|
+
SimpleModule module,
|
99
|
+
Class<T> type,
|
100
|
+
BiFunction<JsonParser, DeserializationContext, T> deserializer) {
|
101
|
+
module.addDeserializer(type, new DeserializeApplier<>(deserializer));
|
102
|
+
}
|
103
|
+
|
104
|
+
private SubtableFieldValue deserializeSubtable(
|
105
|
+
JsonParser parser, DeserializationContext context) {
|
106
|
+
return new SubtableFieldValue(readList(parser, TableRow.class));
|
107
|
+
}
|
108
|
+
|
109
|
+
private TableRow deserializeTableRow(JsonParser parser, DeserializationContext context) {
|
110
|
+
ObjectCodec codec = parser.getCodec();
|
111
|
+
JsonNode node = readTree(codec, parser);
|
112
|
+
TableRow row = new TableRow(get(node, "id", JsonNode::asLong));
|
113
|
+
stream(node.get("value").fields())
|
114
|
+
.forEach(entry -> row.putField(entry.getKey(), readValue(entry.getValue(), codec)));
|
115
|
+
return row;
|
116
|
+
}
|
117
|
+
|
118
|
+
private SingleLineTextFieldValue deserializeSingleLineText(
|
119
|
+
JsonParser parser, DeserializationContext context) {
|
120
|
+
return new SingleLineTextFieldValue(readText(parser));
|
121
|
+
}
|
122
|
+
|
123
|
+
private MultiLineTextFieldValue deserializeMultiLineText(
|
124
|
+
JsonParser parser, DeserializationContext context) {
|
125
|
+
return new MultiLineTextFieldValue(readText(parser));
|
126
|
+
}
|
127
|
+
|
128
|
+
private RichTextFieldValue deserializeRichText(
|
129
|
+
JsonParser parser, DeserializationContext context) {
|
130
|
+
return new RichTextFieldValue(readText(parser));
|
131
|
+
}
|
132
|
+
|
133
|
+
private NumberFieldValue deserializeNumber(JsonParser parser, DeserializationContext context) {
|
134
|
+
return new NumberFieldValue(read(parser, BigDecimal::new));
|
135
|
+
}
|
136
|
+
|
137
|
+
private CalcFieldValue deserializeCalc(JsonParser parser, DeserializationContext context) {
|
138
|
+
LOGGER.warn(
|
139
|
+
String.format(
|
140
|
+
"Ignore field: %s", new CalcFieldValue((BigDecimal) read(parser, BigDecimal::new))));
|
141
|
+
return null;
|
142
|
+
}
|
143
|
+
|
144
|
+
private CheckBoxFieldValue deserializeCheckBox(
|
145
|
+
JsonParser parser, DeserializationContext context) {
|
146
|
+
return new CheckBoxFieldValue(readList(parser, String.class));
|
147
|
+
}
|
148
|
+
|
149
|
+
private RadioButtonFieldValue deserializeRadioButton(
|
150
|
+
JsonParser parser, DeserializationContext context) {
|
151
|
+
return new RadioButtonFieldValue(readText(parser));
|
152
|
+
}
|
153
|
+
|
154
|
+
private MultiSelectFieldValue deserializeMultiSelect(
|
155
|
+
JsonParser parser, DeserializationContext context) {
|
156
|
+
return new MultiSelectFieldValue(readList(parser, String.class));
|
157
|
+
}
|
158
|
+
|
159
|
+
private DropDownFieldValue deserializeDropDown(
|
160
|
+
JsonParser parser, DeserializationContext context) {
|
161
|
+
return new DropDownFieldValue(readText(parser));
|
162
|
+
}
|
163
|
+
|
164
|
+
private UserSelectFieldValue deserializeUserSelect(
|
165
|
+
JsonParser parser, DeserializationContext context) {
|
166
|
+
return new UserSelectFieldValue(readList(parser, User.class));
|
167
|
+
}
|
168
|
+
|
169
|
+
private User deserializeUser(JsonParser parser, DeserializationContext context) {
|
170
|
+
JsonNode node = readTree(parser);
|
171
|
+
return new User(get(node, "name", JsonNode::asText), get(node, "code", JsonNode::asText));
|
172
|
+
}
|
173
|
+
|
174
|
+
private OrganizationSelectFieldValue deserializeOrganizationSelect(
|
175
|
+
JsonParser parser, DeserializationContext context) {
|
176
|
+
return new OrganizationSelectFieldValue(readList(parser, Organization.class));
|
177
|
+
}
|
178
|
+
|
179
|
+
private Organization deserializeOrganization(JsonParser parser, DeserializationContext context) {
|
180
|
+
JsonNode node = readTree(parser);
|
181
|
+
return new Organization(
|
182
|
+
get(node, "name", JsonNode::asText), get(node, "code", JsonNode::asText));
|
183
|
+
}
|
184
|
+
|
185
|
+
private GroupSelectFieldValue deserializeGroupSelect(
|
186
|
+
JsonParser parser, DeserializationContext context) {
|
187
|
+
return new GroupSelectFieldValue(readList(parser, Group.class));
|
188
|
+
}
|
189
|
+
|
190
|
+
private Group deserializeGroup(JsonParser parser, DeserializationContext context) {
|
191
|
+
JsonNode node = readTree(parser);
|
192
|
+
return new Group(get(node, "name", JsonNode::asText), get(node, "code", JsonNode::asText));
|
193
|
+
}
|
194
|
+
|
195
|
+
private DateFieldValue deserializeDate(JsonParser parser, DeserializationContext context) {
|
196
|
+
return new DateFieldValue(read(parser, LocalDate::parse));
|
197
|
+
}
|
198
|
+
|
199
|
+
private TimeFieldValue deserializeTime(JsonParser parser, DeserializationContext context) {
|
200
|
+
return new TimeFieldValue(read(parser, LocalTime::parse));
|
201
|
+
}
|
202
|
+
|
203
|
+
private DateTimeFieldValue deserializeDateTime(
|
204
|
+
JsonParser parser, DeserializationContext context) {
|
205
|
+
return new DateTimeFieldValue(read(parser, ZonedDateTime::parse));
|
206
|
+
}
|
207
|
+
|
208
|
+
private LinkFieldValue deserializeLink(JsonParser parser, DeserializationContext context) {
|
209
|
+
return new LinkFieldValue(readText(parser));
|
210
|
+
}
|
211
|
+
|
212
|
+
private FileFieldValue deserializeFile(JsonParser parser, DeserializationContext context) {
|
213
|
+
return new FileFieldValue(readList(parser, FileBody.class));
|
214
|
+
}
|
215
|
+
|
216
|
+
private FileBody deserializeFileBody(JsonParser parser, DeserializationContext context) {
|
217
|
+
JsonNode node = readTree(parser);
|
218
|
+
return new FileBody()
|
219
|
+
.setContentType(get(node, "contentType", JsonNode::asText))
|
220
|
+
.setFileKey(get(node, "fileKey", JsonNode::asText))
|
221
|
+
.setName(get(node, "name", JsonNode::asText))
|
222
|
+
.setSize(get(node, "size", JsonNode::asInt));
|
223
|
+
}
|
224
|
+
|
225
|
+
private static <T> T get(JsonNode node, String name, Function<JsonNode, T> as) {
|
226
|
+
return node.has(name) ? as.apply(node.get(name)) : null;
|
227
|
+
}
|
228
|
+
|
229
|
+
private static FieldValue readValue(JsonNode node, ObjectCodec codec) {
|
230
|
+
return node == null
|
231
|
+
? null
|
232
|
+
: readValueAs(
|
233
|
+
node.has("value") ? node.get("value") : NULL,
|
234
|
+
codec,
|
235
|
+
FieldType.valueOf(node.get("type").asText()).getFieldValueClass());
|
236
|
+
}
|
237
|
+
|
238
|
+
private static <T> List<T> readList(JsonParser parser, Class<T> type) {
|
239
|
+
ObjectCodec codec = parser.getCodec();
|
240
|
+
return stream(readTree(codec, parser).elements())
|
241
|
+
.map(node -> readValueAs(node, codec, type))
|
242
|
+
.collect(Collectors.toList());
|
243
|
+
}
|
244
|
+
|
245
|
+
private static <T> Stream<T> stream(Iterator<T> iterator) {
|
246
|
+
return StreamSupport.stream(
|
247
|
+
Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false);
|
248
|
+
}
|
249
|
+
|
250
|
+
private static <T> T read(JsonParser parser, Function<String, T> as) {
|
251
|
+
String text = readText(parser);
|
252
|
+
return text == null || text.isEmpty() ? null : as.apply(text);
|
253
|
+
}
|
254
|
+
|
255
|
+
private static String readText(JsonParser parser) {
|
256
|
+
JsonNode node = readTree(parser);
|
257
|
+
return node == null || node.isNull() ? null : node.asText();
|
258
|
+
}
|
259
|
+
|
260
|
+
private static JsonNode readTree(JsonParser parser) {
|
261
|
+
return readTree(parser.getCodec(), parser);
|
262
|
+
}
|
263
|
+
|
264
|
+
private static JsonNode readTree(ObjectCodec codec, JsonParser parser) {
|
265
|
+
try {
|
266
|
+
return codec.readTree(parser);
|
267
|
+
} catch (IOException e) {
|
268
|
+
throw new DeserializeException(e);
|
269
|
+
}
|
270
|
+
}
|
271
|
+
|
272
|
+
private static <T> T readValueAs(JsonNode node, ObjectCodec codec, Class<T> type) {
|
273
|
+
try (JsonParser parser = node.traverse(codec)) {
|
274
|
+
return parser.readValueAs(type);
|
275
|
+
} catch (IOException e) {
|
276
|
+
throw new DeserializeException(e);
|
277
|
+
}
|
278
|
+
}
|
279
|
+
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
package org.embulk.output.kintone.record;
|
2
|
+
|
3
|
+
public class Id {
|
4
|
+
public static final String FIELD = "$id";
|
5
|
+
private Long value;
|
6
|
+
|
7
|
+
public void setValue(Long value) {
|
8
|
+
this.value = value;
|
9
|
+
}
|
10
|
+
|
11
|
+
public Long getValue() {
|
12
|
+
return value;
|
13
|
+
}
|
14
|
+
|
15
|
+
public boolean isPresent() {
|
16
|
+
return value != null;
|
17
|
+
}
|
18
|
+
}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
package org.embulk.output.kintone.record;
|
2
|
+
|
3
|
+
import com.kintone.client.model.record.Record;
|
4
|
+
import com.kintone.client.model.record.RecordForUpdate;
|
5
|
+
import com.kintone.client.model.record.UpdateKey;
|
6
|
+
|
7
|
+
public class IdOrUpdateKey {
|
8
|
+
private final Id id = new Id();
|
9
|
+
private final UpdateKey updateKey = new UpdateKey();
|
10
|
+
|
11
|
+
public Id getId() {
|
12
|
+
return id;
|
13
|
+
}
|
14
|
+
|
15
|
+
public UpdateKey getUpdateKey() {
|
16
|
+
return updateKey;
|
17
|
+
}
|
18
|
+
|
19
|
+
public String getField() {
|
20
|
+
return isIdPresent() ? Id.FIELD : updateKey.getField();
|
21
|
+
}
|
22
|
+
|
23
|
+
public Object getValue() {
|
24
|
+
return isIdPresent() ? id.getValue() : updateKey.getValue();
|
25
|
+
}
|
26
|
+
|
27
|
+
public RecordForUpdate forUpdate(Record record) {
|
28
|
+
return isIdPresent()
|
29
|
+
? new RecordForUpdate(id.getValue(), record)
|
30
|
+
: new RecordForUpdate(updateKey, record.removeField(updateKey.getField()));
|
31
|
+
}
|
32
|
+
|
33
|
+
public boolean isPresent() {
|
34
|
+
return isIdPresent() || isUpdateKeyPresent();
|
35
|
+
}
|
36
|
+
|
37
|
+
public boolean isIdPresent() {
|
38
|
+
return id.isPresent();
|
39
|
+
}
|
40
|
+
|
41
|
+
public boolean isUpdateKeyPresent() {
|
42
|
+
Object value = updateKey.getValue();
|
43
|
+
return value != null && !value.toString().isEmpty();
|
44
|
+
}
|
45
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
package org.embulk.output.kintone.record;
|
2
|
+
|
3
|
+
import com.fasterxml.jackson.annotation.JsonCreator;
|
4
|
+
|
5
|
+
public enum Skip {
|
6
|
+
AUTO,
|
7
|
+
NEVER,
|
8
|
+
ALWAYS;
|
9
|
+
|
10
|
+
@JsonCreator
|
11
|
+
public static Skip of(String name) {
|
12
|
+
return valueOf(name.toUpperCase());
|
13
|
+
}
|
14
|
+
}
|
@@ -0,0 +1,78 @@
|
|
1
|
+
package org.embulk.output.kintone.reducer;
|
2
|
+
|
3
|
+
import java.time.Instant;
|
4
|
+
import java.util.List;
|
5
|
+
import org.embulk.spi.Column;
|
6
|
+
import org.embulk.spi.ColumnVisitor;
|
7
|
+
import org.embulk.spi.PageBuilder;
|
8
|
+
import org.embulk.spi.time.Timestamp;
|
9
|
+
|
10
|
+
public class CSVInputColumnVisitor implements ColumnVisitor {
|
11
|
+
private final PageBuilder builder;
|
12
|
+
private final List<String> values;
|
13
|
+
|
14
|
+
public CSVInputColumnVisitor(PageBuilder builder, List<String> values) {
|
15
|
+
this.builder = builder;
|
16
|
+
this.values = values;
|
17
|
+
}
|
18
|
+
|
19
|
+
@Override
|
20
|
+
public void booleanColumn(Column column) {
|
21
|
+
String value = values.get(column.getIndex());
|
22
|
+
if (value == null) {
|
23
|
+
builder.setNull(column);
|
24
|
+
} else {
|
25
|
+
builder.setBoolean(column, Boolean.parseBoolean(value));
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
@Override
|
30
|
+
public void longColumn(Column column) {
|
31
|
+
String value = values.get(column.getIndex());
|
32
|
+
if (value == null) {
|
33
|
+
builder.setNull(column);
|
34
|
+
} else {
|
35
|
+
builder.setLong(column, Long.parseLong(value));
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
@Override
|
40
|
+
public void doubleColumn(Column column) {
|
41
|
+
String value = values.get(column.getIndex());
|
42
|
+
if (value == null) {
|
43
|
+
builder.setNull(column);
|
44
|
+
} else {
|
45
|
+
builder.setDouble(column, Double.parseDouble(value));
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
@Override
|
50
|
+
public void stringColumn(Column column) {
|
51
|
+
String value = values.get(column.getIndex());
|
52
|
+
if (value == null) {
|
53
|
+
builder.setNull(column);
|
54
|
+
} else {
|
55
|
+
builder.setString(column, value);
|
56
|
+
}
|
57
|
+
}
|
58
|
+
|
59
|
+
@Override
|
60
|
+
public void timestampColumn(Column column) {
|
61
|
+
String value = values.get(column.getIndex());
|
62
|
+
if (value == null) {
|
63
|
+
builder.setNull(column);
|
64
|
+
} else {
|
65
|
+
builder.setTimestamp(column, Timestamp.ofInstant(Instant.parse(value)));
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
@Override
|
70
|
+
public void jsonColumn(Column column) {
|
71
|
+
String value = values.get(column.getIndex());
|
72
|
+
if (value == null) {
|
73
|
+
builder.setNull(column);
|
74
|
+
} else {
|
75
|
+
builder.setJson(column, Reducer.PARSER.parse(value));
|
76
|
+
}
|
77
|
+
}
|
78
|
+
}
|
@@ -0,0 +1,79 @@
|
|
1
|
+
package org.embulk.output.kintone.reducer;
|
2
|
+
|
3
|
+
import java.io.IOException;
|
4
|
+
import org.apache.commons.csv.CSVPrinter;
|
5
|
+
import org.embulk.spi.Column;
|
6
|
+
import org.embulk.spi.ColumnVisitor;
|
7
|
+
import org.embulk.spi.PageReader;
|
8
|
+
|
9
|
+
public class CSVOutputColumnVisitor implements ColumnVisitor {
|
10
|
+
private final PageReader reader;
|
11
|
+
private final CSVPrinter printer;
|
12
|
+
|
13
|
+
public CSVOutputColumnVisitor(PageReader reader, CSVPrinter printer) {
|
14
|
+
this.reader = reader;
|
15
|
+
this.printer = printer;
|
16
|
+
}
|
17
|
+
|
18
|
+
@Override
|
19
|
+
public void booleanColumn(Column column) {
|
20
|
+
if (reader.isNull(column)) {
|
21
|
+
print(null);
|
22
|
+
} else {
|
23
|
+
print(reader.getBoolean(column));
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
@Override
|
28
|
+
public void longColumn(Column column) {
|
29
|
+
if (reader.isNull(column)) {
|
30
|
+
print(null);
|
31
|
+
} else {
|
32
|
+
print(reader.getLong(column));
|
33
|
+
}
|
34
|
+
}
|
35
|
+
|
36
|
+
@Override
|
37
|
+
public void doubleColumn(Column column) {
|
38
|
+
if (reader.isNull(column)) {
|
39
|
+
print(null);
|
40
|
+
} else {
|
41
|
+
print(reader.getDouble(column));
|
42
|
+
}
|
43
|
+
}
|
44
|
+
|
45
|
+
@Override
|
46
|
+
public void stringColumn(Column column) {
|
47
|
+
if (reader.isNull(column)) {
|
48
|
+
print(null);
|
49
|
+
} else {
|
50
|
+
print(reader.getString(column));
|
51
|
+
}
|
52
|
+
}
|
53
|
+
|
54
|
+
@Override
|
55
|
+
public void timestampColumn(Column column) {
|
56
|
+
if (reader.isNull(column)) {
|
57
|
+
print(null);
|
58
|
+
} else {
|
59
|
+
print(reader.getTimestamp(column).getInstant());
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
63
|
+
@Override
|
64
|
+
public void jsonColumn(Column column) {
|
65
|
+
if (reader.isNull(column)) {
|
66
|
+
print(null);
|
67
|
+
} else {
|
68
|
+
print(reader.getJson(column).toJson());
|
69
|
+
}
|
70
|
+
}
|
71
|
+
|
72
|
+
private void print(Object value) {
|
73
|
+
try {
|
74
|
+
printer.print(value);
|
75
|
+
} catch (IOException e) {
|
76
|
+
throw new ReduceException(e);
|
77
|
+
}
|
78
|
+
}
|
79
|
+
}
|