embulk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +13 -0
  3. data/Gemfile +3 -0
  4. data/Gemfile.lock +33 -0
  5. data/README.md +117 -0
  6. data/Rakefile +58 -0
  7. data/bin/embulk +63 -0
  8. data/build.gradle +149 -0
  9. data/embulk-cli/build.gradle +6 -0
  10. data/embulk-cli/pom.xml +94 -0
  11. data/embulk-cli/src/main/java/org/embulk/cli/Main.java +15 -0
  12. data/embulk-core/build.gradle +6 -0
  13. data/embulk-core/pom.xml +143 -0
  14. data/embulk-core/src/main/java/org/embulk/EmbulkService.java +39 -0
  15. data/embulk-core/src/main/java/org/embulk/command/Runner.java +199 -0
  16. data/embulk-core/src/main/java/org/embulk/command/TablePrinter.java +119 -0
  17. data/embulk-core/src/main/java/org/embulk/config/CommitReport.java +26 -0
  18. data/embulk-core/src/main/java/org/embulk/config/Config.java +15 -0
  19. data/embulk-core/src/main/java/org/embulk/config/ConfigDefault.java +15 -0
  20. data/embulk-core/src/main/java/org/embulk/config/ConfigException.java +20 -0
  21. data/embulk-core/src/main/java/org/embulk/config/ConfigLoader.java +83 -0
  22. data/embulk-core/src/main/java/org/embulk/config/ConfigSource.java +28 -0
  23. data/embulk-core/src/main/java/org/embulk/config/DataSource.java +35 -0
  24. data/embulk-core/src/main/java/org/embulk/config/DataSourceImpl.java +208 -0
  25. data/embulk-core/src/main/java/org/embulk/config/DataSourceSerDe.java +80 -0
  26. data/embulk-core/src/main/java/org/embulk/config/GenericTypeReference.java +20 -0
  27. data/embulk-core/src/main/java/org/embulk/config/ModelManager.java +125 -0
  28. data/embulk-core/src/main/java/org/embulk/config/NextConfig.java +26 -0
  29. data/embulk-core/src/main/java/org/embulk/config/Task.java +10 -0
  30. data/embulk-core/src/main/java/org/embulk/config/TaskInvocationHandler.java +180 -0
  31. data/embulk-core/src/main/java/org/embulk/config/TaskSerDe.java +343 -0
  32. data/embulk-core/src/main/java/org/embulk/config/TaskSource.java +28 -0
  33. data/embulk-core/src/main/java/org/embulk/config/TaskValidationException.java +37 -0
  34. data/embulk-core/src/main/java/org/embulk/config/TaskValidator.java +24 -0
  35. data/embulk-core/src/main/java/org/embulk/exec/ExecModule.java +45 -0
  36. data/embulk-core/src/main/java/org/embulk/exec/ExecuteInterruptedException.java +10 -0
  37. data/embulk-core/src/main/java/org/embulk/exec/ExecuteResult.java +19 -0
  38. data/embulk-core/src/main/java/org/embulk/exec/ExtensionServiceLoaderModule.java +43 -0
  39. data/embulk-core/src/main/java/org/embulk/exec/ForSystemConfig.java +16 -0
  40. data/embulk-core/src/main/java/org/embulk/exec/GuessExecutor.java +307 -0
  41. data/embulk-core/src/main/java/org/embulk/exec/LocalExecutor.java +274 -0
  42. data/embulk-core/src/main/java/org/embulk/exec/LoggerProvider.java +30 -0
  43. data/embulk-core/src/main/java/org/embulk/exec/NoSampleException.java +10 -0
  44. data/embulk-core/src/main/java/org/embulk/exec/PooledBufferAllocator.java +58 -0
  45. data/embulk-core/src/main/java/org/embulk/exec/PreviewExecutor.java +138 -0
  46. data/embulk-core/src/main/java/org/embulk/exec/PreviewResult.java +27 -0
  47. data/embulk-core/src/main/java/org/embulk/exec/PreviewedNoticeError.java +17 -0
  48. data/embulk-core/src/main/java/org/embulk/exec/SamplingParserPlugin.java +116 -0
  49. data/embulk-core/src/main/java/org/embulk/exec/SystemConfigModule.java +24 -0
  50. data/embulk-core/src/main/java/org/embulk/jruby/JRubyPluginSource.java +69 -0
  51. data/embulk-core/src/main/java/org/embulk/jruby/JRubyScriptingModule.java +100 -0
  52. data/embulk-core/src/main/java/org/embulk/plugin/BuiltinPluginSourceModule.java +17 -0
  53. data/embulk-core/src/main/java/org/embulk/plugin/InjectedPluginSource.java +92 -0
  54. data/embulk-core/src/main/java/org/embulk/plugin/PluginManager.java +34 -0
  55. data/embulk-core/src/main/java/org/embulk/plugin/PluginSource.java +6 -0
  56. data/embulk-core/src/main/java/org/embulk/plugin/PluginSourceNotMatchException.java +19 -0
  57. data/embulk-core/src/main/java/org/embulk/plugin/PluginType.java +47 -0
  58. data/embulk-core/src/main/java/org/embulk/plugin/SetThreadContextClassLoader.java +19 -0
  59. data/embulk-core/src/main/java/org/embulk/spi/Buffer.java +113 -0
  60. data/embulk-core/src/main/java/org/embulk/spi/BufferAllocator.java +8 -0
  61. data/embulk-core/src/main/java/org/embulk/spi/Column.java +92 -0
  62. data/embulk-core/src/main/java/org/embulk/spi/ColumnConfig.java +79 -0
  63. data/embulk-core/src/main/java/org/embulk/spi/DecoderPlugin.java +16 -0
  64. data/embulk-core/src/main/java/org/embulk/spi/EncoderPlugin.java +16 -0
  65. data/embulk-core/src/main/java/org/embulk/spi/Exec.java +76 -0
  66. data/embulk-core/src/main/java/org/embulk/spi/ExecAction.java +6 -0
  67. data/embulk-core/src/main/java/org/embulk/spi/ExecSession.java +105 -0
  68. data/embulk-core/src/main/java/org/embulk/spi/Extension.java +42 -0
  69. data/embulk-core/src/main/java/org/embulk/spi/FileInput.java +11 -0
  70. data/embulk-core/src/main/java/org/embulk/spi/FileInputPlugin.java +19 -0
  71. data/embulk-core/src/main/java/org/embulk/spi/FileInputRunner.java +113 -0
  72. data/embulk-core/src/main/java/org/embulk/spi/FileOutput.java +13 -0
  73. data/embulk-core/src/main/java/org/embulk/spi/FileOutputPlugin.java +20 -0
  74. data/embulk-core/src/main/java/org/embulk/spi/FileOutputRunner.java +167 -0
  75. data/embulk-core/src/main/java/org/embulk/spi/FormatterPlugin.java +18 -0
  76. data/embulk-core/src/main/java/org/embulk/spi/GuessPlugin.java +9 -0
  77. data/embulk-core/src/main/java/org/embulk/spi/InputPlugin.java +20 -0
  78. data/embulk-core/src/main/java/org/embulk/spi/OutputPlugin.java +21 -0
  79. data/embulk-core/src/main/java/org/embulk/spi/Page.java +45 -0
  80. data/embulk-core/src/main/java/org/embulk/spi/PageBuilder.java +327 -0
  81. data/embulk-core/src/main/java/org/embulk/spi/PageFormat.java +47 -0
  82. data/embulk-core/src/main/java/org/embulk/spi/PageOutput.java +11 -0
  83. data/embulk-core/src/main/java/org/embulk/spi/PageReader.java +227 -0
  84. data/embulk-core/src/main/java/org/embulk/spi/ParserPlugin.java +17 -0
  85. data/embulk-core/src/main/java/org/embulk/spi/Schema.java +101 -0
  86. data/embulk-core/src/main/java/org/embulk/spi/SchemaConfig.java +52 -0
  87. data/embulk-core/src/main/java/org/embulk/spi/SchemaVisitor.java +14 -0
  88. data/embulk-core/src/main/java/org/embulk/spi/Transactional.java +10 -0
  89. data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileInput.java +17 -0
  90. data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileOutput.java +19 -0
  91. data/embulk-core/src/main/java/org/embulk/spi/TransactionalPageOutput.java +17 -0
  92. data/embulk-core/src/main/java/org/embulk/spi/time/DateTimeZoneSerDe.java +57 -0
  93. data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelper.java +8 -0
  94. data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelperFactory.java +6 -0
  95. data/embulk-core/src/main/java/org/embulk/spi/time/Timestamp.java +159 -0
  96. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormat.java +98 -0
  97. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormatter.java +55 -0
  98. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParseException.java +6 -0
  99. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParser.java +60 -0
  100. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampSerDe.java +50 -0
  101. data/embulk-core/src/main/java/org/embulk/spi/type/AbstractType.java +55 -0
  102. data/embulk-core/src/main/java/org/embulk/spi/type/BooleanType.java +12 -0
  103. data/embulk-core/src/main/java/org/embulk/spi/type/DoubleType.java +12 -0
  104. data/embulk-core/src/main/java/org/embulk/spi/type/LongType.java +12 -0
  105. data/embulk-core/src/main/java/org/embulk/spi/type/StringType.java +12 -0
  106. data/embulk-core/src/main/java/org/embulk/spi/type/TimestampType.java +39 -0
  107. data/embulk-core/src/main/java/org/embulk/spi/type/Type.java +15 -0
  108. data/embulk-core/src/main/java/org/embulk/spi/type/TypeDeserializer.java +47 -0
  109. data/embulk-core/src/main/java/org/embulk/spi/type/Types.java +14 -0
  110. data/embulk-core/src/main/java/org/embulk/spi/util/CharsetSerDe.java +55 -0
  111. data/embulk-core/src/main/java/org/embulk/spi/util/Decoders.java +81 -0
  112. data/embulk-core/src/main/java/org/embulk/spi/util/Encoders.java +81 -0
  113. data/embulk-core/src/main/java/org/embulk/spi/util/FileInputInputStream.java +110 -0
  114. data/embulk-core/src/main/java/org/embulk/spi/util/FileOutputOutputStream.java +94 -0
  115. data/embulk-core/src/main/java/org/embulk/spi/util/InputStreamFileInput.java +111 -0
  116. data/embulk-core/src/main/java/org/embulk/spi/util/Inputs.java +74 -0
  117. data/embulk-core/src/main/java/org/embulk/spi/util/LineDecoder.java +118 -0
  118. data/embulk-core/src/main/java/org/embulk/spi/util/LineEncoder.java +109 -0
  119. data/embulk-core/src/main/java/org/embulk/spi/util/ListFileInput.java +52 -0
  120. data/embulk-core/src/main/java/org/embulk/spi/util/Newline.java +38 -0
  121. data/embulk-core/src/main/java/org/embulk/spi/util/PagePrinter.java +102 -0
  122. data/embulk-core/src/main/java/org/embulk/spi/util/Pages.java +139 -0
  123. data/embulk-core/src/test/java/org/embulk/EmbulkTestRuntime.java +110 -0
  124. data/embulk-core/src/test/java/org/embulk/GuiceBinder.java +72 -0
  125. data/embulk-core/src/test/java/org/embulk/RandomManager.java +53 -0
  126. data/embulk-core/src/test/java/org/embulk/TestPluginSourceModule.java +23 -0
  127. data/embulk-core/src/test/java/org/embulk/TestUtilityModule.java +17 -0
  128. data/embulk-core/src/test/java/org/embulk/config/TestConfigSource.java +114 -0
  129. data/embulk-core/src/test/java/org/embulk/config/TestTaskSource.java +70 -0
  130. data/embulk-core/src/test/java/org/embulk/plugin/MockPluginSource.java +57 -0
  131. data/embulk-core/src/test/java/org/embulk/plugin/TestPluginType.java +18 -0
  132. data/embulk-core/src/test/java/org/embulk/spi/MockFileOutput.java +63 -0
  133. data/embulk-core/src/test/java/org/embulk/spi/MockFormatterPlugin.java +101 -0
  134. data/embulk-core/src/test/java/org/embulk/spi/MockParserPlugin.java +73 -0
  135. data/embulk-core/src/test/java/org/embulk/spi/PageTestUtils.java +78 -0
  136. data/embulk-core/src/test/java/org/embulk/spi/TestFileInputInputStream.java +67 -0
  137. data/embulk-core/src/test/java/org/embulk/spi/TestFileInputRunner.java +180 -0
  138. data/embulk-core/src/test/java/org/embulk/spi/TestFileOutputRunner.java +192 -0
  139. data/embulk-core/src/test/java/org/embulk/spi/TestInputStreamFileInput.java +188 -0
  140. data/embulk-core/src/test/java/org/embulk/spi/TestPageBuilderReader.java +301 -0
  141. data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestamp.java +116 -0
  142. data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestampFormatterParser.java +52 -0
  143. data/embulk-core/src/test/java/org/embulk/spi/type/TestTypeSerDe.java +45 -0
  144. data/embulk-core/src/test/java/org/embulk/spi/util/TestLineDecoder.java +132 -0
  145. data/embulk-core/src/test/java/org/embulk/spi/util/TestLineEncoder.java +123 -0
  146. data/embulk-standards/build.gradle +6 -0
  147. data/embulk-standards/pom.xml +68 -0
  148. data/embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java +158 -0
  149. data/embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java +233 -0
  150. data/embulk-standards/src/main/java/org/embulk/standards/CsvTokenizer.java +355 -0
  151. data/embulk-standards/src/main/java/org/embulk/standards/GzipFileDecoderPlugin.java +55 -0
  152. data/embulk-standards/src/main/java/org/embulk/standards/GzipFileEncoderPlugin.java +39 -0
  153. data/embulk-standards/src/main/java/org/embulk/standards/LocalFileInputPlugin.java +138 -0
  154. data/embulk-standards/src/main/java/org/embulk/standards/LocalFileOutputPlugin.java +128 -0
  155. data/embulk-standards/src/main/java/org/embulk/standards/NullOutputPlugin.java +46 -0
  156. data/embulk-standards/src/main/java/org/embulk/standards/S3FileInputPlugin.java +238 -0
  157. data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginExtension.java +16 -0
  158. data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginModule.java +44 -0
  159. data/embulk-standards/src/main/java/org/embulk/standards/StdoutOutputPlugin.java +71 -0
  160. data/embulk-standards/src/main/resources/META-INF/services/org.embulk.spi.Extension +1 -0
  161. data/embulk-standards/src/test/java/org/embulk/standards/TestCsvParserPlugin.java +69 -0
  162. data/embulk-standards/src/test/java/org/embulk/standards/TestCsvTokenizer.java +291 -0
  163. data/embulk-standards/src/test/java/org/embulk/standards/TestS3FileInputPlugin.java +43 -0
  164. data/embulk.gemspec +27 -0
  165. data/examples/config.yml +34 -0
  166. data/examples/csv/sample.csv.gz +0 -0
  167. data/gradle/wrapper/gradle-wrapper.jar +0 -0
  168. data/gradle/wrapper/gradle-wrapper.properties +6 -0
  169. data/gradlew +164 -0
  170. data/gradlew.bat +90 -0
  171. data/lib/embulk.rb +16 -0
  172. data/lib/embulk/buffer.rb +17 -0
  173. data/lib/embulk/column.rb +47 -0
  174. data/lib/embulk/command/embulk.rb +39 -0
  175. data/lib/embulk/command/embulk_example.rb +32 -0
  176. data/lib/embulk/command/embulk_generate_bin.rb +62 -0
  177. data/lib/embulk/command/embulk_run.rb +243 -0
  178. data/lib/embulk/data/bundle/.bundle/config +3 -0
  179. data/lib/embulk/data/bundle/Gemfile +31 -0
  180. data/lib/embulk/data/bundle/Gemfile.lock +8 -0
  181. data/lib/embulk/data/bundle/embulk/input_example.rb +40 -0
  182. data/lib/embulk/data/bundle/embulk/output_example.rb +51 -0
  183. data/lib/embulk/data_source.rb +66 -0
  184. data/lib/embulk/error.rb +5 -0
  185. data/lib/embulk/guess_charset.rb +26 -0
  186. data/lib/embulk/guess_csv.rb +195 -0
  187. data/lib/embulk/guess_gzip.rb +18 -0
  188. data/lib/embulk/guess_newline.rb +20 -0
  189. data/lib/embulk/guess_plugin.rb +113 -0
  190. data/lib/embulk/input_plugin.rb +53 -0
  191. data/lib/embulk/java/bootstrap.rb +12 -0
  192. data/lib/embulk/java/imports.rb +26 -0
  193. data/lib/embulk/java/time_helper.rb +77 -0
  194. data/lib/embulk/output_plugin.rb +104 -0
  195. data/lib/embulk/page.rb +28 -0
  196. data/lib/embulk/page_builder.rb +22 -0
  197. data/lib/embulk/plugin.rb +152 -0
  198. data/lib/embulk/plugin_registry.rb +70 -0
  199. data/lib/embulk/schema.rb +85 -0
  200. data/lib/embulk/time_format_guess.rb +331 -0
  201. data/lib/embulk/version.rb +3 -0
  202. data/pom.xml +533 -0
  203. data/settings.gradle +5 -0
  204. metadata +370 -0
