embulk 0.7.0-java

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 (393) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +18 -0
  5. data/COPYING +14 -0
  6. data/Gemfile +2 -0
  7. data/Gemfile.lock +31 -0
  8. data/README.md +206 -0
  9. data/Rakefile +26 -0
  10. data/appveyor.yml +20 -0
  11. data/bin/embulk +106 -0
  12. data/build.gradle +338 -0
  13. data/embulk-cli/build.gradle +6 -0
  14. data/embulk-cli/src/main/java/org/embulk/cli/Main.java +22 -0
  15. data/embulk-cli/src/main/sh/selfrun.sh +158 -0
  16. data/embulk-cli/src/test/java/org/embulk/cli/DummyMain.java +23 -0
  17. data/embulk-cli/src/test/java/org/embulk/cli/SelfrunTest.java +281 -0
  18. data/embulk-core/build.gradle +59 -0
  19. data/embulk-core/src/main/java/org/embulk/EmbulkEmbed.java +315 -0
  20. data/embulk-core/src/main/java/org/embulk/EmbulkService.java +76 -0
  21. data/embulk-core/src/main/java/org/embulk/command/PreviewPrinter.java +84 -0
  22. data/embulk-core/src/main/java/org/embulk/command/TablePreviewPrinter.java +107 -0
  23. data/embulk-core/src/main/java/org/embulk/command/VerticalPreviewPrinter.java +47 -0
  24. data/embulk-core/src/main/java/org/embulk/config/CommitReport.java +33 -0
  25. data/embulk-core/src/main/java/org/embulk/config/Config.java +15 -0
  26. data/embulk-core/src/main/java/org/embulk/config/ConfigDefault.java +15 -0
  27. data/embulk-core/src/main/java/org/embulk/config/ConfigDiff.java +29 -0
  28. data/embulk-core/src/main/java/org/embulk/config/ConfigException.java +20 -0
  29. data/embulk-core/src/main/java/org/embulk/config/ConfigInject.java +14 -0
  30. data/embulk-core/src/main/java/org/embulk/config/ConfigLoader.java +141 -0
  31. data/embulk-core/src/main/java/org/embulk/config/ConfigSource.java +31 -0
  32. data/embulk-core/src/main/java/org/embulk/config/DataSource.java +39 -0
  33. data/embulk-core/src/main/java/org/embulk/config/DataSourceImpl.java +231 -0
  34. data/embulk-core/src/main/java/org/embulk/config/DataSourceSerDe.java +84 -0
  35. data/embulk-core/src/main/java/org/embulk/config/GenericTypeReference.java +20 -0
  36. data/embulk-core/src/main/java/org/embulk/config/ModelManager.java +123 -0
  37. data/embulk-core/src/main/java/org/embulk/config/Task.java +10 -0
  38. data/embulk-core/src/main/java/org/embulk/config/TaskInvocationHandler.java +180 -0
  39. data/embulk-core/src/main/java/org/embulk/config/TaskReport.java +29 -0
  40. data/embulk-core/src/main/java/org/embulk/config/TaskSerDe.java +345 -0
  41. data/embulk-core/src/main/java/org/embulk/config/TaskSource.java +31 -0
  42. data/embulk-core/src/main/java/org/embulk/config/TaskValidationException.java +38 -0
  43. data/embulk-core/src/main/java/org/embulk/config/TaskValidator.java +24 -0
  44. data/embulk-core/src/main/java/org/embulk/exec/BulkLoader.java +652 -0
  45. data/embulk-core/src/main/java/org/embulk/exec/ExecModule.java +52 -0
  46. data/embulk-core/src/main/java/org/embulk/exec/ExecutionInterruptedException.java +10 -0
  47. data/embulk-core/src/main/java/org/embulk/exec/ExecutionResult.java +26 -0
  48. data/embulk-core/src/main/java/org/embulk/exec/ExtensionServiceLoaderModule.java +43 -0
  49. data/embulk-core/src/main/java/org/embulk/exec/ForGuess.java +16 -0
  50. data/embulk-core/src/main/java/org/embulk/exec/ForSystemConfig.java +16 -0
  51. data/embulk-core/src/main/java/org/embulk/exec/GuessExecutor.java +373 -0
  52. data/embulk-core/src/main/java/org/embulk/exec/LocalExecutorPlugin.java +129 -0
  53. data/embulk-core/src/main/java/org/embulk/exec/LocalThreadExecutor.java +34 -0
  54. data/embulk-core/src/main/java/org/embulk/exec/LoggerProvider.java +60 -0
  55. data/embulk-core/src/main/java/org/embulk/exec/NoSampleException.java +10 -0
  56. data/embulk-core/src/main/java/org/embulk/exec/PartialExecutionException.java +18 -0
  57. data/embulk-core/src/main/java/org/embulk/exec/PooledBufferAllocator.java +77 -0
  58. data/embulk-core/src/main/java/org/embulk/exec/PreviewExecutor.java +183 -0
  59. data/embulk-core/src/main/java/org/embulk/exec/PreviewResult.java +27 -0
  60. data/embulk-core/src/main/java/org/embulk/exec/PreviewedNoticeError.java +17 -0
  61. data/embulk-core/src/main/java/org/embulk/exec/ResumeState.java +100 -0
  62. data/embulk-core/src/main/java/org/embulk/exec/SamplingParserPlugin.java +136 -0
  63. data/embulk-core/src/main/java/org/embulk/exec/SetCurrentThreadName.java +19 -0
  64. data/embulk-core/src/main/java/org/embulk/exec/SystemConfigModule.java +24 -0
  65. data/embulk-core/src/main/java/org/embulk/exec/TempFileAllocator.java +35 -0
  66. data/embulk-core/src/main/java/org/embulk/guice/Bootstrap.java +157 -0
  67. data/embulk-core/src/main/java/org/embulk/guice/CloseableInjector.java +22 -0
  68. data/embulk-core/src/main/java/org/embulk/guice/InjectorProxy.java +145 -0
  69. data/embulk-core/src/main/java/org/embulk/guice/LifeCycleInjector.java +26 -0
  70. data/embulk-core/src/main/java/org/embulk/guice/LifeCycleInjectorProxy.java +61 -0
  71. data/embulk-core/src/main/java/org/embulk/guice/LifeCycleManager.java +187 -0
  72. data/embulk-core/src/main/java/org/embulk/guice/LifeCycleMethods.java +89 -0
  73. data/embulk-core/src/main/java/org/embulk/guice/LifeCycleMethodsMap.java +38 -0
  74. data/embulk-core/src/main/java/org/embulk/guice/LifeCycleModule.java +97 -0
  75. data/embulk-core/src/main/java/org/embulk/jruby/JRubyPluginSource.java +72 -0
  76. data/embulk-core/src/main/java/org/embulk/jruby/JRubyScriptingModule.java +119 -0
  77. data/embulk-core/src/main/java/org/embulk/plugin/BuiltinPluginSourceModule.java +17 -0
  78. data/embulk-core/src/main/java/org/embulk/plugin/InjectedPluginSource.java +96 -0
  79. data/embulk-core/src/main/java/org/embulk/plugin/PluginClassLoader.java +168 -0
  80. data/embulk-core/src/main/java/org/embulk/plugin/PluginClassLoaderFactory.java +9 -0
  81. data/embulk-core/src/main/java/org/embulk/plugin/PluginClassLoaderModule.java +71 -0
  82. data/embulk-core/src/main/java/org/embulk/plugin/PluginManager.java +78 -0
  83. data/embulk-core/src/main/java/org/embulk/plugin/PluginSource.java +6 -0
  84. data/embulk-core/src/main/java/org/embulk/plugin/PluginSourceNotMatchException.java +19 -0
  85. data/embulk-core/src/main/java/org/embulk/plugin/PluginType.java +47 -0
  86. data/embulk-core/src/main/java/org/embulk/plugin/compat/InputPluginWrapper.java +102 -0
  87. data/embulk-core/src/main/java/org/embulk/plugin/compat/PluginWrappers.java +30 -0
  88. data/embulk-core/src/main/java/org/embulk/plugin/compat/TransactionalFileInputWrapper.java +96 -0
  89. data/embulk-core/src/main/java/org/embulk/plugin/compat/TransactionalFileOutputWrapper.java +102 -0
  90. data/embulk-core/src/main/java/org/embulk/plugin/compat/TransactionalPageOutputWrapper.java +95 -0
  91. data/embulk-core/src/main/java/org/embulk/spi/Buffer.java +148 -0
  92. data/embulk-core/src/main/java/org/embulk/spi/BufferAllocator.java +8 -0
  93. data/embulk-core/src/main/java/org/embulk/spi/Column.java +92 -0
  94. data/embulk-core/src/main/java/org/embulk/spi/ColumnConfig.java +112 -0
  95. data/embulk-core/src/main/java/org/embulk/spi/ColumnVisitor.java +14 -0
  96. data/embulk-core/src/main/java/org/embulk/spi/DecoderPlugin.java +16 -0
  97. data/embulk-core/src/main/java/org/embulk/spi/EncoderPlugin.java +16 -0
  98. data/embulk-core/src/main/java/org/embulk/spi/Exec.java +113 -0
  99. data/embulk-core/src/main/java/org/embulk/spi/ExecAction.java +6 -0
  100. data/embulk-core/src/main/java/org/embulk/spi/ExecSession.java +217 -0
  101. data/embulk-core/src/main/java/org/embulk/spi/ExecutorPlugin.java +19 -0
  102. data/embulk-core/src/main/java/org/embulk/spi/Extension.java +44 -0
  103. data/embulk-core/src/main/java/org/embulk/spi/FileInput.java +11 -0
  104. data/embulk-core/src/main/java/org/embulk/spi/FileInputPlugin.java +30 -0
  105. data/embulk-core/src/main/java/org/embulk/spi/FileInputRunner.java +162 -0
  106. data/embulk-core/src/main/java/org/embulk/spi/FileOutput.java +13 -0
  107. data/embulk-core/src/main/java/org/embulk/spi/FileOutputPlugin.java +28 -0
  108. data/embulk-core/src/main/java/org/embulk/spi/FileOutputRunner.java +202 -0
  109. data/embulk-core/src/main/java/org/embulk/spi/FilterPlugin.java +18 -0
  110. data/embulk-core/src/main/java/org/embulk/spi/FormatterPlugin.java +18 -0
  111. data/embulk-core/src/main/java/org/embulk/spi/GuessPlugin.java +9 -0
  112. data/embulk-core/src/main/java/org/embulk/spi/InputPlugin.java +33 -0
  113. data/embulk-core/src/main/java/org/embulk/spi/OutputPlugin.java +29 -0
  114. data/embulk-core/src/main/java/org/embulk/spi/Page.java +51 -0
  115. data/embulk-core/src/main/java/org/embulk/spi/PageBuilder.java +338 -0
  116. data/embulk-core/src/main/java/org/embulk/spi/PageFormat.java +47 -0
  117. data/embulk-core/src/main/java/org/embulk/spi/PageOutput.java +11 -0
  118. data/embulk-core/src/main/java/org/embulk/spi/PageReader.java +226 -0
  119. data/embulk-core/src/main/java/org/embulk/spi/ParserPlugin.java +17 -0
  120. data/embulk-core/src/main/java/org/embulk/spi/ProcessState.java +10 -0
  121. data/embulk-core/src/main/java/org/embulk/spi/ProcessTask.java +117 -0
  122. data/embulk-core/src/main/java/org/embulk/spi/Schema.java +134 -0
  123. data/embulk-core/src/main/java/org/embulk/spi/SchemaConfig.java +93 -0
  124. data/embulk-core/src/main/java/org/embulk/spi/SchemaConfigException.java +22 -0
  125. data/embulk-core/src/main/java/org/embulk/spi/TaskState.java +81 -0
  126. data/embulk-core/src/main/java/org/embulk/spi/TempFileException.java +19 -0
  127. data/embulk-core/src/main/java/org/embulk/spi/TempFileSpace.java +87 -0
  128. data/embulk-core/src/main/java/org/embulk/spi/Transactional.java +10 -0
  129. data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileInput.java +17 -0
  130. data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileOutput.java +19 -0
  131. data/embulk-core/src/main/java/org/embulk/spi/TransactionalPageOutput.java +17 -0
  132. data/embulk-core/src/main/java/org/embulk/spi/time/DateTimeZoneSerDe.java +55 -0
  133. data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelper.java +8 -0
  134. data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelperFactory.java +6 -0
  135. data/embulk-core/src/main/java/org/embulk/spi/time/Timestamp.java +159 -0
  136. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormat.java +100 -0
  137. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormatter.java +97 -0
  138. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParseException.java +10 -0
  139. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParser.java +104 -0
  140. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampSerDe.java +49 -0
  141. data/embulk-core/src/main/java/org/embulk/spi/type/AbstractType.java +58 -0
  142. data/embulk-core/src/main/java/org/embulk/spi/type/BooleanType.java +12 -0
  143. data/embulk-core/src/main/java/org/embulk/spi/type/DoubleType.java +12 -0
  144. data/embulk-core/src/main/java/org/embulk/spi/type/LongType.java +12 -0
  145. data/embulk-core/src/main/java/org/embulk/spi/type/StringType.java +12 -0
  146. data/embulk-core/src/main/java/org/embulk/spi/type/TimestampType.java +41 -0
  147. data/embulk-core/src/main/java/org/embulk/spi/type/Type.java +15 -0
  148. data/embulk-core/src/main/java/org/embulk/spi/type/TypeDeserializer.java +44 -0
  149. data/embulk-core/src/main/java/org/embulk/spi/type/Types.java +14 -0
  150. data/embulk-core/src/main/java/org/embulk/spi/unit/ByteSize.java +156 -0
  151. data/embulk-core/src/main/java/org/embulk/spi/unit/LocalFile.java +106 -0
  152. data/embulk-core/src/main/java/org/embulk/spi/unit/LocalFileSerDe.java +113 -0
  153. data/embulk-core/src/main/java/org/embulk/spi/unit/ToString.java +54 -0
  154. data/embulk-core/src/main/java/org/embulk/spi/unit/ToStringMap.java +34 -0
  155. data/embulk-core/src/main/java/org/embulk/spi/util/CharsetSerDe.java +55 -0
  156. data/embulk-core/src/main/java/org/embulk/spi/util/Decoders.java +81 -0
  157. data/embulk-core/src/main/java/org/embulk/spi/util/DynamicColumnNotFoundException.java +10 -0
  158. data/embulk-core/src/main/java/org/embulk/spi/util/DynamicColumnSetter.java +18 -0
  159. data/embulk-core/src/main/java/org/embulk/spi/util/DynamicColumnSetterFactory.java +94 -0
  160. data/embulk-core/src/main/java/org/embulk/spi/util/DynamicPageBuilder.java +161 -0
  161. data/embulk-core/src/main/java/org/embulk/spi/util/Encoders.java +81 -0
  162. data/embulk-core/src/main/java/org/embulk/spi/util/Executors.java +95 -0
  163. data/embulk-core/src/main/java/org/embulk/spi/util/FileInputInputStream.java +111 -0
  164. data/embulk-core/src/main/java/org/embulk/spi/util/FileOutputOutputStream.java +119 -0
  165. data/embulk-core/src/main/java/org/embulk/spi/util/Filters.java +100 -0
  166. data/embulk-core/src/main/java/org/embulk/spi/util/InputStreamFileInput.java +190 -0
  167. data/embulk-core/src/main/java/org/embulk/spi/util/InputStreamTransactionalFileInput.java +25 -0
  168. data/embulk-core/src/main/java/org/embulk/spi/util/Inputs.java +65 -0
  169. data/embulk-core/src/main/java/org/embulk/spi/util/LineDecoder.java +118 -0
  170. data/embulk-core/src/main/java/org/embulk/spi/util/LineEncoder.java +123 -0
  171. data/embulk-core/src/main/java/org/embulk/spi/util/ListFileInput.java +52 -0
  172. data/embulk-core/src/main/java/org/embulk/spi/util/Newline.java +38 -0
  173. data/embulk-core/src/main/java/org/embulk/spi/util/OutputStreamFileOutput.java +88 -0
  174. data/embulk-core/src/main/java/org/embulk/spi/util/PagePrinter.java +102 -0
  175. data/embulk-core/src/main/java/org/embulk/spi/util/Pages.java +139 -0
  176. data/embulk-core/src/main/java/org/embulk/spi/util/ResumableInputStream.java +128 -0
  177. data/embulk-core/src/main/java/org/embulk/spi/util/RetryExecutor.java +130 -0
  178. data/embulk-core/src/main/java/org/embulk/spi/util/Timestamps.java +53 -0
  179. data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/AbstractDynamicColumnSetter.java +79 -0
  180. data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/BooleanColumnSetter.java +64 -0
  181. data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/DefaultValueSetter.java +18 -0
  182. data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/DoubleColumnSetter.java +61 -0
  183. data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/LongColumnSetter.java +69 -0
  184. data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/NullDefaultValueSetter.java +34 -0
  185. data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/SkipColumnSetter.java +52 -0
  186. data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/StringColumnSetter.java +56 -0
  187. data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/TimestampColumnSetter.java +64 -0
  188. data/embulk-core/src/main/resources/embulk/logback-color.xml +72 -0
  189. data/embulk-core/src/main/resources/embulk/logback-console.xml +14 -0
  190. data/embulk-core/src/main/resources/embulk/logback-file.xml +25 -0
  191. data/embulk-core/src/main/resources/embulk/parent_first_packages.properties +70 -0
  192. data/embulk-core/src/main/resources/embulk/parent_first_resources.properties +28 -0
  193. data/embulk-core/src/test/java/org/embulk/EmbulkTestRuntime.java +114 -0
  194. data/embulk-core/src/test/java/org/embulk/GuiceBinder.java +72 -0
  195. data/embulk-core/src/test/java/org/embulk/RandomManager.java +53 -0
  196. data/embulk-core/src/test/java/org/embulk/TestPluginSourceModule.java +23 -0
  197. data/embulk-core/src/test/java/org/embulk/TestUtilityModule.java +17 -0
  198. data/embulk-core/src/test/java/org/embulk/config/TestConfigLoader.java +66 -0
  199. data/embulk-core/src/test/java/org/embulk/config/TestConfigSource.java +114 -0
  200. data/embulk-core/src/test/java/org/embulk/config/TestTaskSource.java +70 -0
  201. data/embulk-core/src/test/java/org/embulk/plugin/MockPluginSource.java +58 -0
  202. data/embulk-core/src/test/java/org/embulk/plugin/TestPluginType.java +18 -0
  203. data/embulk-core/src/test/java/org/embulk/spi/MockFileOutput.java +63 -0
  204. data/embulk-core/src/test/java/org/embulk/spi/MockFormatterPlugin.java +101 -0
  205. data/embulk-core/src/test/java/org/embulk/spi/MockParserPlugin.java +73 -0
  206. data/embulk-core/src/test/java/org/embulk/spi/PageTestUtils.java +57 -0
  207. data/embulk-core/src/test/java/org/embulk/spi/TestBuffer.java +24 -0
  208. data/embulk-core/src/test/java/org/embulk/spi/TestFileInputInputStream.java +89 -0
  209. data/embulk-core/src/test/java/org/embulk/spi/TestFileInputRunner.java +196 -0
  210. data/embulk-core/src/test/java/org/embulk/spi/TestFileOutputRunner.java +207 -0
  211. data/embulk-core/src/test/java/org/embulk/spi/TestInputStreamFileInput.java +188 -0
  212. data/embulk-core/src/test/java/org/embulk/spi/TestPageBuilderReader.java +319 -0
  213. data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestamp.java +116 -0
  214. data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestampFormatterParser.java +63 -0
  215. data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestampFormatterParserDeprecated.java +67 -0
  216. data/embulk-core/src/test/java/org/embulk/spi/type/TestTypeSerDe.java +45 -0
  217. data/embulk-core/src/test/java/org/embulk/spi/unit/TestByteSize.java +79 -0
  218. data/embulk-core/src/test/java/org/embulk/spi/util/TestLineDecoder.java +132 -0
  219. data/embulk-core/src/test/java/org/embulk/spi/util/TestLineEncoder.java +123 -0
  220. data/embulk-docs/Makefile +178 -0
  221. data/embulk-docs/build.gradle +32 -0
  222. data/embulk-docs/make.bat +243 -0
  223. data/embulk-docs/push-gh-pages.sh +49 -0
  224. data/embulk-docs/src/_static/embulk-architecture.png +0 -0
  225. data/embulk-docs/src/_static/embulk-logo.png +0 -0
  226. data/embulk-docs/src/_static/embulk-logo.svg +133 -0
  227. data/embulk-docs/src/built-in.rst +440 -0
  228. data/embulk-docs/src/conf.py +260 -0
  229. data/embulk-docs/src/customization.rst +184 -0
  230. data/embulk-docs/src/index.rst +84 -0
  231. data/embulk-docs/src/recipe.rst +8 -0
  232. data/embulk-docs/src/recipe/scheduled-csv-load-to-elasticsearch-kibana4.rst +153 -0
  233. data/embulk-docs/src/release.rst +57 -0
  234. data/embulk-docs/src/release/release-0.1.0.rst +8 -0
  235. data/embulk-docs/src/release/release-0.2.0.rst +16 -0
  236. data/embulk-docs/src/release/release-0.2.1.rst +19 -0
  237. data/embulk-docs/src/release/release-0.3.0.rst +34 -0
  238. data/embulk-docs/src/release/release-0.3.1.rst +11 -0
  239. data/embulk-docs/src/release/release-0.3.2.rst +15 -0
  240. data/embulk-docs/src/release/release-0.4.0.rst +74 -0
  241. data/embulk-docs/src/release/release-0.4.1.rst +18 -0
  242. data/embulk-docs/src/release/release-0.4.10.rst +17 -0
  243. data/embulk-docs/src/release/release-0.4.2.rst +18 -0
  244. data/embulk-docs/src/release/release-0.4.3.rst +34 -0
  245. data/embulk-docs/src/release/release-0.4.4.rst +39 -0
  246. data/embulk-docs/src/release/release-0.4.5.rst +24 -0
  247. data/embulk-docs/src/release/release-0.4.6.rst +30 -0
  248. data/embulk-docs/src/release/release-0.4.7.rst +16 -0
  249. data/embulk-docs/src/release/release-0.4.8.rst +15 -0
  250. data/embulk-docs/src/release/release-0.4.9.rst +23 -0
  251. data/embulk-docs/src/release/release-0.5.0.rst +89 -0
  252. data/embulk-docs/src/release/release-0.5.1.rst +13 -0
  253. data/embulk-docs/src/release/release-0.5.2.rst +30 -0
  254. data/embulk-docs/src/release/release-0.5.3.rst +22 -0
  255. data/embulk-docs/src/release/release-0.5.4.rst +24 -0
  256. data/embulk-docs/src/release/release-0.5.5.rst +18 -0
  257. data/embulk-docs/src/release/release-0.6.0.rst +34 -0
  258. data/embulk-docs/src/release/release-0.6.1.rst +11 -0
  259. data/embulk-docs/src/release/release-0.6.10.rst +15 -0
  260. data/embulk-docs/src/release/release-0.6.11.rst +19 -0
  261. data/embulk-docs/src/release/release-0.6.12.rst +31 -0
  262. data/embulk-docs/src/release/release-0.6.13.rst +23 -0
  263. data/embulk-docs/src/release/release-0.6.14.rst +47 -0
  264. data/embulk-docs/src/release/release-0.6.15.rst +26 -0
  265. data/embulk-docs/src/release/release-0.6.16.rst +26 -0
  266. data/embulk-docs/src/release/release-0.6.17.rst +39 -0
  267. data/embulk-docs/src/release/release-0.6.18.rst +14 -0
  268. data/embulk-docs/src/release/release-0.6.19.rst +18 -0
  269. data/embulk-docs/src/release/release-0.6.2.rst +17 -0
  270. data/embulk-docs/src/release/release-0.6.20.rst +19 -0
  271. data/embulk-docs/src/release/release-0.6.21.rst +20 -0
  272. data/embulk-docs/src/release/release-0.6.22.rst +26 -0
  273. data/embulk-docs/src/release/release-0.6.23.rst +17 -0
  274. data/embulk-docs/src/release/release-0.6.24.rst +13 -0
  275. data/embulk-docs/src/release/release-0.6.25.rst +12 -0
  276. data/embulk-docs/src/release/release-0.6.3.rst +23 -0
  277. data/embulk-docs/src/release/release-0.6.4.rst +13 -0
  278. data/embulk-docs/src/release/release-0.6.5.rst +17 -0
  279. data/embulk-docs/src/release/release-0.6.6.rst +17 -0
  280. data/embulk-docs/src/release/release-0.6.7.rst +17 -0
  281. data/embulk-docs/src/release/release-0.6.8.rst +24 -0
  282. data/embulk-docs/src/release/release-0.6.9.rst +24 -0
  283. data/embulk-docs/src/release/release-0.7.0.rst +96 -0
  284. data/embulk-standards/build.gradle +5 -0
  285. data/embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java +284 -0
  286. data/embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java +379 -0
  287. data/embulk-standards/src/main/java/org/embulk/standards/CsvTokenizer.java +411 -0
  288. data/embulk-standards/src/main/java/org/embulk/standards/GzipFileDecoderPlugin.java +55 -0
  289. data/embulk-standards/src/main/java/org/embulk/standards/GzipFileEncoderPlugin.java +71 -0
  290. data/embulk-standards/src/main/java/org/embulk/standards/LocalFileInputPlugin.java +203 -0
  291. data/embulk-standards/src/main/java/org/embulk/standards/LocalFileOutputPlugin.java +148 -0
  292. data/embulk-standards/src/main/java/org/embulk/standards/NullOutputPlugin.java +59 -0
  293. data/embulk-standards/src/main/java/org/embulk/standards/RenameFilterPlugin.java +56 -0
  294. data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginExtension.java +16 -0
  295. data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginModule.java +53 -0
  296. data/embulk-standards/src/main/java/org/embulk/standards/StdoutOutputPlugin.java +85 -0
  297. data/embulk-standards/src/main/resources/META-INF/services/org.embulk.spi.Extension +1 -0
  298. data/embulk-standards/src/test/java/org/embulk/standards/TestCsvFormatterPlugin.java +312 -0
  299. data/embulk-standards/src/test/java/org/embulk/standards/TestCsvParserPlugin.java +75 -0
  300. data/embulk-standards/src/test/java/org/embulk/standards/TestCsvTokenizer.java +360 -0
  301. data/embulk-standards/src/test/java/org/embulk/standards/TestRenameFilterPlugin.java +88 -0
  302. data/embulk.gemspec +39 -0
  303. data/gradle/wrapper/gradle-wrapper.jar +0 -0
  304. data/gradle/wrapper/gradle-wrapper.properties +6 -0
  305. data/gradlew +164 -0
  306. data/gradlew.bat +90 -0
  307. data/lib/embulk.rb +72 -0
  308. data/lib/embulk/buffer.rb +22 -0
  309. data/lib/embulk/column.rb +70 -0
  310. data/lib/embulk/command/embulk_bundle.rb +56 -0
  311. data/lib/embulk/command/embulk_example.rb +32 -0
  312. data/lib/embulk/command/embulk_generate_bin.rb +62 -0
  313. data/lib/embulk/command/embulk_main.rb +2 -0
  314. data/lib/embulk/command/embulk_migrate_plugin.rb +170 -0
  315. data/lib/embulk/command/embulk_new_plugin.rb +124 -0
  316. data/lib/embulk/command/embulk_run.rb +470 -0
  317. data/lib/embulk/command/embulk_selfupdate.rb +84 -0
  318. data/lib/embulk/data/bundle/.bundle/config +3 -0
  319. data/lib/embulk/data/bundle/.ruby-version +1 -0
  320. data/lib/embulk/data/bundle/Gemfile +26 -0
  321. data/lib/embulk/data/bundle/embulk/filter/example.rb +42 -0
  322. data/lib/embulk/data/bundle/embulk/input/example.rb +54 -0
  323. data/lib/embulk/data/bundle/embulk/output/example.rb +58 -0
  324. data/lib/embulk/data/new/LICENSE.txt +21 -0
  325. data/lib/embulk/data/new/README.md.erb +111 -0
  326. data/lib/embulk/data/new/gitignore.erb +13 -0
  327. data/lib/embulk/data/new/java/build.gradle.erb +73 -0
  328. data/lib/embulk/data/new/java/decoder.java.erb +84 -0
  329. data/lib/embulk/data/new/java/encoder.java.erb +86 -0
  330. data/lib/embulk/data/new/java/file_input.java.erb +143 -0
  331. data/lib/embulk/data/new/java/file_output.java.erb +93 -0
  332. data/lib/embulk/data/new/java/filter.java.erb +56 -0
  333. data/lib/embulk/data/new/java/formatter.java.erb +54 -0
  334. data/lib/embulk/data/new/java/gradle/wrapper/gradle-wrapper.jar +0 -0
  335. data/lib/embulk/data/new/java/gradle/wrapper/gradle-wrapper.properties +6 -0
  336. data/lib/embulk/data/new/java/gradlew +164 -0
  337. data/lib/embulk/data/new/java/gradlew.bat +90 -0
  338. data/lib/embulk/data/new/java/input.java.erb +87 -0
  339. data/lib/embulk/data/new/java/output.java.erb +77 -0
  340. data/lib/embulk/data/new/java/parser.java.erb +60 -0
  341. data/lib/embulk/data/new/java/plugin_loader.rb.erb +3 -0
  342. data/lib/embulk/data/new/java/test.java.erb +5 -0
  343. data/lib/embulk/data/new/ruby/.ruby-version +1 -0
  344. data/lib/embulk/data/new/ruby/Gemfile +2 -0
  345. data/lib/embulk/data/new/ruby/Rakefile +3 -0
  346. data/lib/embulk/data/new/ruby/decoder_guess.rb.erb +25 -0
  347. data/lib/embulk/data/new/ruby/filter.rb.erb +41 -0
  348. data/lib/embulk/data/new/ruby/formatter.rb.erb +49 -0
  349. data/lib/embulk/data/new/ruby/gemspec.erb +20 -0
  350. data/lib/embulk/data/new/ruby/input.rb.erb +59 -0
  351. data/lib/embulk/data/new/ruby/output.rb.erb +61 -0
  352. data/lib/embulk/data/new/ruby/parser.rb.erb +44 -0
  353. data/lib/embulk/data/new/ruby/parser_guess.rb.erb +65 -0
  354. data/lib/embulk/data/package_data.rb +50 -0
  355. data/lib/embulk/data_source.rb +220 -0
  356. data/lib/embulk/decoder_plugin.rb +27 -0
  357. data/lib/embulk/encoder_plugin.rb +27 -0
  358. data/lib/embulk/error.rb +8 -0
  359. data/lib/embulk/executor_plugin.rb +23 -0
  360. data/lib/embulk/file_input.rb +87 -0
  361. data/lib/embulk/file_input_plugin.rb +27 -0
  362. data/lib/embulk/file_output.rb +56 -0
  363. data/lib/embulk/file_output_plugin.rb +27 -0
  364. data/lib/embulk/filter_plugin.rb +105 -0
  365. data/lib/embulk/formatter_plugin.rb +105 -0
  366. data/lib/embulk/guess/charset.rb +44 -0
  367. data/lib/embulk/guess/csv.rb +327 -0
  368. data/lib/embulk/guess/gzip.rb +18 -0
  369. data/lib/embulk/guess/newline.rb +22 -0
  370. data/lib/embulk/guess/schema_guess.rb +118 -0
  371. data/lib/embulk/guess/time_format_guess.rb +394 -0
  372. data/lib/embulk/guess_plugin.rb +129 -0
  373. data/lib/embulk/input_plugin.rb +121 -0
  374. data/lib/embulk/java/bootstrap.rb +24 -0
  375. data/lib/embulk/java/imports.rb +69 -0
  376. data/lib/embulk/java/time_helper.rb +79 -0
  377. data/lib/embulk/java_plugin.rb +90 -0
  378. data/lib/embulk/logger.rb +154 -0
  379. data/lib/embulk/output_plugin.rb +150 -0
  380. data/lib/embulk/page.rb +30 -0
  381. data/lib/embulk/page_builder.rb +76 -0
  382. data/lib/embulk/parser_plugin.rb +78 -0
  383. data/lib/embulk/plugin.rb +239 -0
  384. data/lib/embulk/plugin_registry.rb +96 -0
  385. data/lib/embulk/runner.rb +184 -0
  386. data/lib/embulk/schema.rb +103 -0
  387. data/lib/embulk/version.rb +3 -0
  388. data/settings.gradle +6 -0
  389. data/test/guess/test_schema_guess.rb +11 -0
  390. data/test/guess/test_time_format_guess.rb +133 -0
  391. data/test/helper.rb +21 -0
  392. data/test/run-test.rb +14 -0
  393. metadata +566 -0
