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,31 @@
1
+ package org.embulk.config;
2
+
3
+ public interface TaskSource
4
+ extends DataSource
5
+ {
6
+ <T> T loadTask(Class<T> taskType);
7
+
8
+ @Override
9
+ TaskSource getNested(String attrName);
10
+
11
+ @Override
12
+ TaskSource getNestedOrSetEmpty(String attrName);
13
+
14
+ @Override
15
+ TaskSource set(String attrName, Object v);
16
+
17
+ @Override
18
+ TaskSource setNested(String attrName, DataSource v);
19
+
20
+ @Override
21
+ TaskSource setAll(DataSource other);
22
+
23
+ @Override
24
+ TaskSource remove(String attrName);
25
+
26
+ @Override
27
+ TaskSource deepCopy();
28
+
29
+ @Override
30
+ TaskSource merge(DataSource other);
31
+ }
@@ -0,0 +1,38 @@
1
+ package org.embulk.config;
2
+
3
+ import java.util.Set;
4
+ import javax.validation.ConstraintViolation;
5
+
6
+ public class TaskValidationException
7
+ extends RuntimeException
8
+ {
9
+ @SuppressWarnings("unchecked")
10
+ private final Set violations;
11
+
12
+ public <T> TaskValidationException(Set<ConstraintViolation<T>> violations)
13
+ {
14
+ super(formatMessage(violations));
15
+ this.violations = violations;
16
+ }
17
+
18
+ @SuppressWarnings("unchecked")
19
+ public Set<ConstraintViolation<?>> getViolations()
20
+ {
21
+ return violations;
22
+ }
23
+
24
+ private static <T> String formatMessage(Set<ConstraintViolation<T>> violations)
25
+ {
26
+ StringBuilder sb = new StringBuilder();
27
+ sb.append("Configuration task validation failed.");
28
+ for(ConstraintViolation<T> violation : violations) {
29
+ sb.append(" ");
30
+ sb.append(violation.getPropertyPath());
31
+ sb.append(" ");
32
+ sb.append(violation.getMessage());
33
+ sb.append(" but got ");
34
+ sb.append(violation.getInvalidValue());
35
+ }
36
+ return sb.toString();
37
+ }
38
+ }
@@ -0,0 +1,24 @@
1
+ package org.embulk.config;
2
+
3
+ import java.util.Set;
4
+ import javax.validation.Validator;
5
+ import javax.validation.ConstraintViolation;
6
+
7
+ public class TaskValidator
8
+ {
9
+ private final Validator validator;
10
+
11
+ public TaskValidator(Validator validator)
12
+ {
13
+ this.validator = validator;
14
+ }
15
+
16
+ public <T> void validateModel(T model) throws TaskValidationException
17
+ {
18
+ Set<ConstraintViolation<T>> violations = validator.validate(model);
19
+ if (!violations.isEmpty()) {
20
+ throw new TaskValidationException(violations);
21
+ }
22
+ }
23
+ }
24
+
@@ -0,0 +1,652 @@
1
+ package org.embulk.exec;
2
+
3
+ import java.util.List;
4
+ import java.util.concurrent.ExecutionException;
5
+ import com.google.common.base.Optional;
6
+ import com.google.common.collect.ImmutableList;
7
+ import com.google.inject.Inject;
8
+ import com.google.inject.Injector;
9
+ import com.google.common.base.Throwables;
10
+ import org.embulk.config.Task;
11
+ import org.embulk.config.Config;
12
+ import org.embulk.config.ConfigDefault;
13
+ import org.embulk.config.ConfigSource;
14
+ import org.embulk.config.ConfigException;
15
+ import org.embulk.config.TaskSource;
16
+ import org.embulk.config.ConfigDiff;
17
+ import org.embulk.config.TaskReport;
18
+ import org.embulk.plugin.PluginType;
19
+ import org.embulk.spi.Schema;
20
+ import org.embulk.spi.Exec;
21
+ import org.embulk.spi.ExecSession;
22
+ import org.embulk.spi.ExecAction;
23
+ import org.embulk.spi.ExecutorPlugin;
24
+ import org.embulk.spi.ProcessTask;
25
+ import org.embulk.spi.ProcessState;
26
+ import org.embulk.spi.TaskState;
27
+ import org.embulk.spi.InputPlugin;
28
+ import org.embulk.spi.FilterPlugin;
29
+ import org.embulk.spi.OutputPlugin;
30
+ import org.embulk.spi.util.Filters;
31
+ import org.slf4j.Logger;
32
+
33
+ public class BulkLoader
34
+ {
35
+ private final Injector injector;
36
+
37
+ public interface BulkLoaderTask
38
+ extends Task
39
+ {
40
+ @Config("exec")
41
+ @ConfigDefault("{}")
42
+ public ConfigSource getExecConfig();
43
+
44
+ @Config("in")
45
+ public ConfigSource getInputConfig();
46
+
47
+ @Config("filters")
48
+ @ConfigDefault("[]")
49
+ public List<ConfigSource> getFilterConfigs();
50
+
51
+ @Config("out")
52
+ public ConfigSource getOutputConfig();
53
+
54
+ public TaskSource getOutputTask();
55
+ public void setOutputTask(TaskSource taskSource);
56
+ }
57
+
58
+ @Inject
59
+ public BulkLoader(Injector injector,
60
+ @ForSystemConfig ConfigSource systemConfig)
61
+ {
62
+ this.injector = injector;
63
+ }
64
+
65
+ private static class LoaderState
66
+ implements ProcessState
67
+ {
68
+ private final Logger logger;
69
+
70
+ private final ProcessPluginSet plugins;
71
+
72
+ private volatile TaskSource inputTaskSource;
73
+ private volatile TaskSource outputTaskSource;
74
+ private volatile List<TaskSource> filterTaskSources;
75
+ private volatile List<Schema> schemas;
76
+ private volatile Schema executorSchema;
77
+
78
+ private volatile ConfigDiff inputConfigDiff;
79
+ private volatile ConfigDiff outputConfigDiff;
80
+
81
+ private volatile List<TaskState> inputTaskStates;
82
+ private volatile List<TaskState> outputTaskStates;
83
+
84
+ public LoaderState(Logger logger, ProcessPluginSet plugins)
85
+ {
86
+ this.logger = logger;
87
+ this.plugins = plugins;
88
+ }
89
+
90
+ public Logger getLogger()
91
+ {
92
+ return logger;
93
+ }
94
+
95
+ public void setSchemas(List<Schema> schemas)
96
+ {
97
+ this.schemas = schemas;
98
+ }
99
+
100
+ public void setExecutorSchema(Schema executorSchema)
101
+ {
102
+ this.executorSchema = executorSchema;
103
+ }
104
+
105
+ public void setInputTaskSource(TaskSource inputTaskSource)
106
+ {
107
+ this.inputTaskSource = inputTaskSource;
108
+ }
109
+
110
+ public void setOutputTaskSource(TaskSource outputTaskSource)
111
+ {
112
+ this.outputTaskSource = outputTaskSource;
113
+ }
114
+
115
+ public void setFilterTaskSources(List<TaskSource> filterTaskSources)
116
+ {
117
+ this.filterTaskSources = filterTaskSources;
118
+ }
119
+
120
+ public ProcessTask buildProcessTask()
121
+ {
122
+ return new ProcessTask(
123
+ plugins.getInputPluginType(), plugins.getOutputPluginType(), plugins.getFilterPluginTypes(),
124
+ inputTaskSource, outputTaskSource, filterTaskSources,
125
+ schemas, executorSchema, Exec.newTaskSource());
126
+ }
127
+
128
+ @Override
129
+ public void initialize(int inputTaskCount, int outputTaskCount)
130
+ {
131
+ if (inputTaskStates != null || outputTaskStates != null) {
132
+ // initialize is called twice if resume (by restoreResumedTaskReports and ExecutorPlugin.execute)
133
+ if (inputTaskStates.size() != inputTaskCount || outputTaskStates.size() != outputTaskCount) {
134
+ throw new ConfigException(String.format(
135
+ "input task count and output task (%d and %d) must be same with the first execution (%d and %d) whenre resumed",
136
+ inputTaskCount, outputTaskCount, inputTaskStates.size(), outputTaskStates.size()));
137
+ }
138
+ } else {
139
+ ImmutableList.Builder<TaskState> inputTaskStates = ImmutableList.builder();
140
+ ImmutableList.Builder<TaskState> outputTaskStates = ImmutableList.builder();
141
+ for (int i=0; i < inputTaskCount; i++) {
142
+ inputTaskStates.add(new TaskState());
143
+ }
144
+ for (int i=0; i < outputTaskCount; i++) {
145
+ outputTaskStates.add(new TaskState());
146
+ }
147
+ this.inputTaskStates = inputTaskStates.build();
148
+ this.outputTaskStates = outputTaskStates.build();
149
+ }
150
+ }
151
+
152
+ @Override
153
+ public TaskState getInputTaskState(int inputTaskIndex)
154
+ {
155
+ return inputTaskStates.get(inputTaskIndex);
156
+ }
157
+
158
+ @Override
159
+ public TaskState getOutputTaskState(int outputTaskIndex)
160
+ {
161
+ return outputTaskStates.get(outputTaskIndex);
162
+ }
163
+
164
+ public boolean isAllTasksCommitted()
165
+ {
166
+ if (outputTaskStates == null) {
167
+ // not initialized
168
+ return false;
169
+ }
170
+ for (TaskState outputTaskState : outputTaskStates) {
171
+ if (!outputTaskState.isCommitted()) {
172
+ return false;
173
+ }
174
+ }
175
+ return true;
176
+ }
177
+
178
+ public boolean isAllTransactionsCommitted()
179
+ {
180
+ return inputConfigDiff != null && outputConfigDiff != null;
181
+ }
182
+
183
+ public boolean isAnyStarted()
184
+ {
185
+ if (inputTaskStates == null) {
186
+ // not initialized
187
+ return false;
188
+ }
189
+ for (TaskState inputTaskState : inputTaskStates) {
190
+ if (inputTaskState.isStarted()) {
191
+ return true;
192
+ }
193
+ }
194
+ return false;
195
+ }
196
+
197
+ public void setOutputConfigDiff(ConfigDiff outputConfigDiff)
198
+ {
199
+ if (outputConfigDiff == null) {
200
+ outputConfigDiff = Exec.newConfigDiff();
201
+ }
202
+ this.outputConfigDiff = outputConfigDiff;
203
+ }
204
+
205
+ public void setInputConfigDiff(ConfigDiff inputConfigDiff)
206
+ {
207
+ if (inputConfigDiff == null) {
208
+ inputConfigDiff = Exec.newConfigDiff();
209
+ }
210
+ this.inputConfigDiff = inputConfigDiff;
211
+ }
212
+
213
+ private List<Optional<TaskReport>> getInputTaskReports()
214
+ {
215
+ ImmutableList.Builder<Optional<TaskReport>> builder = ImmutableList.builder();
216
+ for (TaskState inputTaskState : inputTaskStates) {
217
+ builder.add(inputTaskState.getTaskReport());
218
+ }
219
+ return builder.build();
220
+ }
221
+
222
+ private List<Optional<TaskReport>> getOutputTaskReports()
223
+ {
224
+ ImmutableList.Builder<Optional<TaskReport>> builder = ImmutableList.builder();
225
+ for (TaskState outputTaskState : outputTaskStates) {
226
+ builder.add(outputTaskState.getTaskReport());
227
+ }
228
+ return builder.build();
229
+ }
230
+
231
+ public List<TaskReport> getAllInputTaskReports()
232
+ {
233
+ ImmutableList.Builder<TaskReport> builder = ImmutableList.builder();
234
+ for (TaskState inputTaskState : inputTaskStates) {
235
+ builder.add(inputTaskState.getTaskReport().get());
236
+ }
237
+ return builder.build();
238
+ }
239
+
240
+ public List<TaskReport> getAllOutputTaskReports()
241
+ {
242
+ ImmutableList.Builder<TaskReport> builder = ImmutableList.builder();
243
+ for (TaskState outputTaskState : outputTaskStates) {
244
+ builder.add(outputTaskState.getTaskReport().get());
245
+ }
246
+ return builder.build();
247
+ }
248
+
249
+ public List<Throwable> getExceptions()
250
+ {
251
+ ImmutableList.Builder<Throwable> builder = ImmutableList.builder();
252
+ if (inputTaskStates != null) { // null if not initialized yet
253
+ for (TaskState inputTaskState : inputTaskStates) {
254
+ Optional<Throwable> exception = inputTaskState.getException();
255
+ if (exception.isPresent()) {
256
+ builder.add(exception.get());
257
+ }
258
+ }
259
+ }
260
+ if (outputTaskStates != null) { // null if not initialized yet
261
+ for (TaskState outputTaskState : outputTaskStates) {
262
+ Optional<Throwable> exception = outputTaskState.getException();
263
+ if (exception.isPresent()) {
264
+ builder.add(exception.get());
265
+ }
266
+ }
267
+ }
268
+ return builder.build();
269
+ }
270
+
271
+ public RuntimeException getRepresentativeException()
272
+ {
273
+ RuntimeException top = null;
274
+ for (Throwable ex : getExceptions()) {
275
+ if (top != null) {
276
+ top.addSuppressed(ex);
277
+ } else {
278
+ if (ex instanceof RuntimeException) {
279
+ top = (RuntimeException) ex;
280
+ } else {
281
+ top = new RuntimeException(ex);
282
+ }
283
+ }
284
+ }
285
+ if (top == null) {
286
+ top = new RuntimeException("Some transactions are not committed");
287
+ }
288
+ return top;
289
+ }
290
+
291
+ public ExecutionResult buildExecuteResult()
292
+ {
293
+ return buildExecuteResultWithWarningException(null);
294
+ }
295
+
296
+ public ExecutionResult buildExecuteResultWithWarningException(Throwable ex)
297
+ {
298
+ ConfigDiff configDiff = Exec.newConfigDiff();
299
+ if (inputConfigDiff != null) {
300
+ configDiff.getNestedOrSetEmpty("in").merge(inputConfigDiff);
301
+ }
302
+ if (outputConfigDiff != null) {
303
+ configDiff.getNestedOrSetEmpty("out").merge(outputConfigDiff);
304
+ }
305
+
306
+ ImmutableList.Builder<Throwable> ignoredExceptions = ImmutableList.builder();
307
+ for (Throwable e : getExceptions()) {
308
+ ignoredExceptions.add(e);
309
+ }
310
+ if (ex != null) {
311
+ ignoredExceptions.add(ex);
312
+ }
313
+
314
+ return new ExecutionResult(configDiff, ignoredExceptions.build());
315
+ }
316
+
317
+ public ResumeState buildResumeState(ExecSession exec)
318
+ {
319
+ return new ResumeState(
320
+ exec.getSessionExecConfig(),
321
+ inputTaskSource, outputTaskSource,
322
+ first(schemas), executorSchema,
323
+ getInputTaskReports(), getOutputTaskReports());
324
+ }
325
+
326
+ public PartialExecutionException buildPartialExecuteException(Throwable cause, ExecSession exec)
327
+ {
328
+ return new PartialExecutionException(cause, buildResumeState(exec));
329
+ }
330
+ }
331
+
332
+ public ExecutionResult run(ExecSession exec, final ConfigSource config)
333
+ {
334
+ try {
335
+ return Exec.doWith(exec, new ExecAction<ExecutionResult>() {
336
+ public ExecutionResult run()
337
+ {
338
+ try (SetCurrentThreadName dontCare = new SetCurrentThreadName("transaction")) {
339
+ return doRun(config);
340
+ }
341
+ }
342
+ });
343
+ } catch (ExecutionException ex) {
344
+ throw Throwables.propagate(ex.getCause());
345
+ }
346
+ }
347
+
348
+ public ExecutionResult resume(final ConfigSource config, final ResumeState resume)
349
+ {
350
+ try {
351
+ ExecSession exec = ExecSession.builder(injector).fromExecConfig(resume.getExecSessionConfigSource()).build();
352
+ ExecutionResult result = Exec.doWith(exec, new ExecAction<ExecutionResult>() {
353
+ public ExecutionResult run()
354
+ {
355
+ try (SetCurrentThreadName dontCare = new SetCurrentThreadName("resume")) {
356
+ return doResume(config, resume);
357
+ }
358
+ }
359
+ });
360
+ exec.cleanup();
361
+ return result;
362
+ } catch (ExecutionException ex) {
363
+ throw Throwables.propagate(ex.getCause());
364
+ }
365
+ }
366
+
367
+ public void cleanup(final ConfigSource config, final ResumeState resume)
368
+ {
369
+ try {
370
+ ExecSession exec = ExecSession.builder(injector).fromExecConfig(resume.getExecSessionConfigSource()).build();
371
+ Exec.doWith(exec, new ExecAction<Void>() {
372
+ public Void run()
373
+ {
374
+ try (SetCurrentThreadName dontCare = new SetCurrentThreadName("cleanup")) {
375
+ doCleanup(config, resume);
376
+ return null;
377
+ }
378
+ }
379
+ });
380
+ exec.cleanup();
381
+ } catch (ExecutionException ex) {
382
+ throw Throwables.propagate(ex.getCause());
383
+ }
384
+ }
385
+
386
+ private static class ProcessPluginSet
387
+ {
388
+ private final PluginType inputPluginType;
389
+ private final PluginType outputPluginType;
390
+ private final List<PluginType> filterPluginTypes;
391
+
392
+ private final InputPlugin inputPlugin;
393
+ private final OutputPlugin outputPlugin;
394
+ private final List<FilterPlugin> filterPlugins;
395
+
396
+ public ProcessPluginSet(BulkLoaderTask task)
397
+ {
398
+ this.inputPluginType = task.getInputConfig().get(PluginType.class, "type");
399
+ this.outputPluginType = task.getOutputConfig().get(PluginType.class, "type");
400
+ this.filterPluginTypes = Filters.getPluginTypes(task.getFilterConfigs());
401
+ this.inputPlugin = Exec.newPlugin(InputPlugin.class, inputPluginType);
402
+ this.outputPlugin = Exec.newPlugin(OutputPlugin.class, outputPluginType);
403
+ this.filterPlugins = Filters.newFilterPlugins(Exec.session(), filterPluginTypes);
404
+ }
405
+
406
+ public PluginType getInputPluginType()
407
+ {
408
+ return inputPluginType;
409
+ }
410
+
411
+ public PluginType getOutputPluginType()
412
+ {
413
+ return outputPluginType;
414
+ }
415
+
416
+ public List<PluginType> getFilterPluginTypes()
417
+ {
418
+ return filterPluginTypes;
419
+ }
420
+
421
+ public InputPlugin getInputPlugin()
422
+ {
423
+ return inputPlugin;
424
+ }
425
+
426
+ public OutputPlugin getOutputPlugin()
427
+ {
428
+ return outputPlugin;
429
+ }
430
+
431
+ public List<FilterPlugin> getFilterPlugins()
432
+ {
433
+ return filterPlugins;
434
+ }
435
+ }
436
+
437
+ public void doCleanup(ConfigSource config, ResumeState resume)
438
+ {
439
+ BulkLoaderTask task = config.loadConfig(BulkLoaderTask.class);
440
+ ProcessPluginSet plugins = new ProcessPluginSet(task); // TODO don't create filter plugins
441
+
442
+ ImmutableList.Builder<TaskReport> successfulInputTaskReports = ImmutableList.builder();
443
+ ImmutableList.Builder<TaskReport> successfulOutputTaskReports = ImmutableList.builder();
444
+ for (Optional<TaskReport> inputTaskReport : resume.getInputTaskReports()) {
445
+ if (inputTaskReport.isPresent()) {
446
+ successfulInputTaskReports.add(inputTaskReport.get());
447
+ }
448
+ }
449
+ for (Optional<TaskReport> outputTaskReport : resume.getOutputTaskReports()) {
450
+ if (outputTaskReport.isPresent()) {
451
+ successfulOutputTaskReports.add(outputTaskReport.get());
452
+ }
453
+ }
454
+
455
+ plugins.getInputPlugin().cleanup(resume.getInputTaskSource(), resume.getInputSchema(),
456
+ resume.getInputTaskReports().size(), successfulInputTaskReports.build());
457
+
458
+ plugins.getOutputPlugin().cleanup(resume.getOutputTaskSource(), resume.getOutputSchema(),
459
+ resume.getOutputTaskReports().size(), successfulOutputTaskReports.build());
460
+ }
461
+
462
+ private ExecutorPlugin newExecutorPlugin(BulkLoaderTask task)
463
+ {
464
+ return Exec.newPlugin(ExecutorPlugin.class,
465
+ task.getExecConfig().get(PluginType.class, "type", new PluginType("local")));
466
+ }
467
+
468
+ private ExecutionResult doRun(ConfigSource config)
469
+ {
470
+ final BulkLoaderTask task = config.loadConfig(BulkLoaderTask.class);
471
+
472
+ final ExecutorPlugin exec = newExecutorPlugin(task);
473
+ final ProcessPluginSet plugins = new ProcessPluginSet(task);
474
+
475
+ final LoaderState state = new LoaderState(Exec.getLogger(BulkLoader.class), plugins);
476
+ try {
477
+ ConfigDiff inputConfigDiff = plugins.getInputPlugin().transaction(task.getInputConfig(), new InputPlugin.Control() {
478
+ public List<TaskReport> run(final TaskSource inputTask, final Schema inputSchema, final int inputTaskCount)
479
+ {
480
+ state.setInputTaskSource(inputTask);
481
+ Filters.transaction(plugins.getFilterPlugins(), task.getFilterConfigs(), inputSchema, new Filters.Control() {
482
+ public void run(final List<TaskSource> filterTasks, final List<Schema> schemas)
483
+ {
484
+ state.setSchemas(schemas);
485
+ state.setFilterTaskSources(filterTasks);
486
+ exec.transaction(task.getExecConfig(), last(schemas), inputTaskCount, new ExecutorPlugin.Control() {
487
+ public void transaction(final Schema executorSchema, final int outputTaskCount, final ExecutorPlugin.Executor executor)
488
+ {
489
+ state.setExecutorSchema(executorSchema);
490
+ ConfigDiff outputConfigDiff = plugins.getOutputPlugin().transaction(task.getOutputConfig(), executorSchema, outputTaskCount, new OutputPlugin.Control() {
491
+ public List<TaskReport> run(final TaskSource outputTask)
492
+ {
493
+ state.setOutputTaskSource(outputTask);
494
+
495
+ state.initialize(inputTaskCount, outputTaskCount);
496
+
497
+ if (!state.isAllTasksCommitted()) { // inputTaskCount == 0
498
+ execute(task, executor, state);
499
+ }
500
+
501
+ return state.getAllOutputTaskReports();
502
+ }
503
+ });
504
+ state.setOutputConfigDiff(outputConfigDiff);
505
+ }
506
+ });
507
+ }
508
+ });
509
+ return state.getAllInputTaskReports();
510
+ }
511
+ });
512
+ state.setInputConfigDiff(inputConfigDiff);
513
+
514
+ cleanupCommittedTransaction(config, state);
515
+
516
+ return state.buildExecuteResult();
517
+
518
+ } catch (Throwable ex) {
519
+ if (state.isAllTasksCommitted() && state.isAllTransactionsCommitted()) {
520
+ // ignore the exception
521
+ return state.buildExecuteResultWithWarningException(ex);
522
+ }
523
+ if (!state.isAnyStarted()) {
524
+ throw ex;
525
+ }
526
+ throw state.buildPartialExecuteException(ex, Exec.session());
527
+ }
528
+ }
529
+
530
+ private ExecutionResult doResume(ConfigSource config, final ResumeState resume)
531
+ {
532
+ final BulkLoaderTask task = config.loadConfig(BulkLoaderTask.class);
533
+
534
+ final ExecutorPlugin exec = newExecutorPlugin(task);
535
+ final ProcessPluginSet plugins = new ProcessPluginSet(task);
536
+
537
+ final LoaderState state = new LoaderState(Exec.getLogger(BulkLoader.class), plugins);
538
+ try {
539
+ ConfigDiff inputConfigDiff = plugins.getInputPlugin().resume(resume.getInputTaskSource(), resume.getInputSchema(), resume.getInputTaskReports().size(), new InputPlugin.Control() {
540
+ public List<TaskReport> run(final TaskSource inputTask, final Schema inputSchema, final int inputTaskCount)
541
+ {
542
+ // TODO validate inputTask?
543
+ // TODO validate inputSchema
544
+ state.setInputTaskSource(inputTask);
545
+ Filters.transaction(plugins.getFilterPlugins(), task.getFilterConfigs(), inputSchema, new Filters.Control() {
546
+ public void run(final List<TaskSource> filterTasks, final List<Schema> schemas)
547
+ {
548
+ state.setSchemas(schemas);
549
+ state.setFilterTaskSources(filterTasks);
550
+ exec.transaction(task.getExecConfig(), last(schemas), inputTaskCount, new ExecutorPlugin.Control() {
551
+ public void transaction(final Schema executorSchema, final int outputTaskCount, final ExecutorPlugin.Executor executor)
552
+ {
553
+ // TODO validate executorSchema
554
+ state.setExecutorSchema(executorSchema);
555
+ ConfigDiff outputConfigDiff = plugins.getOutputPlugin().resume(resume.getOutputTaskSource(), executorSchema, outputTaskCount, new OutputPlugin.Control() {
556
+ public List<TaskReport> run(final TaskSource outputTask)
557
+ {
558
+ // TODO validate outputTask?
559
+ state.setOutputTaskSource(outputTask);
560
+
561
+ restoreResumedTaskReports(resume, state);
562
+ if (!state.isAllTasksCommitted()) {
563
+ execute(task, executor, state);
564
+ }
565
+
566
+ return state.getAllOutputTaskReports();
567
+ }
568
+ });
569
+ state.setOutputConfigDiff(outputConfigDiff);
570
+ }
571
+ });
572
+ }
573
+ });
574
+ return state.getAllInputTaskReports();
575
+ }
576
+ });
577
+ state.setInputConfigDiff(inputConfigDiff);
578
+
579
+ cleanupCommittedTransaction(config, state);
580
+
581
+ return state.buildExecuteResult();
582
+
583
+ } catch (Throwable ex) {
584
+ if (state.isAllTasksCommitted() && state.isAllTransactionsCommitted()) {
585
+ // ignore the exception
586
+ return state.buildExecuteResultWithWarningException(ex);
587
+ }
588
+ if (!state.isAnyStarted()) {
589
+ throw ex;
590
+ }
591
+ throw state.buildPartialExecuteException(ex, Exec.session());
592
+ }
593
+ }
594
+
595
+ private static void restoreResumedTaskReports(ResumeState resume, LoaderState state)
596
+ {
597
+ int inputTaskCount = resume.getInputTaskReports().size();
598
+ int outputTaskCount = resume.getOutputTaskReports().size();
599
+
600
+ state.initialize(inputTaskCount, outputTaskCount);
601
+
602
+ for (int i=0; i < inputTaskCount; i++) {
603
+ Optional<TaskReport> report = resume.getInputTaskReports().get(i);
604
+ if (report.isPresent()) {
605
+ TaskState task = state.getInputTaskState(i);
606
+ task.start();
607
+ task.setTaskReport(report.get());
608
+ task.finish();
609
+ }
610
+ }
611
+
612
+ for (int i=0; i < outputTaskCount; i++) {
613
+ Optional<TaskReport> report = resume.getOutputTaskReports().get(i);
614
+ if (report.isPresent()) {
615
+ TaskState task = state.getOutputTaskState(i);
616
+ task.start();
617
+ task.setTaskReport(report.get());
618
+ task.finish();
619
+ }
620
+ }
621
+ }
622
+
623
+ private void execute(BulkLoaderTask task, ExecutorPlugin.Executor executor, LoaderState state)
624
+ {
625
+ ProcessTask procTask = state.buildProcessTask();
626
+
627
+ executor.execute(procTask, state);
628
+
629
+ if (!state.isAllTasksCommitted()) {
630
+ throw state.getRepresentativeException();
631
+ }
632
+ }
633
+
634
+ private void cleanupCommittedTransaction(ConfigSource config, LoaderState state)
635
+ {
636
+ try {
637
+ doCleanup(config, state.buildResumeState(Exec.session()));
638
+ } catch (Exception ex) {
639
+ state.getLogger().warn("Commit succeeded but cleanup failed. Ignoring this exception.", ex); // TODO
640
+ }
641
+ }
642
+
643
+ private static Schema first(List<Schema> schemas)
644
+ {
645
+ return schemas.get(0);
646
+ }
647
+
648
+ private static Schema last(List<Schema> schemas)
649
+ {
650
+ return schemas.get(schemas.size() - 1);
651
+ }
652
+ }