embulk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +13 -0
  3. data/Gemfile +3 -0
  4. data/Gemfile.lock +33 -0
  5. data/README.md +117 -0
  6. data/Rakefile +58 -0
  7. data/bin/embulk +63 -0
  8. data/build.gradle +149 -0
  9. data/embulk-cli/build.gradle +6 -0
  10. data/embulk-cli/pom.xml +94 -0
  11. data/embulk-cli/src/main/java/org/embulk/cli/Main.java +15 -0
  12. data/embulk-core/build.gradle +6 -0
  13. data/embulk-core/pom.xml +143 -0
  14. data/embulk-core/src/main/java/org/embulk/EmbulkService.java +39 -0
  15. data/embulk-core/src/main/java/org/embulk/command/Runner.java +199 -0
  16. data/embulk-core/src/main/java/org/embulk/command/TablePrinter.java +119 -0
  17. data/embulk-core/src/main/java/org/embulk/config/CommitReport.java +26 -0
  18. data/embulk-core/src/main/java/org/embulk/config/Config.java +15 -0
  19. data/embulk-core/src/main/java/org/embulk/config/ConfigDefault.java +15 -0
  20. data/embulk-core/src/main/java/org/embulk/config/ConfigException.java +20 -0
  21. data/embulk-core/src/main/java/org/embulk/config/ConfigLoader.java +83 -0
  22. data/embulk-core/src/main/java/org/embulk/config/ConfigSource.java +28 -0
  23. data/embulk-core/src/main/java/org/embulk/config/DataSource.java +35 -0
  24. data/embulk-core/src/main/java/org/embulk/config/DataSourceImpl.java +208 -0
  25. data/embulk-core/src/main/java/org/embulk/config/DataSourceSerDe.java +80 -0
  26. data/embulk-core/src/main/java/org/embulk/config/GenericTypeReference.java +20 -0
  27. data/embulk-core/src/main/java/org/embulk/config/ModelManager.java +125 -0
  28. data/embulk-core/src/main/java/org/embulk/config/NextConfig.java +26 -0
  29. data/embulk-core/src/main/java/org/embulk/config/Task.java +10 -0
  30. data/embulk-core/src/main/java/org/embulk/config/TaskInvocationHandler.java +180 -0
  31. data/embulk-core/src/main/java/org/embulk/config/TaskSerDe.java +343 -0
  32. data/embulk-core/src/main/java/org/embulk/config/TaskSource.java +28 -0
  33. data/embulk-core/src/main/java/org/embulk/config/TaskValidationException.java +37 -0
  34. data/embulk-core/src/main/java/org/embulk/config/TaskValidator.java +24 -0
  35. data/embulk-core/src/main/java/org/embulk/exec/ExecModule.java +45 -0
  36. data/embulk-core/src/main/java/org/embulk/exec/ExecuteInterruptedException.java +10 -0
  37. data/embulk-core/src/main/java/org/embulk/exec/ExecuteResult.java +19 -0
  38. data/embulk-core/src/main/java/org/embulk/exec/ExtensionServiceLoaderModule.java +43 -0
  39. data/embulk-core/src/main/java/org/embulk/exec/ForSystemConfig.java +16 -0
  40. data/embulk-core/src/main/java/org/embulk/exec/GuessExecutor.java +307 -0
  41. data/embulk-core/src/main/java/org/embulk/exec/LocalExecutor.java +274 -0
  42. data/embulk-core/src/main/java/org/embulk/exec/LoggerProvider.java +30 -0
  43. data/embulk-core/src/main/java/org/embulk/exec/NoSampleException.java +10 -0
  44. data/embulk-core/src/main/java/org/embulk/exec/PooledBufferAllocator.java +58 -0
  45. data/embulk-core/src/main/java/org/embulk/exec/PreviewExecutor.java +138 -0
  46. data/embulk-core/src/main/java/org/embulk/exec/PreviewResult.java +27 -0
  47. data/embulk-core/src/main/java/org/embulk/exec/PreviewedNoticeError.java +17 -0
  48. data/embulk-core/src/main/java/org/embulk/exec/SamplingParserPlugin.java +116 -0
  49. data/embulk-core/src/main/java/org/embulk/exec/SystemConfigModule.java +24 -0
  50. data/embulk-core/src/main/java/org/embulk/jruby/JRubyPluginSource.java +69 -0
  51. data/embulk-core/src/main/java/org/embulk/jruby/JRubyScriptingModule.java +100 -0
  52. data/embulk-core/src/main/java/org/embulk/plugin/BuiltinPluginSourceModule.java +17 -0
  53. data/embulk-core/src/main/java/org/embulk/plugin/InjectedPluginSource.java +92 -0
  54. data/embulk-core/src/main/java/org/embulk/plugin/PluginManager.java +34 -0
  55. data/embulk-core/src/main/java/org/embulk/plugin/PluginSource.java +6 -0
  56. data/embulk-core/src/main/java/org/embulk/plugin/PluginSourceNotMatchException.java +19 -0
  57. data/embulk-core/src/main/java/org/embulk/plugin/PluginType.java +47 -0
  58. data/embulk-core/src/main/java/org/embulk/plugin/SetThreadContextClassLoader.java +19 -0
  59. data/embulk-core/src/main/java/org/embulk/spi/Buffer.java +113 -0
  60. data/embulk-core/src/main/java/org/embulk/spi/BufferAllocator.java +8 -0
  61. data/embulk-core/src/main/java/org/embulk/spi/Column.java +92 -0
  62. data/embulk-core/src/main/java/org/embulk/spi/ColumnConfig.java +79 -0
  63. data/embulk-core/src/main/java/org/embulk/spi/DecoderPlugin.java +16 -0
  64. data/embulk-core/src/main/java/org/embulk/spi/EncoderPlugin.java +16 -0
  65. data/embulk-core/src/main/java/org/embulk/spi/Exec.java +76 -0
  66. data/embulk-core/src/main/java/org/embulk/spi/ExecAction.java +6 -0
  67. data/embulk-core/src/main/java/org/embulk/spi/ExecSession.java +105 -0
  68. data/embulk-core/src/main/java/org/embulk/spi/Extension.java +42 -0
  69. data/embulk-core/src/main/java/org/embulk/spi/FileInput.java +11 -0
  70. data/embulk-core/src/main/java/org/embulk/spi/FileInputPlugin.java +19 -0
  71. data/embulk-core/src/main/java/org/embulk/spi/FileInputRunner.java +113 -0
  72. data/embulk-core/src/main/java/org/embulk/spi/FileOutput.java +13 -0
  73. data/embulk-core/src/main/java/org/embulk/spi/FileOutputPlugin.java +20 -0
  74. data/embulk-core/src/main/java/org/embulk/spi/FileOutputRunner.java +167 -0
  75. data/embulk-core/src/main/java/org/embulk/spi/FormatterPlugin.java +18 -0
  76. data/embulk-core/src/main/java/org/embulk/spi/GuessPlugin.java +9 -0
  77. data/embulk-core/src/main/java/org/embulk/spi/InputPlugin.java +20 -0
  78. data/embulk-core/src/main/java/org/embulk/spi/OutputPlugin.java +21 -0
  79. data/embulk-core/src/main/java/org/embulk/spi/Page.java +45 -0
  80. data/embulk-core/src/main/java/org/embulk/spi/PageBuilder.java +327 -0
  81. data/embulk-core/src/main/java/org/embulk/spi/PageFormat.java +47 -0
  82. data/embulk-core/src/main/java/org/embulk/spi/PageOutput.java +11 -0
  83. data/embulk-core/src/main/java/org/embulk/spi/PageReader.java +227 -0
  84. data/embulk-core/src/main/java/org/embulk/spi/ParserPlugin.java +17 -0
  85. data/embulk-core/src/main/java/org/embulk/spi/Schema.java +101 -0
  86. data/embulk-core/src/main/java/org/embulk/spi/SchemaConfig.java +52 -0
  87. data/embulk-core/src/main/java/org/embulk/spi/SchemaVisitor.java +14 -0
  88. data/embulk-core/src/main/java/org/embulk/spi/Transactional.java +10 -0
  89. data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileInput.java +17 -0
  90. data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileOutput.java +19 -0
  91. data/embulk-core/src/main/java/org/embulk/spi/TransactionalPageOutput.java +17 -0
  92. data/embulk-core/src/main/java/org/embulk/spi/time/DateTimeZoneSerDe.java +57 -0
  93. data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelper.java +8 -0
  94. data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelperFactory.java +6 -0
  95. data/embulk-core/src/main/java/org/embulk/spi/time/Timestamp.java +159 -0
  96. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormat.java +98 -0
  97. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormatter.java +55 -0
  98. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParseException.java +6 -0
  99. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParser.java +60 -0
  100. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampSerDe.java +50 -0
  101. data/embulk-core/src/main/java/org/embulk/spi/type/AbstractType.java +55 -0
  102. data/embulk-core/src/main/java/org/embulk/spi/type/BooleanType.java +12 -0
  103. data/embulk-core/src/main/java/org/embulk/spi/type/DoubleType.java +12 -0
  104. data/embulk-core/src/main/java/org/embulk/spi/type/LongType.java +12 -0
  105. data/embulk-core/src/main/java/org/embulk/spi/type/StringType.java +12 -0
  106. data/embulk-core/src/main/java/org/embulk/spi/type/TimestampType.java +39 -0
  107. data/embulk-core/src/main/java/org/embulk/spi/type/Type.java +15 -0
  108. data/embulk-core/src/main/java/org/embulk/spi/type/TypeDeserializer.java +47 -0
  109. data/embulk-core/src/main/java/org/embulk/spi/type/Types.java +14 -0
  110. data/embulk-core/src/main/java/org/embulk/spi/util/CharsetSerDe.java +55 -0
  111. data/embulk-core/src/main/java/org/embulk/spi/util/Decoders.java +81 -0
  112. data/embulk-core/src/main/java/org/embulk/spi/util/Encoders.java +81 -0
  113. data/embulk-core/src/main/java/org/embulk/spi/util/FileInputInputStream.java +110 -0
  114. data/embulk-core/src/main/java/org/embulk/spi/util/FileOutputOutputStream.java +94 -0
  115. data/embulk-core/src/main/java/org/embulk/spi/util/InputStreamFileInput.java +111 -0
  116. data/embulk-core/src/main/java/org/embulk/spi/util/Inputs.java +74 -0
  117. data/embulk-core/src/main/java/org/embulk/spi/util/LineDecoder.java +118 -0
  118. data/embulk-core/src/main/java/org/embulk/spi/util/LineEncoder.java +109 -0
  119. data/embulk-core/src/main/java/org/embulk/spi/util/ListFileInput.java +52 -0
  120. data/embulk-core/src/main/java/org/embulk/spi/util/Newline.java +38 -0
  121. data/embulk-core/src/main/java/org/embulk/spi/util/PagePrinter.java +102 -0
  122. data/embulk-core/src/main/java/org/embulk/spi/util/Pages.java +139 -0
  123. data/embulk-core/src/test/java/org/embulk/EmbulkTestRuntime.java +110 -0
  124. data/embulk-core/src/test/java/org/embulk/GuiceBinder.java +72 -0
  125. data/embulk-core/src/test/java/org/embulk/RandomManager.java +53 -0
  126. data/embulk-core/src/test/java/org/embulk/TestPluginSourceModule.java +23 -0
  127. data/embulk-core/src/test/java/org/embulk/TestUtilityModule.java +17 -0
  128. data/embulk-core/src/test/java/org/embulk/config/TestConfigSource.java +114 -0
  129. data/embulk-core/src/test/java/org/embulk/config/TestTaskSource.java +70 -0
  130. data/embulk-core/src/test/java/org/embulk/plugin/MockPluginSource.java +57 -0
  131. data/embulk-core/src/test/java/org/embulk/plugin/TestPluginType.java +18 -0
  132. data/embulk-core/src/test/java/org/embulk/spi/MockFileOutput.java +63 -0
  133. data/embulk-core/src/test/java/org/embulk/spi/MockFormatterPlugin.java +101 -0
  134. data/embulk-core/src/test/java/org/embulk/spi/MockParserPlugin.java +73 -0
  135. data/embulk-core/src/test/java/org/embulk/spi/PageTestUtils.java +78 -0
  136. data/embulk-core/src/test/java/org/embulk/spi/TestFileInputInputStream.java +67 -0
  137. data/embulk-core/src/test/java/org/embulk/spi/TestFileInputRunner.java +180 -0
  138. data/embulk-core/src/test/java/org/embulk/spi/TestFileOutputRunner.java +192 -0
  139. data/embulk-core/src/test/java/org/embulk/spi/TestInputStreamFileInput.java +188 -0
  140. data/embulk-core/src/test/java/org/embulk/spi/TestPageBuilderReader.java +301 -0
  141. data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestamp.java +116 -0
  142. data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestampFormatterParser.java +52 -0
  143. data/embulk-core/src/test/java/org/embulk/spi/type/TestTypeSerDe.java +45 -0
  144. data/embulk-core/src/test/java/org/embulk/spi/util/TestLineDecoder.java +132 -0
  145. data/embulk-core/src/test/java/org/embulk/spi/util/TestLineEncoder.java +123 -0
  146. data/embulk-standards/build.gradle +6 -0
  147. data/embulk-standards/pom.xml +68 -0
  148. data/embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java +158 -0
  149. data/embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java +233 -0
  150. data/embulk-standards/src/main/java/org/embulk/standards/CsvTokenizer.java +355 -0
  151. data/embulk-standards/src/main/java/org/embulk/standards/GzipFileDecoderPlugin.java +55 -0
  152. data/embulk-standards/src/main/java/org/embulk/standards/GzipFileEncoderPlugin.java +39 -0
  153. data/embulk-standards/src/main/java/org/embulk/standards/LocalFileInputPlugin.java +138 -0
  154. data/embulk-standards/src/main/java/org/embulk/standards/LocalFileOutputPlugin.java +128 -0
  155. data/embulk-standards/src/main/java/org/embulk/standards/NullOutputPlugin.java +46 -0
  156. data/embulk-standards/src/main/java/org/embulk/standards/S3FileInputPlugin.java +238 -0
  157. data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginExtension.java +16 -0
  158. data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginModule.java +44 -0
  159. data/embulk-standards/src/main/java/org/embulk/standards/StdoutOutputPlugin.java +71 -0
  160. data/embulk-standards/src/main/resources/META-INF/services/org.embulk.spi.Extension +1 -0
  161. data/embulk-standards/src/test/java/org/embulk/standards/TestCsvParserPlugin.java +69 -0
  162. data/embulk-standards/src/test/java/org/embulk/standards/TestCsvTokenizer.java +291 -0
  163. data/embulk-standards/src/test/java/org/embulk/standards/TestS3FileInputPlugin.java +43 -0
  164. data/embulk.gemspec +27 -0
  165. data/examples/config.yml +34 -0
  166. data/examples/csv/sample.csv.gz +0 -0
  167. data/gradle/wrapper/gradle-wrapper.jar +0 -0
  168. data/gradle/wrapper/gradle-wrapper.properties +6 -0
  169. data/gradlew +164 -0
  170. data/gradlew.bat +90 -0
  171. data/lib/embulk.rb +16 -0
  172. data/lib/embulk/buffer.rb +17 -0
  173. data/lib/embulk/column.rb +47 -0
  174. data/lib/embulk/command/embulk.rb +39 -0
  175. data/lib/embulk/command/embulk_example.rb +32 -0
  176. data/lib/embulk/command/embulk_generate_bin.rb +62 -0
  177. data/lib/embulk/command/embulk_run.rb +243 -0
  178. data/lib/embulk/data/bundle/.bundle/config +3 -0
  179. data/lib/embulk/data/bundle/Gemfile +31 -0
  180. data/lib/embulk/data/bundle/Gemfile.lock +8 -0
  181. data/lib/embulk/data/bundle/embulk/input_example.rb +40 -0
  182. data/lib/embulk/data/bundle/embulk/output_example.rb +51 -0
  183. data/lib/embulk/data_source.rb +66 -0
  184. data/lib/embulk/error.rb +5 -0
  185. data/lib/embulk/guess_charset.rb +26 -0
  186. data/lib/embulk/guess_csv.rb +195 -0
  187. data/lib/embulk/guess_gzip.rb +18 -0
  188. data/lib/embulk/guess_newline.rb +20 -0
  189. data/lib/embulk/guess_plugin.rb +113 -0
  190. data/lib/embulk/input_plugin.rb +53 -0
  191. data/lib/embulk/java/bootstrap.rb +12 -0
  192. data/lib/embulk/java/imports.rb +26 -0
  193. data/lib/embulk/java/time_helper.rb +77 -0
  194. data/lib/embulk/output_plugin.rb +104 -0
  195. data/lib/embulk/page.rb +28 -0
  196. data/lib/embulk/page_builder.rb +22 -0
  197. data/lib/embulk/plugin.rb +152 -0
  198. data/lib/embulk/plugin_registry.rb +70 -0
  199. data/lib/embulk/schema.rb +85 -0
  200. data/lib/embulk/time_format_guess.rb +331 -0
  201. data/lib/embulk/version.rb +3 -0
  202. data/pom.xml +533 -0
  203. data/settings.gradle +5 -0
  204. metadata +370 -0