@@ -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,123 @@
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.ObjectMapper;
10
+ import com.fasterxml.jackson.databind.JsonNode;
11
+ import com.fasterxml.jackson.databind.node.ObjectNode;
12
+
13
+ public class ModelManager
14
+ {
15
+ private final Injector injector;
16
+ private final ObjectMapper objectMapper;
17
+ private final ObjectMapper configObjectMapper; // configObjectMapper uses different TaskDeserializer
18
+ private final TaskValidator taskValidator;
19
+
20
+ @Inject
21
+ public ModelManager(Injector injector, ObjectMapper objectMapper)
22
+ {
23
+ this.injector = injector;
24
+ this.objectMapper = objectMapper;
25
+ this.configObjectMapper = objectMapper.copy();
26
+ this.taskValidator = new TaskValidator(
27
+ Validation.byProvider(ApacheValidationProvider.class).configure().buildValidatorFactory().getValidator());
28
+
29
+ objectMapper.registerModule(new TaskSerDe.TaskSerializerModule(objectMapper));
30
+ objectMapper.registerModule(new TaskSerDe.TaskDeserializerModule(objectMapper, this));
31
+ objectMapper.registerModule(new DataSourceSerDe.SerDeModule(this));
32
+ configObjectMapper.registerModule(new TaskSerDe.TaskSerializerModule(configObjectMapper));
33
+ configObjectMapper.registerModule(new TaskSerDe.ConfigTaskDeserializerModule(configObjectMapper, this));
34
+ configObjectMapper.registerModule(new DataSourceSerDe.SerDeModule(this));
35
+ }
36
+
37
+ public <T> T readObject(Class<T> valueType, String json)
38
+ {
39
+ try {
40
+ return objectMapper.readValue(json, valueType);
41
+ } catch (Exception ex) {
42
+ throw Throwables.propagate(ex);
43
+ }
44
+ }
45
+
46
+ public <T> T readObject(Class<T> valueType, JsonParser parser)
47
+ {
48
+ try {
49
+ return objectMapper.readValue(parser, valueType);
50
+ } catch (Exception ex) {
51
+ throw Throwables.propagate(ex);
52
+ }
53
+ }
54
+
55
+ public <T> T readObjectWithConfigSerDe(Class<T> valueType, String json)
56
+ {
57
+ T t;
58
+ try {
59
+ t = configObjectMapper.readValue(json, valueType);
60
+ } catch (Exception ex) {
61
+ Throwables.propagateIfInstanceOf(ex, ConfigException.class);
62
+ throw new ConfigException(ex);
63
+ }
64
+ validate(t);
65
+ return t;
66
+ }
67
+
68
+ public <T> T readObjectWithConfigSerDe(Class<T> valueType, JsonParser parser)
69
+ {
70
+ T t;
71
+ try {
72
+ t = configObjectMapper.readValue(parser, valueType);
73
+ } catch (Exception ex) {
74
+ Throwables.propagateIfInstanceOf(ex, ConfigException.class);
75
+ throw new ConfigException(ex);
76
+ }
77
+ validate(t);
78
+ return t;
79
+ }
80
+
81
+ public String writeObject(Object object)
82
+ {
83
+ try {
84
+ return objectMapper.writeValueAsString(object);
85
+ } catch (Exception ex) {
86
+ throw Throwables.propagate(ex);
87
+ }
88
+ }
89
+
90
+ public void validate(Object object)
91
+ {
92
+ taskValidator.validateModel(object);
93
+ }
94
+
95
+ // visible for DataSource.set
96
+ JsonNode writeObjectAsJsonNode(Object v)
97
+ {
98
+ String json = writeObject(v);
99
+ try {
100
+ return objectMapper.readValue(json, JsonNode.class);
101
+ } catch (Exception ex) {
102
+ throw Throwables.propagate(ex);
103
+ }
104
+ }
105
+
106
+ // visible for TaskInvocationHandler.invokeDump
107
+ ObjectNode writeObjectAsObjectNode(Object v)
108
+ {
109
+ String json = writeObject(v);
110
+ try {
111
+ return objectMapper.readValue(json, ObjectNode.class);
112
+ } catch (Exception ex) {
113
+ throw Throwables.propagate(ex);
114
+ }
115
+ }
116
+
117
+ // visible for TaskSerDe.set
118
+ // TODO create annotation calss and get its instance at the 2nd argument
119
+ <T> T getInjectedInstance(Class<T> type)
120
+ {
121
+ return injector.getInstance(type);
122
+ }
123
+ }
@@ -0,0 +1,10 @@
1
+ package org.embulk.config;
2
+
3
+ public interface Task
4
+ {
5
+ void validate();
6
+ // TODO public void validateConfig();
7
+ // ConfigSource.loadTask calls validateConfig and it validates only fields that have Config annotation
8
+
9
+ 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
+ }
@@ -0,0 +1,29 @@
1
+ package org.embulk.config;
2
+
3
+ public interface TaskReport
4
+ extends DataSource
5
+ {
6
+ @Override
7
+ TaskReport getNested(String attrName);
8
+
9
+ @Override
10
+ TaskReport getNestedOrSetEmpty(String attrName);
11
+
12
+ @Override
13
+ TaskReport set(String attrName, Object v);
14
+
15
+ @Override
16
+ TaskReport setNested(String attrName, DataSource v);
17
+
18
+ @Override
19
+ TaskReport setAll(DataSource other);
20
+
21
+ @Override
22
+ TaskReport remove(String attrName);
23
+
24
+ @Override
25
+ TaskReport deepCopy();
26
+
27
+ @Override
28
+ TaskReport merge(DataSource other);
29
+ }
@@ -0,0 +1,345 @@
1
+ package org.embulk.config;
2
+
3
+ import java.lang.reflect.Proxy;
4
+ import java.lang.reflect.Method;
5
+ import java.lang.reflect.Type;
6
+ import java.io.IOException;
7
+ import java.util.List;
8
+ import java.util.Map;
9
+ import java.util.HashMap;
10
+ import java.util.concurrent.ConcurrentHashMap;
11
+ import com.google.common.base.Optional;
12
+ import com.google.common.collect.ImmutableList;
13
+ import com.google.common.collect.ImmutableSet;
14
+ import com.google.common.collect.ImmutableMap;
15
+ import com.fasterxml.jackson.core.JsonGenerator;
16
+ import com.fasterxml.jackson.core.JsonParser;
17
+ import com.fasterxml.jackson.core.JsonToken;
18
+ import com.fasterxml.jackson.core.Version;
19
+ import com.fasterxml.jackson.databind.Module;
20
+ import com.fasterxml.jackson.databind.module.SimpleModule;
21
+ import com.fasterxml.jackson.databind.deser.Deserializers;
22
+ import com.fasterxml.jackson.databind.ObjectMapper;
23
+ import com.fasterxml.jackson.databind.JavaType;
24
+ import com.fasterxml.jackson.databind.BeanDescription;
25
+ import com.fasterxml.jackson.databind.JsonSerializer;
26
+ import com.fasterxml.jackson.databind.JsonDeserializer;
27
+ import com.fasterxml.jackson.databind.SerializerProvider;
28
+ import com.fasterxml.jackson.databind.DeserializationContext;
29
+ import com.fasterxml.jackson.databind.DeserializationConfig;
30
+ import com.fasterxml.jackson.databind.JsonMappingException;
31
+
32
+ class TaskSerDe
33
+ {
34
+ public static class TaskSerializer
35
+ extends JsonSerializer<Task>
36
+ {
37
+ private final ObjectMapper nestedObjectMapper;
38
+
39
+ public TaskSerializer(ObjectMapper nestedObjectMapper)
40
+ {
41
+ this.nestedObjectMapper = nestedObjectMapper;
42
+ }
43
+
44
+ @Override
45
+ public void serialize(Task value, JsonGenerator jgen, SerializerProvider provider)
46
+ throws IOException
47
+ {
48
+ if (value instanceof Proxy) {
49
+ Object handler = Proxy.getInvocationHandler(value);
50
+ if (handler instanceof TaskInvocationHandler) {
51
+ TaskInvocationHandler h = (TaskInvocationHandler) handler;
52
+ Map<String, Object> objects = h.getObjects();
53
+ jgen.writeStartObject();
54
+ for (Map.Entry<String, Object> pair : objects.entrySet()) {
55
+ if (h.getInjectedFields().contains(pair.getKey())) {
56
+ continue;
57
+ }
58
+ jgen.writeFieldName(pair.getKey());
59
+ nestedObjectMapper.writeValue(jgen, pair.getValue());
60
+ }
61
+ jgen.writeEndObject();
62
+ return;
63
+ }
64
+ }
65
+ // TODO exception class & message
66
+ throw new UnsupportedOperationException("Serializing Task is not supported");
67
+ }
68
+ }
69
+
70
+ public static class TaskDeserializer <T>
71
+ extends JsonDeserializer<T>
72
+ {
73
+ private final ObjectMapper nestedObjectMapper;
74
+ private final ModelManager model;
75
+ private final Class<?> iface;
76
+ private final Map<String, FieldEntry> mappings;
77
+ private final List<InjectEntry> injects;
78
+
79
+ public TaskDeserializer(ObjectMapper nestedObjectMapper, ModelManager model, Class<T> iface)
80
+ {
81
+ this.nestedObjectMapper = nestedObjectMapper;
82
+ this.model = model;
83
+ this.iface = iface;
84
+ this.mappings = getterMappings(iface);
85
+ this.injects = injectEntries(iface);
86
+ }
87
+
88
+ protected Map<String, FieldEntry> getterMappings(Class<?> iface)
89
+ {
90
+ ImmutableMap.Builder<String, FieldEntry> builder = ImmutableMap.builder();
91
+ for (Map.Entry<String, Method> getter : TaskInvocationHandler.fieldGetters(iface).entrySet()) {
92
+ Method getterMethod = getter.getValue();
93
+ String fieldName = getter.getKey();
94
+
95
+ if (getterMethod.getAnnotation(ConfigInject.class) != null) {
96
+ // InjectEntry
97
+ continue;
98
+ }
99
+
100
+ Type fieldType = getterMethod.getGenericReturnType();
101
+
102
+ Optional<String> jsonKey = getJsonKey(getterMethod, fieldName);
103
+ if (!jsonKey.isPresent()) {
104
+ // skip this field
105
+ continue;
106
+ }
107
+ Optional<String> defaultJsonString = getDefaultJsonString(getterMethod);
108
+ builder.put(jsonKey.get(), new FieldEntry(fieldName, fieldType, defaultJsonString));
109
+ }
110
+ return builder.build();
111
+ }
112
+
113
+ protected List<InjectEntry> injectEntries(Class<?> iface)
114
+ {
115
+ ImmutableList.Builder<InjectEntry> builder = ImmutableList.builder();
116
+ for (Map.Entry<String, Method> getter : TaskInvocationHandler.fieldGetters(iface).entrySet()) {
117
+ Method getterMethod = getter.getValue();
118
+ String fieldName = getter.getKey();
119
+ ConfigInject inject = getterMethod.getAnnotation(ConfigInject.class);
120
+ if (inject != null) {
121
+ // InjectEntry
122
+ builder.add(new InjectEntry(fieldName, getterMethod.getReturnType()));
123
+ }
124
+ }
125
+ return builder.build();
126
+ }
127
+
128
+ protected Optional<String> getJsonKey(Method getterMethod, String fieldName)
129
+ {
130
+ return Optional.of(fieldName);
131
+ }
132
+
133
+ protected Optional<String> getDefaultJsonString(Method getterMethod)
134
+ {
135
+ return Optional.absent();
136
+ }
137
+
138
+ @Override
139
+ @SuppressWarnings("unchecked")
140
+ public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException
141
+ {
142
+ Map<String, Object> objects = new ConcurrentHashMap<String, Object>();
143
+ HashMap<String, FieldEntry> unusedMappings = new HashMap<>(mappings);
144
+
145
+ JsonToken current;
146
+ current = jp.getCurrentToken();
147
+ if (current == JsonToken.START_OBJECT) {
148
+ current = jp.nextToken();
149
+ }
150
+ for (; current != JsonToken.END_OBJECT; current = jp.nextToken()) {
151
+ String key = jp.getCurrentName();
152
+ current = jp.nextToken();
153
+ FieldEntry field = mappings.get(key);
154
+ if (field == null) {
155
+ jp.skipChildren();
156
+ } else {
157
+ Object value = nestedObjectMapper.readValue(jp, new GenericTypeReference(field.getType()));
158
+ if (value == null) {
159
+ throw new JsonMappingException("Setting null to a task field is not allowed. Use Optional<T> (com.google.common.base.Optional) to represent null.");
160
+ }
161
+ objects.put(field.getName(), value);
162
+ unusedMappings.remove(key);
163
+ }
164
+ }
165
+
166
+ // set default values
167
+ for (Map.Entry<String, FieldEntry> unused : unusedMappings.entrySet()) {
168
+ FieldEntry field = unused.getValue();
169
+ if (field.getDefaultJsonString().isPresent()) {
170
+ Object value = nestedObjectMapper.readValue(field.getDefaultJsonString().get(), new GenericTypeReference(field.getType()));
171
+ if (value == null) {
172
+ throw new JsonMappingException("Setting null to a task field is not allowed. Use Optional<T> (com.google.common.base.Optional) to represent null.");
173
+ }
174
+ objects.put(field.getName(), value);
175
+ } else {
176
+ // required field
177
+ throw new JsonMappingException("Field '"+unused.getKey()+"' is required but not set", jp.getCurrentLocation());
178
+ }
179
+ }
180
+
181
+ // inject
182
+ ImmutableSet.Builder<String> injectedFields = ImmutableSet.builder();
183
+ for (InjectEntry inject : injects) {
184
+ objects.put(inject.getName(), model.getInjectedInstance(inject.getType()));
185
+ injectedFields.add(inject.getName());
186
+ }
187
+
188
+ return (T) Proxy.newProxyInstance(
189
+ iface.getClassLoader(), new Class<?>[] { iface },
190
+ new TaskInvocationHandler(model, iface, objects, injectedFields.build()));
191
+ }
192
+
193
+ private static class FieldEntry
194
+ {
195
+ private final String name;
196
+ private final Type type;
197
+ private final Optional<String> defaultJsonString;
198
+
199
+ public FieldEntry(String name, Type type, Optional<String> defaultJsonString)
200
+ {
201
+ this.name = name;
202
+ this.type = type;
203
+ this.defaultJsonString = defaultJsonString;
204
+ }
205
+
206
+ public String getName()
207
+ {
208
+ return name;
209
+ }
210
+
211
+ public Type getType()
212
+ {
213
+ return type;
214
+ }
215
+
216
+ public Optional<String> getDefaultJsonString()
217
+ {
218
+ return defaultJsonString;
219
+ }
220
+ }
221
+
222
+ private static class InjectEntry
223
+ {
224
+ private final String name;
225
+ private Class<?> type;
226
+
227
+ public InjectEntry(String name, Class<?> type)
228
+ {
229
+ this.name = name;
230
+ this.type = type;
231
+ }
232
+
233
+ public String getName()
234
+ {
235
+ return name;
236
+ }
237
+
238
+ public Class<?> getType()
239
+ {
240
+ return type;
241
+ }
242
+ }
243
+ }
244
+
245
+ public static class TaskSerializerModule
246
+ extends SimpleModule
247
+ {
248
+ public TaskSerializerModule(ObjectMapper nestedObjectMapper)
249
+ {
250
+ super();
251
+ addSerializer(Task.class, new TaskSerializer(nestedObjectMapper));
252
+ }
253
+ }
254
+
255
+ public static class ConfigTaskDeserializer <T>
256
+ extends TaskDeserializer<T>
257
+ {
258
+ public ConfigTaskDeserializer(ObjectMapper nestedObjectMapper, ModelManager model, Class<T> iface)
259
+ {
260
+ super(nestedObjectMapper, model, iface);
261
+ }
262
+
263
+ @Override
264
+ protected Optional<String> getJsonKey(Method getterMethod, String fieldName)
265
+ {
266
+ Config a = getterMethod.getAnnotation(Config.class);
267
+ if (a != null) {
268
+ return Optional.of(a.value());
269
+ } else {
270
+ return Optional.absent(); // skip this field
271
+ }
272
+ }
273
+
274
+ @Override
275
+ public Optional<String> getDefaultJsonString(Method getterMethod)
276
+ {
277
+ ConfigDefault a = getterMethod.getAnnotation(ConfigDefault.class);
278
+ if (a != null && !a.value().isEmpty()) {
279
+ return Optional.of(a.value());
280
+ }
281
+ return super.getDefaultJsonString(getterMethod);
282
+ }
283
+ }
284
+
285
+ public static class TaskDeserializerModule
286
+ extends Module // can't use just SimpleModule, due to generic types
287
+ {
288
+ protected final ObjectMapper nestedObjectMapper;
289
+ protected final ModelManager model;
290
+
291
+ public TaskDeserializerModule(ObjectMapper nestedObjectMapper, ModelManager model)
292
+ {
293
+ this.nestedObjectMapper = nestedObjectMapper;
294
+ this.model = model;
295
+ }
296
+
297
+ @Override
298
+ public String getModuleName() { return "embulk.config.TaskSerDe"; }
299
+
300
+ @Override
301
+ public Version version() { return Version.unknownVersion(); }
302
+
303
+ @Override
304
+ public void setupModule(SetupContext context)
305
+ {
306
+ context.addDeserializers(new Deserializers.Base() {
307
+ @Override
308
+ public JsonDeserializer<?> findBeanDeserializer(JavaType type, DeserializationConfig config,
309
+ BeanDescription beanDesc) throws JsonMappingException
310
+ {
311
+ Class<?> raw = type.getRawClass();
312
+ if (Task.class.isAssignableFrom(raw)) {
313
+ return newTaskDeserializer(raw);
314
+ }
315
+ return super.findBeanDeserializer(type, config, beanDesc);
316
+ }
317
+ });
318
+ }
319
+
320
+ @SuppressWarnings("unchecked")
321
+ protected JsonDeserializer<?> newTaskDeserializer(Class<?> raw)
322
+ {
323
+ return new TaskDeserializer(nestedObjectMapper, model, raw);
324
+ }
325
+ }
326
+
327
+ public static class ConfigTaskDeserializerModule
328
+ extends TaskDeserializerModule
329
+ {
330
+ public ConfigTaskDeserializerModule(ObjectMapper nestedObjectMapper, ModelManager model)
331
+ {
332
+ super(nestedObjectMapper, model);
333
+ }
334
+
335
+ @Override
336
+ public String getModuleName() { return "embulk.config.ConfigTaskSerDe"; }
337
+
338
+ @Override
339
+ @SuppressWarnings("unchecked")
340
+ protected JsonDeserializer<?> newTaskDeserializer(Class<?> raw)
341
+ {
342
+ return new ConfigTaskDeserializer(nestedObjectMapper, model, raw);
343
+ }
344
+ }
345
+ }