@@ -0,0 +1,53 @@
1
+ module Embulk
2
+
3
+ require 'embulk/data_source'
4
+ require 'embulk/schema'
5
+ require 'embulk/page_builder'
6
+
7
+ class InputPlugin
8
+ def self.transaction(config, &control)
9
+ raise NotImplementedError, "InputPlugin.transaction(config, &control) must be implemented"
10
+ end
11
+
12
+ def self.run(task, schema, index, page_builder)
13
+ raise NotImplementedError, "InputPlugin#run(task, schema, index, page_builder) must be implemented"
14
+ end
15
+
16
+ if Embulk.java?
17
+ def self.java_object
18
+ JavaAdapter.new(self)
19
+ end
20
+
21
+ class JavaAdapter
22
+ include Java::InputPlugin
23
+
24
+ def initialize(ruby_class)
25
+ @ruby_class = ruby_class
26
+ end
27
+
28
+ def transaction(java_config, java_control)
29
+ config = DataSource.from_java_object(java_config)
30
+ next_config_hash = @ruby_class.transaction(config) do |task_source_hash,columns,processor_count|
31
+ java_task_source = DataSource.from_ruby_hash(task_source_hash).java_object
32
+ java_schema = Schema.new(columns).java_object
33
+ java_commit_reports = java_control.run(java_task_source, java_schema, processor_count)
34
+ java_commit_reports.map {|java_commit_report|
35
+ DataSource.from_java_object(java_commit_report)
36
+ }
37
+ end
38
+ # TODO check return type of #transaction
39
+ return DataSource.from_ruby_hash(next_config_hash).java_object
40
+ end
41
+
42
+ def run(java_task_source, java_schema, processor_index, java_output)
43
+ task_source = DataSource.from_java_object(java_task_source)
44
+ schema = Schema.from_java_object(java_schema)
45
+ page_builder = PageBuilder.new(schema, java_output)
46
+ commit_report_hash = @ruby_class.run(task_source, schema, processor_index, page_builder)
47
+ return DataSource.from_ruby_hash(commit_report_hash).java_object
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ end
@@ -0,0 +1,12 @@
1
+ module Embulk
2
+ module Java
3
+ require 'embulk/java/imports'
4
+ require 'embulk/java/time_helper'
5
+
6
+ module Injected
7
+ # Following constats are set by org.embulk.jruby.JRubyScriptingModule:
8
+ # ModelManager
9
+ # BufferAllocator
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,26 @@
1
+ require 'java'
2
+
3
+ #
4
+ # this file is loaded by embulk/java/bootstrap.rb
5
+ #
6
+
7
+ module Embulk::Java
8
+ java_import 'org.embulk.spi.Buffer'
9
+
10
+ java_import 'org.embulk.config.DataSourceImpl'
11
+ java_import 'org.embulk.spi.time.Timestamp'
12
+ java_import 'org.embulk.spi.GuessPlugin'
13
+ java_import 'org.embulk.spi.OutputPlugin'
14
+ java_import 'org.embulk.spi.InputPlugin'
15
+ java_import 'org.embulk.spi.TransactionalPageOutput'
16
+ java_import 'org.embulk.spi.PageReader'
17
+ java_import 'org.embulk.spi.PageBuilder'
18
+ java_import 'org.embulk.spi.util.LineDecoder'
19
+ java_import 'org.embulk.spi.util.ListFileInput'
20
+ java_import 'org.embulk.spi.Schema'
21
+ java_import 'org.embulk.spi.Column'
22
+ java_import 'org.embulk.spi.type.Type'
23
+ java_import 'org.embulk.spi.type.Types'
24
+
25
+ # TODO
26
+ end
@@ -0,0 +1,77 @@
1
+ module Embulk
2
+ module Java
3
+ #require 'embulk/java/imports'
4
+ require 'time' # Date._strptime
5
+
6
+ class TimeParserHelper
7
+ #include Java::JRubyTimeParserHelper
8
+ include org.embulk.spi.time.JRubyTimeParserHelper
9
+
10
+ class Factory
11
+ #include Java::JRubyTimeParserHelperFactory
12
+ include org.embulk.spi.time.JRubyTimeParserHelperFactory
13
+
14
+ def newInstance(format_string, year, mon, day, hour, min, sec, usec)
15
+ default_time = Time.utc(year, mon, day, hour, min, sec, usec)
16
+ TimeParserHelper.new(format_string, default_time)
17
+ end
18
+ end
19
+
20
+ def initialize(format_string, default_time)
21
+ @format_string = format_string
22
+ @default_time = default_time
23
+ end
24
+
25
+ # Override
26
+ def strptime(text)
27
+ hash = Date._strptime(text, @format_string)
28
+ unless hash
29
+ raise Java::TimestampParseException.new
30
+ end
31
+
32
+ if seconds = hash[:seconds]
33
+ return seconds * 1_000_000
34
+
35
+ else
36
+ year = hash[:year]
37
+ mon = hash[:mon]
38
+ day = hash[:mday]
39
+ hour = hash[:hour]
40
+ min = hash[:min]
41
+ sec = hash[:sec]
42
+ sec_fraction = hash[:sec_fraction]
43
+ zone = hash[:zone]
44
+ usec = hash[:sec_fraction] ? hash[:sec_fraction] * 1000000 : nil
45
+
46
+ now = @default_time
47
+ begin
48
+ break if year; year = now.year
49
+ break if mon; mon = now.mon
50
+ break if day; day = now.day
51
+ break if hour; hour = now.hour
52
+ break if min; min = now.min
53
+ break if sec; sec = now.sec
54
+ break if sec_fraction; usec = now.tv_usec
55
+ end until true
56
+
57
+ year ||= 1970
58
+ mon ||= 1
59
+ day ||= 1
60
+ hour ||= 0
61
+ min ||= 0
62
+ sec ||= 0
63
+ usec ||= 0
64
+
65
+ @zone = zone
66
+ time = Time.utc(year, mon, day, hour, min, sec, usec)
67
+ return time.tv_sec * 1000 + time.tv_usec / 1000
68
+ end
69
+ end
70
+
71
+ # Override
72
+ def getZone
73
+ @zone
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,104 @@
1
+ module Embulk
2
+
3
+ require 'embulk/data_source'
4
+ require 'embulk/schema'
5
+ require 'embulk/page'
6
+
7
+ class OutputPlugin
8
+ def self.transaction(config, schema, processor_count, &control)
9
+ yield(config)
10
+ return {}
11
+ end
12
+
13
+ def initialize(task, schema, index)
14
+ @task = task
15
+ @schema = schema
16
+ @index = index
17
+ end
18
+
19
+ attr_reader :task, :schema, :index
20
+
21
+ def add(page)
22
+ raise NotImplementedError, "OutputPlugin#add(page) must be implemented"
23
+ end
24
+
25
+ def finish
26
+ end
27
+
28
+ def close
29
+ end
30
+
31
+ def abort
32
+ end
33
+
34
+ def commit
35
+ {}
36
+ end
37
+
38
+ if Embulk.java?
39
+ def self.java_object
40
+ JavaAdapter.new(self)
41
+ end
42
+
43
+ class JavaAdapter
44
+ include Java::OutputPlugin
45
+
46
+ def initialize(ruby_class)
47
+ @ruby_class = ruby_class
48
+ end
49
+
50
+ def transaction(java_config, java_schema, processor_count, java_control)
51
+ config = DataSource.from_java_object(java_config)
52
+ schema = Schema.from_java_object(java_schema)
53
+ next_config_hash = @ruby_class.transaction(config, schema, processor_count) do |task_source_hash|
54
+ java_task_source = DataSource.from_ruby_hash(task_source_hash).java_object
55
+ java_commit_reports = java_control.run(java_task_source)
56
+ java_commit_reports.map {|java_commit_report|
57
+ DataSource.from_java_object(java_commit_report)
58
+ }
59
+ end
60
+ # TODO check return type of #transaction
61
+ return DataSource.from_ruby_hash(next_config_hash).java_object
62
+ end
63
+
64
+ def open(java_task_source, java_schema, processor_index)
65
+ task_source = DataSource.from_java_object(java_task_source)
66
+ schema = Schema.from_java_object(java_schema)
67
+ ruby_object = @ruby_class.new(task_source, schema, processor_index)
68
+ return OutputAdapter.new(ruby_object, schema)
69
+ end
70
+
71
+ class OutputAdapter
72
+ include Java::TransactionalPageOutput
73
+
74
+ def initialize(ruby_object, schema)
75
+ @ruby_object = ruby_object
76
+ @schema = schema
77
+ end
78
+
79
+ def add(java_page)
80
+ @ruby_object.add Page.new(java_page, @schema)
81
+ end
82
+
83
+ def finish
84
+ @ruby_object.finish
85
+ end
86
+
87
+ def close
88
+ @ruby_object.close
89
+ end
90
+
91
+ def abort
92
+ @ruby_object.abort
93
+ end
94
+
95
+ def commit
96
+ commit_report_hash = @ruby_object.commit
97
+ return DataSource.from_ruby_hash(commit_report_hash).java_object
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
103
+
104
+ end
@@ -0,0 +1,28 @@
1
+
2
+ module Embulk
3
+
4
+ # TODO pure-ruby page reader
5
+
6
+ class Page
7
+ def initialize(java_page, schema)
8
+ @java_page = java_page
9
+ @schema = schema
10
+ end
11
+
12
+ attr_reader :schema
13
+
14
+ def each
15
+ schema = @schema
16
+ reader = Java::PageReader.new(schema.java_object)
17
+ begin
18
+ reader.setPage(@java_page)
19
+ while reader.nextRecord
20
+ yield schema.read_record(reader)
21
+ end
22
+ ensure
23
+ reader.close
24
+ end
25
+ end
26
+ end
27
+
28
+ end
@@ -0,0 +1,22 @@
1
+ module Embulk
2
+
3
+ class PageBuilder
4
+ def initialize(schema, java_page_output)
5
+ @page_builder = Java::PageBuilder.new(Java::Injected::BufferAllocator, schema.java_object, java_page_output)
6
+ @schema = schema
7
+ end
8
+
9
+ def add(record)
10
+ @schema.write_record(@page_builder, record)
11
+ end
12
+
13
+ def finish
14
+ @page_builder.finish
15
+ end
16
+
17
+ def close
18
+ @page_builder.close
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,152 @@
1
+
2
+ module Embulk
3
+ require 'forwardable'
4
+ require 'embulk/error'
5
+ require 'embulk/plugin_registry'
6
+ require 'embulk/input_plugin'
7
+ require 'embulk/output_plugin'
8
+ #require 'embulk/parser_plugin'
9
+ #require 'embulk/formatter_plugin'
10
+ #require 'embulk/decoder_plugin'
11
+ #require 'embulk/encoder_plugin'
12
+ require 'embulk/guess_plugin'
13
+
14
+ class PluginManager
15
+ def initialize
16
+ @registries = {}
17
+ %w[input output parser formatter decoder encoder line_filter guess].each do |category|
18
+ @registries[category.to_sym] = PluginRegistry.new(category, "embulk/#{category}_")
19
+ end
20
+ end
21
+
22
+ def register_input(type, klass)
23
+ register_plugin(:input, type, klass, InputPlugin)
24
+ end
25
+
26
+ def register_output(type, klass)
27
+ register_plugin(:output, type, klass, OutputPlugin,
28
+ "Output plugin #{klass} must extend OutputPlugin")
29
+ end
30
+
31
+ def register_parser(type, klass)
32
+ register_plugin(:parser, type, klass, ParserPlugin)
33
+ end
34
+
35
+ def register_formatter(type, klass)
36
+ register_plugin(:formatter, type, klass, FormatterPlugin)
37
+ end
38
+
39
+ def register_decoder(type, klass)
40
+ register_plugin(:decoder, type, klass, DecoderPlugin)
41
+ end
42
+
43
+ def register_encoder(type, klass)
44
+ register_plugin(:encoder, type, klass, EncoderPlugin)
45
+ end
46
+
47
+ def register_guess(type, klass)
48
+ register_plugin(:guess, type, klass, GuessPlugin,
49
+ "Guess plugin #{klass} must extend GuessPlugin, LineGuessPlugin, or TextGuessPlugin class")
50
+ end
51
+
52
+ def get_input(type)
53
+ # TODO not implemented yet
54
+ lookup(:guess, type)
55
+ end
56
+
57
+ def get_output(type)
58
+ # TODO not implemented yet
59
+ lookup(:guess, type)
60
+ end
61
+
62
+ def get_parser(type)
63
+ # TODO not implemented yet
64
+ lookup(:guess, type)
65
+ end
66
+
67
+ def get_formatter(type)
68
+ # TODO not implemented yet
69
+ lookup(:guess, type)
70
+ end
71
+
72
+ def get_decoder(type)
73
+ # TODO not implemented yet
74
+ lookup(:guess, type)
75
+ end
76
+
77
+ def get_encoder(type)
78
+ # TODO not implemented yet
79
+ lookup(:guess, type)
80
+ end
81
+
82
+ def get_guess(type)
83
+ # TODO not implemented yet
84
+ lookup(:guess, type)
85
+ end
86
+
87
+ def new_java_input(type)
88
+ lookup(:input, type).java_object
89
+ end
90
+
91
+ def new_java_output(type)
92
+ lookup(:output, type).java_object
93
+ end
94
+
95
+ def new_java_parser(type)
96
+ lookup(:parser, type).java_object
97
+ end
98
+
99
+ def new_java_formatter(type)
100
+ lookup(:formatter, type).java_object
101
+ end
102
+
103
+ def new_java_decoder(type)
104
+ lookup(:decoder, type).java_object
105
+ end
106
+
107
+ def new_java_encoder(type)
108
+ lookup(:encoder, type).java_object
109
+ end
110
+
111
+ def new_java_guess(type)
112
+ lookup(:guess, type).java_object
113
+ end
114
+
115
+ private
116
+
117
+ # TODO lookup should fallback to Java PluginSource
118
+ # if not found so that ruby plugins can call java plugins.
119
+ # call injector.newPlugin and wrap the instance in a reverse bridge object.
120
+
121
+ def lookup(category, type)
122
+ @registries[category].lookup(type)
123
+ end
124
+
125
+ def register_plugin(category, type, klass, iface, message=nil)
126
+ unless klass < iface
127
+ message ||= "Plugin #{klass} must implement #{iface}"
128
+ raise message
129
+ end
130
+ @registries[category].register(type, klass)
131
+ end
132
+ end
133
+
134
+ Plugin = PluginManager.new
135
+
136
+ #module Plugin
137
+ # class <<self
138
+ # INSTANCE = PluginManager.new
139
+ #
140
+ # extend Forwardable
141
+ #
142
+ # def_delegators 'INSTANCE',
143
+ # :register_input, :new_input, :new_java_input,
144
+ # :register_output, :new_output, :new_java_output,
145
+ # :register_parser, :new_parser, :new_java_parser,
146
+ # :register_formatter, :new_formatter, :new_java_formatter,
147
+ # :register_decoder, :new_decoder, :new_java_decoder,
148
+ # :register_encoder, :new_encoder, :new_java_encoder,
149
+ # :register_guess, :new_guess, :new_java_guess
150
+ # end
151
+ #end
152
+ end