@@ -0,0 +1,80 @@
1
+ package org.embulk.config;
2
+
3
+ import java.io.IOException;
4
+ import com.google.inject.Inject;
5
+ import com.fasterxml.jackson.core.JsonGenerator;
6
+ import com.fasterxml.jackson.core.JsonParser;
7
+ import com.fasterxml.jackson.databind.module.SimpleModule;
8
+ import com.fasterxml.jackson.databind.ObjectMapper;
9
+ import com.fasterxml.jackson.databind.JsonSerializer;
10
+ import com.fasterxml.jackson.databind.JsonDeserializer;
11
+ import com.fasterxml.jackson.databind.SerializerProvider;
12
+ import com.fasterxml.jackson.databind.DeserializationContext;
13
+ import com.fasterxml.jackson.databind.JsonNode;
14
+ import com.fasterxml.jackson.databind.JsonMappingException;
15
+ import com.fasterxml.jackson.databind.node.ObjectNode;
16
+ import com.fasterxml.jackson.module.guice.ObjectMapperModule;
17
+
18
+ public class DataSourceSerDe
19
+ {
20
+ public static class SerDeModule
21
+ extends SimpleModule
22
+ {
23
+ public SerDeModule(final ModelManager model)
24
+ {
25
+ // DataSourceImpl
26
+ addSerializer(DataSourceImpl.class, new DataSourceSerializer<DataSourceImpl>());
27
+ addDeserializer(DataSourceImpl.class, new DataSourceDeserializer<DataSourceImpl>(model));
28
+
29
+ // ConfigSource
30
+ addSerializer(ConfigSource.class, new DataSourceSerializer<ConfigSource>());
31
+ addDeserializer(ConfigSource.class, new DataSourceDeserializer<ConfigSource>(model));
32
+
33
+ // TaskSource
34
+ addSerializer(TaskSource.class, new DataSourceSerializer<TaskSource>());
35
+ addDeserializer(TaskSource.class, new DataSourceDeserializer<TaskSource>(model));
36
+
37
+ // CommitReport
38
+ addSerializer(CommitReport.class, new DataSourceSerializer<CommitReport>());
39
+ addDeserializer(CommitReport.class, new DataSourceDeserializer<CommitReport>(model));
40
+
41
+ // NextConfig
42
+ addSerializer(NextConfig.class, new DataSourceSerializer<NextConfig>());
43
+ addDeserializer(NextConfig.class, new DataSourceDeserializer<NextConfig>(model));
44
+ }
45
+ }
46
+
47
+ private static class DataSourceDeserializer <T extends DataSource> // TODO T extends DataSource super DataSourceImpl
48
+ extends JsonDeserializer<T>
49
+ {
50
+ private final ModelManager model;
51
+ private final ObjectMapper treeObjectMapper;
52
+
53
+ DataSourceDeserializer(ModelManager model)
54
+ {
55
+ this.model = model;
56
+ this.treeObjectMapper = new ObjectMapper();
57
+ }
58
+
59
+ @Override
60
+ public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException
61
+ {
62
+ JsonNode json = treeObjectMapper.readTree(jp);
63
+ if (!json.isObject()) {
64
+ throw new JsonMappingException("Expected object to deserialize DataSource", jp.getCurrentLocation());
65
+ }
66
+ return (T) new DataSourceImpl(model, (ObjectNode) json);
67
+ }
68
+ }
69
+
70
+ private static class DataSourceSerializer <T extends DataSource>
71
+ extends JsonSerializer<T>
72
+ {
73
+ @Override
74
+ public void serialize(T value, JsonGenerator jgen, SerializerProvider provider)
75
+ throws IOException
76
+ {
77
+ value.getObjectNode().serialize(jgen, provider);
78
+ }
79
+ }
80
+ }
@@ -0,0 +1,20 @@
1
+ package org.embulk.config;
2
+
3
+ import java.lang.reflect.Type;
4
+ import com.fasterxml.jackson.core.type.TypeReference;
5
+
6
+ class GenericTypeReference
7
+ extends TypeReference<Object>
8
+ {
9
+ private final Type type;
10
+
11
+ public GenericTypeReference(Type type)
12
+ {
13
+ this.type = type;
14
+ }
15
+
16
+ public Type getType()
17
+ {
18
+ return type;
19
+ }
20
+ }
@@ -0,0 +1,125 @@
1
+ package org.embulk.config;
2
+
3
+ import javax.validation.Validation;
4
+ import org.apache.bval.jsr303.ApacheValidationProvider;
5
+ import com.google.inject.Inject;
6
+ import com.google.inject.Injector;
7
+ import com.google.common.base.Throwables;
8
+ import com.fasterxml.jackson.core.JsonParser;
9
+ import com.fasterxml.jackson.databind.Module;
10
+ import com.fasterxml.jackson.databind.ObjectMapper;
11
+ import com.fasterxml.jackson.databind.JsonNode;
12
+ import com.fasterxml.jackson.databind.node.ObjectNode;
13
+ import com.fasterxml.jackson.databind.JsonMappingException;
14
+
15
+ public class ModelManager
16
+ {
17
+ private final Injector injector;
18
+ private final ObjectMapper objectMapper;
19
+ private final ObjectMapper configObjectMapper; // configObjectMapper uses different TaskDeserializer
20
+ private final TaskValidator taskValidator;
21
+
22
+ @Inject
23
+ public ModelManager(Injector injector, ObjectMapper objectMapper)
24
+ {
25
+ this.injector = injector;
26
+ this.objectMapper = objectMapper;
27
+ this.configObjectMapper = objectMapper.copy();
28
+ this.taskValidator = new TaskValidator(
29
+ Validation.byProvider(ApacheValidationProvider.class).configure().buildValidatorFactory().getValidator());
30
+
31
+ objectMapper.registerModule(new TaskSerDe.TaskSerializerModule(objectMapper));
32
+ objectMapper.registerModule(new TaskSerDe.TaskDeserializerModule(objectMapper, this));
33
+ objectMapper.registerModule(new DataSourceSerDe.SerDeModule(this));
34
+ configObjectMapper.registerModule(new TaskSerDe.TaskSerializerModule(configObjectMapper));
35
+ configObjectMapper.registerModule(new TaskSerDe.ConfigTaskDeserializerModule(configObjectMapper, this));
36
+ configObjectMapper.registerModule(new DataSourceSerDe.SerDeModule(this));
37
+ }
38
+
39
+ public <T> T readObject(Class<T> valueType, String json)
40
+ {
41
+ try {
42
+ return objectMapper.readValue(json, valueType);
43
+ } catch (Exception ex) {
44
+ throw Throwables.propagate(ex);
45
+ }
46
+ }
47
+
48
+ public <T> T readObject(Class<T> valueType, JsonParser parser)
49
+ {
50
+ try {
51
+ return objectMapper.readValue(parser, valueType);
52
+ } catch (Exception ex) {
53
+ throw Throwables.propagate(ex);
54
+ }
55
+ }
56
+
57
+ public <T> T readObjectWithConfigSerDe(Class<T> valueType, String json)
58
+ {
59
+ T t;
60
+ try {
61
+ t = configObjectMapper.readValue(json, valueType);
62
+ } catch (Exception ex) {
63
+ Throwables.propagateIfInstanceOf(ex, ConfigException.class);
64
+ throw new ConfigException(ex);
65
+ }
66
+ validate(t);
67
+ return t;
68
+ }
69
+
70
+ public <T> T readObjectWithConfigSerDe(Class<T> valueType, JsonParser parser)
71
+ {
72
+ T t;
73
+ try {
74
+ t = configObjectMapper.readValue(parser, valueType);
75
+ } catch (Exception ex) {
76
+ Throwables.propagateIfInstanceOf(ex, ConfigException.class);
77
+ throw new ConfigException(ex);
78
+ }
79
+ validate(t);
80
+ return t;
81
+ }
82
+
83
+ public String writeObject(Object object)
84
+ {
85
+ try {
86
+ return objectMapper.writeValueAsString(object);
87
+ } catch (Exception ex) {
88
+ throw Throwables.propagate(ex);
89
+ }
90
+ }
91
+
92
+ public void validate(Object object)
93
+ {
94
+ taskValidator.validateModel(object);
95
+ }
96
+
97
+ // visible for DataSource.set
98
+ JsonNode writeObjectAsJsonNode(Object v)
99
+ {
100
+ String json = writeObject(v);
101
+ try {
102
+ return objectMapper.readValue(json, JsonNode.class);
103
+ } catch (Exception ex) {
104
+ throw Throwables.propagate(ex);
105
+ }
106
+ }
107
+
108
+ // visible for TaskInvocationHandler.invokeDump
109
+ ObjectNode writeObjectAsObjectNode(Object v)
110
+ {
111
+ String json = writeObject(v);
112
+ try {
113
+ return objectMapper.readValue(json, ObjectNode.class);
114
+ } catch (Exception ex) {
115
+ throw Throwables.propagate(ex);
116
+ }
117
+ }
118
+
119
+ // visible for TaskSerDe.set
120
+ // TODO create annotation calss and get its instance at the 2nd argument
121
+ <T> T getInjectedInstance(Class<T> type)
122
+ {
123
+ return injector.getInstance(type);
124
+ }
125
+ }
@@ -0,0 +1,26 @@
1
+ package org.embulk.config;
2
+
3
+ public interface NextConfig
4
+ extends DataSource
5
+ {
6
+ @Override
7
+ public NextConfig getNested(String attrName);
8
+
9
+ @Override
10
+ public NextConfig getNestedOrSetEmpty(String attrName);
11
+
12
+ @Override
13
+ public NextConfig set(String attrName, Object v);
14
+
15
+ @Override
16
+ public NextConfig setNested(String attrName, DataSource v);
17
+
18
+ @Override
19
+ public NextConfig setAll(DataSource other);
20
+
21
+ @Override
22
+ public NextConfig deepCopy();
23
+
24
+ @Override
25
+ public NextConfig merge(DataSource other);
26
+ }
@@ -0,0 +1,10 @@
1
+ package org.embulk.config;
2
+
3
+ public interface Task
4
+ {
5
+ public void validate();
6
+ // TODO public void validateConfig();
7
+ // ConfigSource.loadTask calls validateConfig and it validates only fields that have Config annotation
8
+
9
+ public TaskSource dump();
10
+ }
@@ -0,0 +1,180 @@
1
+ package org.embulk.config;
2
+
3
+ import java.lang.reflect.Proxy;
4
+ import java.lang.reflect.Method;
5
+ import java.lang.reflect.InvocationHandler;
6
+ import java.util.Set;
7
+ import java.util.Map;
8
+ import java.util.HashMap;
9
+ import com.google.common.collect.ImmutableMap;
10
+
11
+ class TaskInvocationHandler
12
+ implements InvocationHandler
13
+ {
14
+ private final ModelManager model;
15
+ private final Class<?> iface;
16
+ private final Map<String, Object> objects;
17
+ private final Set<String> injectedFields;
18
+
19
+ public TaskInvocationHandler(ModelManager model, Class<?> iface, Map<String, Object> objects, Set<String> injectedFields)
20
+ {
21
+ this.model = model;
22
+ this.iface = iface;
23
+ this.objects = objects;
24
+ this.injectedFields = injectedFields;
25
+ }
26
+
27
+ /**
28
+ * fieldName = Method of the getter
29
+ */
30
+ public static Map<String, Method> fieldGetters(Class<?> iface)
31
+ {
32
+ ImmutableMap.Builder<String, Method> builder = ImmutableMap.builder();
33
+ for (Method method : iface.getMethods()) {
34
+ String methodName = method.getName();
35
+ String fieldName = getterFieldNameOrNull(methodName);
36
+ if (fieldName != null && hasExpectedArgumentLength(method, 0)) {
37
+ builder.put(fieldName, method);
38
+ }
39
+ }
40
+ return builder.build();
41
+ }
42
+
43
+ // visible for ModelManager.AccessorSerializer
44
+ Map<String, Object> getObjects()
45
+ {
46
+ return objects;
47
+ }
48
+
49
+ // visible for ModelManager.AccessorSerializer
50
+ Set<String> getInjectedFields()
51
+ {
52
+ return injectedFields;
53
+ }
54
+
55
+ protected Object invokeGetter(Method method, String fieldName)
56
+ {
57
+ return objects.get(fieldName);
58
+ }
59
+
60
+ protected void invokeSetter(Method method, String fieldName, Object value)
61
+ {
62
+ if (value == null) {
63
+ objects.remove(fieldName);
64
+ } else {
65
+ objects.put(fieldName, value);
66
+ }
67
+ }
68
+
69
+ private Map<String, Object> getSerializableFields()
70
+ {
71
+ Map<String, Object> data = new HashMap<String, Object>(objects);
72
+ for (String injected : injectedFields) {
73
+ data.remove(injected);
74
+ }
75
+ return data;
76
+ }
77
+
78
+ protected TaskSource invokeDump()
79
+ {
80
+ return new DataSourceImpl(model, model.writeObjectAsObjectNode(getSerializableFields()));
81
+ }
82
+
83
+ protected String invokeToString()
84
+ {
85
+ StringBuilder sb = new StringBuilder();
86
+ sb.append(iface.getName());
87
+ sb.append(getSerializableFields());
88
+ return sb.toString();
89
+ }
90
+
91
+ protected int invokeHashCode()
92
+ {
93
+ return objects.hashCode();
94
+ }
95
+
96
+ protected boolean invokeEquals(Object other)
97
+ {
98
+ return (other instanceof TaskInvocationHandler) &&
99
+ objects.equals(((TaskInvocationHandler) other).objects);
100
+ }
101
+
102
+ public Object invoke(Object proxy, Method method, Object[] args)
103
+ {
104
+ String methodName = method.getName();
105
+
106
+ switch(methodName) {
107
+ case "validate":
108
+ checkArgumentLength(method, 0, methodName);
109
+ model.validate(proxy);
110
+ return proxy;
111
+
112
+ case "dump":
113
+ checkArgumentLength(method, 0, methodName);
114
+ return invokeDump();
115
+
116
+ case "toString":
117
+ checkArgumentLength(method, 0, methodName);
118
+ return invokeToString();
119
+
120
+ case "hashCode":
121
+ checkArgumentLength(method, 0, methodName);
122
+ return invokeHashCode();
123
+
124
+ case "equals":
125
+ checkArgumentLength(method, 1, methodName);
126
+ if (args[0] instanceof Proxy) {
127
+ Object otherHandler = Proxy.getInvocationHandler(args[0]);
128
+ return invokeEquals(otherHandler);
129
+ }
130
+ return false;
131
+
132
+ default:
133
+ {
134
+ String fieldName;
135
+ fieldName = getterFieldNameOrNull(methodName);
136
+ if (fieldName != null) {
137
+ checkArgumentLength(method, 0, methodName);
138
+ return invokeGetter(method, fieldName);
139
+ }
140
+ fieldName = setterFieldNameOrNull(methodName);
141
+ if (fieldName != null) {
142
+ checkArgumentLength(method, 1, methodName);
143
+ invokeSetter(method, fieldName, args[0]);
144
+ return this;
145
+ }
146
+ }
147
+ }
148
+
149
+ throw new IllegalArgumentException(String.format("Undefined method '%s'", methodName));
150
+ }
151
+
152
+ private static String getterFieldNameOrNull(String methodName)
153
+ {
154
+ if (methodName.startsWith("get")) {
155
+ return methodName.substring(3);
156
+ }
157
+ return null;
158
+ }
159
+
160
+ private static String setterFieldNameOrNull(String methodName)
161
+ {
162
+ if (methodName.startsWith("set")) {
163
+ return methodName.substring(3);
164
+ }
165
+ return null;
166
+ }
167
+
168
+ protected static boolean hasExpectedArgumentLength(Method method, int expected)
169
+ {
170
+ return method.getParameterTypes().length == expected;
171
+ }
172
+
173
+ protected static void checkArgumentLength(Method method, int expected, String methodName)
174
+ {
175
+ if (!hasExpectedArgumentLength(method, expected)) {
176
+ throw new IllegalArgumentException(
177
+ String.format("Method '%s' expected %d argument but got %d arguments", methodName, expected, method.getParameterTypes().length));
178
+ }
179
+ }
180
+ }