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,38 @@
1
+ /*
2
+ * Copyright 2010 Proofpoint, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ /*
17
+ * Copyright 2015 Sadayuki Furuhashi
18
+ */
19
+ package org.embulk.guice;
20
+
21
+ import com.google.common.collect.Maps;
22
+
23
+ import java.util.Map;
24
+
25
+ class LifeCycleMethodsMap
26
+ {
27
+ private final Map<Class<?>, LifeCycleMethods> map = Maps.newHashMap();
28
+
29
+ synchronized LifeCycleMethods get(Class<?> clazz)
30
+ {
31
+ LifeCycleMethods methods = map.get(clazz);
32
+ if (methods == null) {
33
+ methods = new LifeCycleMethods(clazz);
34
+ map.put(clazz, methods);
35
+ }
36
+ return methods;
37
+ }
38
+ }
@@ -0,0 +1,97 @@
1
+ /*
2
+ * Copyright 2010 Proofpoint, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ /*
17
+ * Copyright 2015 Sadayuki Furuhashi
18
+ */
19
+ package org.embulk.guice;
20
+
21
+ import com.google.common.collect.Lists;
22
+ import com.google.inject.Binder;
23
+ import com.google.inject.Module;
24
+ import com.google.inject.Provides;
25
+ import com.google.inject.Singleton;
26
+ import com.google.inject.TypeLiteral;
27
+ import com.google.inject.spi.InjectionListener;
28
+ import com.google.inject.spi.TypeEncounter;
29
+ import com.google.inject.spi.TypeListener;
30
+
31
+ import javax.annotation.PostConstruct;
32
+ import javax.annotation.PreDestroy;
33
+ import java.util.List;
34
+ import java.util.concurrent.atomic.AtomicReference;
35
+
36
+ import static com.google.inject.matcher.Matchers.any;
37
+
38
+ /**
39
+ * Guice module for binding the LifeCycle manager
40
+ */
41
+ public class LifeCycleModule implements Module
42
+ {
43
+ private final List<Object> injectedInstances = Lists.newArrayList();
44
+ private final LifeCycleMethodsMap lifeCycleMethodsMap = new LifeCycleMethodsMap();
45
+ private final AtomicReference<LifeCycleManager> lifeCycleManagerRef = new AtomicReference<LifeCycleManager>(null);
46
+
47
+ @Override
48
+ public void configure(Binder binder)
49
+ {
50
+ binder.disableCircularProxies();
51
+
52
+ binder.bindListener(any(), new TypeListener()
53
+ {
54
+ @Override
55
+ public <T> void hear(TypeLiteral<T> type, TypeEncounter<T> encounter)
56
+ {
57
+ encounter.register(new InjectionListener<T>()
58
+ {
59
+ @Override
60
+ public void afterInjection(T obj)
61
+ {
62
+ if (isLifeCycleClass(obj.getClass())) {
63
+ LifeCycleManager lifeCycleManager = lifeCycleManagerRef.get();
64
+ if (lifeCycleManager != null) {
65
+ try {
66
+ lifeCycleManager.addInstance(obj);
67
+ }
68
+ catch (Exception e) {
69
+ throw new Error(e);
70
+ }
71
+ }
72
+ else {
73
+ injectedInstances.add(obj);
74
+ }
75
+ }
76
+ }
77
+ });
78
+ }
79
+ });
80
+ }
81
+
82
+ @Provides
83
+ @Singleton
84
+ public LifeCycleManager getServerManager()
85
+ throws Exception
86
+ {
87
+ LifeCycleManager lifeCycleManager = new LifeCycleManager(injectedInstances, lifeCycleMethodsMap);
88
+ lifeCycleManagerRef.set(lifeCycleManager);
89
+ return lifeCycleManager;
90
+ }
91
+
92
+ private boolean isLifeCycleClass(Class<?> clazz)
93
+ {
94
+ LifeCycleMethods methods = lifeCycleMethodsMap.get(clazz);
95
+ return methods.hasFor(PostConstruct.class) || methods.hasFor(PreDestroy.class);
96
+ }
97
+ }
@@ -0,0 +1,72 @@
1
+ package org.embulk.jruby;
2
+
3
+ import com.google.inject.Inject;
4
+ import org.jruby.embed.ScriptingContainer;
5
+ import org.jruby.embed.InvokeFailedException;
6
+ import org.embulk.plugin.PluginType;
7
+ import org.embulk.plugin.PluginSource;
8
+ import org.embulk.plugin.PluginSourceNotMatchException;
9
+ import org.embulk.spi.InputPlugin;
10
+ import org.embulk.spi.OutputPlugin;
11
+ import org.embulk.spi.ParserPlugin;
12
+ import org.embulk.spi.FormatterPlugin;
13
+ import org.embulk.spi.DecoderPlugin;
14
+ import org.embulk.spi.EncoderPlugin;
15
+ import org.embulk.spi.FilterPlugin;
16
+ import org.embulk.spi.GuessPlugin;
17
+ import org.embulk.spi.ExecutorPlugin;
18
+
19
+ public class JRubyPluginSource
20
+ implements PluginSource
21
+ {
22
+ private final ScriptingContainer jruby;
23
+ private final Object rubyPluginManager;
24
+
25
+ @Inject
26
+ public JRubyPluginSource(ScriptingContainer jruby)
27
+ {
28
+ this.jruby = jruby;
29
+
30
+ // get Embulk::Plugin
31
+ //this.rubyPluginManager = ((RubyModule) jruby.get("Embulk")).const_get(
32
+ // RubySymbol.newSymbol(
33
+ // jruby.getProvider().getRuntime(), "Plugin"));
34
+ this.rubyPluginManager = jruby.runScriptlet("Embulk::Plugin");
35
+ }
36
+
37
+ public <T> T newPlugin(Class<T> iface, PluginType type) throws PluginSourceNotMatchException
38
+ {
39
+ String name = type.getName();
40
+
41
+ String category;
42
+ if (InputPlugin.class.isAssignableFrom(iface)) {
43
+ category = "input";
44
+ } else if (OutputPlugin.class.isAssignableFrom(iface)) {
45
+ category = "output";
46
+ } else if (ParserPlugin.class.isAssignableFrom(iface)) {
47
+ category = "parser";
48
+ } else if (FormatterPlugin.class.isAssignableFrom(iface)) {
49
+ category = "formatter";
50
+ } else if (DecoderPlugin.class.isAssignableFrom(iface)) {
51
+ category = "decoder";
52
+ } else if (EncoderPlugin.class.isAssignableFrom(iface)) {
53
+ category = "encoder";
54
+ } else if (FilterPlugin.class.isAssignableFrom(iface)) {
55
+ category = "filter";
56
+ } else if (GuessPlugin.class.isAssignableFrom(iface)) {
57
+ category = "guess";
58
+ } else if (ExecutorPlugin.class.isAssignableFrom(iface)) {
59
+ category = "executor";
60
+ } else {
61
+ // unsupported plugin category
62
+ throw new PluginSourceNotMatchException("Plugin interface "+iface+" is not supported in JRuby");
63
+ }
64
+
65
+ String methodName = "new_java_" + category;
66
+ try {
67
+ return jruby.callMethod(rubyPluginManager, methodName, name, iface);
68
+ } catch (InvokeFailedException ex) {
69
+ throw new PluginSourceNotMatchException(ex.getCause());
70
+ }
71
+ }
72
+ }
@@ -0,0 +1,119 @@
1
+ package org.embulk.jruby;
2
+
3
+ import java.util.List;
4
+ import java.util.ArrayList;
5
+ import java.util.Set;
6
+ import org.slf4j.ILoggerFactory;
7
+ import com.google.common.collect.ImmutableSet;
8
+ import com.google.inject.Module;
9
+ import com.google.inject.Binder;
10
+ import com.google.inject.Scopes;
11
+ import com.google.inject.multibindings.Multibinder;
12
+ import com.google.inject.Inject;
13
+ import com.google.inject.Injector;
14
+ import com.google.inject.Key;
15
+ import com.google.inject.spi.Dependency;
16
+ import com.google.inject.spi.ProviderWithDependencies;
17
+ import org.jruby.CompatVersion;
18
+ import org.jruby.embed.LocalContextScope;
19
+ import org.jruby.embed.ScriptingContainer;
20
+ import org.embulk.plugin.PluginSource;
21
+ import org.embulk.config.ConfigSource;
22
+ import org.embulk.config.ModelManager;
23
+ import org.embulk.exec.ForSystemConfig;
24
+ import org.embulk.spi.BufferAllocator;
25
+
26
+ public class JRubyScriptingModule
27
+ implements Module
28
+ {
29
+ public JRubyScriptingModule(ConfigSource systemConfig)
30
+ {
31
+ }
32
+
33
+ @Override
34
+ public void configure(Binder binder)
35
+ {
36
+ binder.bind(ScriptingContainer.class).toProvider(ScriptingContainerProvider.class).in(Scopes.SINGLETON);
37
+
38
+ Multibinder<PluginSource> multibinder = Multibinder.newSetBinder(binder, PluginSource.class);
39
+ multibinder.addBinding().to(JRubyPluginSource.class);
40
+ }
41
+
42
+ private static class ScriptingContainerProvider
43
+ implements ProviderWithDependencies<ScriptingContainer>
44
+ {
45
+ private final Injector injector;
46
+ private final boolean useGlobalRubyRuntime;
47
+
48
+ @Inject
49
+ public ScriptingContainerProvider(Injector injector, @ForSystemConfig ConfigSource systemConfig)
50
+ {
51
+ this.injector = injector;
52
+
53
+ // use_global_ruby_runtime is valid only when it's guaranteed that just one Injector is
54
+ // instantiated in this JVM.
55
+ this.useGlobalRubyRuntime = systemConfig.get(boolean.class, "use_global_ruby_runtime", false);
56
+
57
+ // TODO get jruby-home from systemConfig to call jruby.container.setHomeDirectory
58
+ // TODO get jruby-load-paths from systemConfig to call jruby.container.setLoadPaths
59
+ }
60
+
61
+ public ScriptingContainer get()
62
+ {
63
+ LocalContextScope scope = (useGlobalRubyRuntime ? LocalContextScope.SINGLETON : LocalContextScope.SINGLETHREAD);
64
+ ScriptingContainer jruby = new ScriptingContainer(scope);
65
+ jruby.setCompatVersion(CompatVersion.RUBY1_9);
66
+
67
+ // Search embulk/java/bootstrap.rb from a $LOAD_PATH.
68
+ // $LOAD_PATH is set by lib/embulk/command/embulk_run.rb if Embulk starts
69
+ // using embulk-cli but it's not set if Embulk is embedded in an application.
70
+ // Here adds this jar's internal resources to $LOAD_PATH for those applciations.
71
+
72
+ // List<String> loadPaths = new ArrayList<String>(jruby.getLoadPaths());
73
+ // String coreJarPath = JRubyScriptingModule.class.getProtectionDomain().getCodeSource().getLocation().getPath();
74
+ // if (!loadPaths.contains(coreJarPath)) {
75
+ // loadPaths.add(coreJarPath);
76
+ // }
77
+ // jruby.setLoadPaths(loadPaths);
78
+
79
+ // load embulk.rb
80
+ jruby.runScriptlet("require 'embulk'");
81
+
82
+ // jruby searches embulk/java/bootstrap.rb from the beginning of $LOAD_PATH.
83
+ jruby.runScriptlet("require 'embulk/java/bootstrap'");
84
+
85
+ // TODO validate Embulk::Java::Injected::Injector doesn't exist? If it already exists,
86
+ // Injector is created more than once in this JVM although use_global_ruby_runtime
87
+ // is set to true.
88
+
89
+ // set some constants
90
+ jruby.callMethod(
91
+ jruby.runScriptlet("Embulk::Java::Injected"),
92
+ "const_set", "Injector", injector);
93
+ jruby.callMethod(
94
+ jruby.runScriptlet("Embulk::Java::Injected"),
95
+ "const_set", "ModelManager", injector.getInstance(ModelManager.class));
96
+ jruby.callMethod(
97
+ jruby.runScriptlet("Embulk::Java::Injected"),
98
+ "const_set", "BufferAllocator", injector.getInstance(BufferAllocator.class));
99
+
100
+ // initialize logger
101
+ jruby.callMethod(
102
+ jruby.runScriptlet("Embulk"),
103
+ "logger=",
104
+ jruby.callMethod(
105
+ jruby.runScriptlet("Embulk::Logger"),
106
+ "new", injector.getInstance(ILoggerFactory.class).getLogger("ruby")));
107
+
108
+ return jruby;
109
+ }
110
+
111
+ public Set<Dependency<?>> getDependencies()
112
+ {
113
+ // get() depends on other modules
114
+ return ImmutableSet.of(
115
+ Dependency.get(Key.get(ModelManager.class)),
116
+ Dependency.get(Key.get(BufferAllocator.class)));
117
+ }
118
+ }
119
+ }
@@ -0,0 +1,17 @@
1
+ package org.embulk.plugin;
2
+
3
+ import com.google.inject.Module;
4
+ import com.google.inject.Binder;
5
+ import com.google.inject.multibindings.Multibinder;
6
+
7
+ public class BuiltinPluginSourceModule
8
+ implements Module
9
+ {
10
+ @Override
11
+ public void configure(Binder binder)
12
+ {
13
+ Multibinder<PluginSource> multibinder = Multibinder.newSetBinder(binder, PluginSource.class);
14
+ //multibinder.addBinding().to(LocalDirectoryPluginSource.class); // TODO
15
+ multibinder.addBinding().to(InjectedPluginSource.class);
16
+ }
17
+ }
@@ -0,0 +1,96 @@
1
+ package org.embulk.plugin;
2
+
3
+ import com.google.inject.Binder;
4
+ import com.google.inject.Inject;
5
+ import com.google.inject.Injector;
6
+ import com.google.inject.Key;
7
+ import com.google.inject.name.Names;
8
+ import com.google.inject.name.Named;
9
+ import com.google.common.base.Preconditions;
10
+ import org.embulk.spi.InputPlugin;
11
+ import org.embulk.spi.FileInputPlugin;
12
+ import org.embulk.spi.FileInputRunner;
13
+ import org.embulk.spi.OutputPlugin;
14
+ import org.embulk.spi.FileOutputPlugin;
15
+ import org.embulk.spi.FileOutputRunner;
16
+
17
+ /**
18
+ * InjectedPluginSource loads plugins bound by Guice.
19
+ * This plugin source is intended to be used in test cases.
20
+ * Plugins need to be bound to Binder following:
21
+ *
22
+ * // Module
23
+ * public void configure(Binder binder)
24
+ * {
25
+ * InjectedPluginSource.registerPluginTo(InputPluginclass, "my", MyInputPlugin.class);
26
+ * }
27
+ *
28
+ */
29
+ public class InjectedPluginSource
30
+ implements PluginSource
31
+ {
32
+ private final Injector injector;
33
+
34
+ @Inject
35
+ public InjectedPluginSource(Injector injector)
36
+ {
37
+ this.injector = injector;
38
+ }
39
+
40
+ public static interface PluginFactory <T>
41
+ {
42
+ public T newPlugin(Injector injector);
43
+ }
44
+
45
+ public <T> T newPlugin(Class<T> iface, PluginType type) throws PluginSourceNotMatchException
46
+ {
47
+ String name = type.getName();
48
+ try {
49
+ @SuppressWarnings("unchecked")
50
+ PluginFactory<T> factory = (PluginFactory<T>) injector.getInstance(
51
+ Key.get(PluginFactory.class, pluginFactoryName(iface, name)));
52
+ return factory.newPlugin(injector);
53
+ } catch (com.google.inject.ConfigurationException ex) {
54
+ throw new PluginSourceNotMatchException();
55
+ }
56
+ }
57
+
58
+ public static <T> void registerPluginTo(Binder binder, Class<T> iface, String name, final Class<?> impl)
59
+ {
60
+ PluginFactory<T> factory;
61
+ if (FileInputPlugin.class.isAssignableFrom(impl)) {
62
+ Preconditions.checkArgument(InputPlugin.class.equals(iface));
63
+ factory = new PluginFactory<T>() {
64
+ @SuppressWarnings("unchecked")
65
+ public T newPlugin(Injector injector)
66
+ {
67
+ return (T) new FileInputRunner((FileInputPlugin) injector.getInstance(impl));
68
+ }
69
+ };
70
+ } else if (FileOutputPlugin.class.isAssignableFrom(impl)) {
71
+ Preconditions.checkArgument(OutputPlugin.class.equals(iface));
72
+ factory = new PluginFactory<T>() {
73
+ @SuppressWarnings("unchecked")
74
+ public T newPlugin(Injector injector)
75
+ {
76
+ return (T) new FileOutputRunner((FileOutputPlugin) injector.getInstance(impl));
77
+ }
78
+ };
79
+ } else {
80
+ Preconditions.checkArgument(iface.isAssignableFrom(impl));
81
+ factory = new PluginFactory<T>() {
82
+ @SuppressWarnings("unchecked")
83
+ public T newPlugin(Injector injector)
84
+ {
85
+ return (T) injector.getInstance(impl);
86
+ }
87
+ };
88
+ }
89
+ binder.bind(PluginFactory.class).annotatedWith(pluginFactoryName(iface, name)).toInstance(factory);
90
+ }
91
+
92
+ private static Named pluginFactoryName(Class<?> iface, String name)
93
+ {
94
+ return Names.named(iface.getName() + "." + name);
95
+ }
96
+ }
@@ -0,0 +1,168 @@
1
+ package org.embulk.plugin;
2
+
3
+ import java.util.List;
4
+ import java.util.Collection;
5
+ import java.util.Iterator;
6
+ import java.util.ArrayList;
7
+ import java.util.Enumeration;
8
+ import java.io.IOException;
9
+ import java.nio.file.Path;
10
+ import java.net.URL;
11
+ import java.net.URLClassLoader;
12
+ import java.net.MalformedURLException;
13
+ import com.google.common.base.Function;
14
+ import com.google.common.collect.ImmutableList;
15
+ import com.google.common.collect.Iterables;
16
+ import com.google.common.collect.Iterators;
17
+
18
+ public class PluginClassLoader
19
+ extends URLClassLoader
20
+ {
21
+ private final List<String> parentFirstPackagePrefixes;
22
+ private final List<String> parentFirstResourcePrefixes;
23
+
24
+ public PluginClassLoader(Collection<URL> urls, ClassLoader parent,
25
+ Collection<String> parentFirstPackages,
26
+ Collection<String> parentFirstResources)
27
+ {
28
+ super(urls.toArray(new URL[urls.size()]), parent);
29
+ this.parentFirstPackagePrefixes = ImmutableList.copyOf(
30
+ Iterables.transform(parentFirstPackages, new Function<String, String>() {
31
+ public String apply(String pkg)
32
+ {
33
+ return pkg + ".";
34
+ }
35
+ }));
36
+ this.parentFirstResourcePrefixes = ImmutableList.copyOf(
37
+ Iterables.transform(parentFirstResources, new Function<String, String>() {
38
+ public String apply(String pkg)
39
+ {
40
+ return pkg + "/";
41
+ }
42
+ }));
43
+ }
44
+
45
+ public void addPath(Path path)
46
+ {
47
+ try {
48
+ addUrl(path.toUri().toURL());
49
+ } catch (MalformedURLException ex) {
50
+ throw new IllegalArgumentException(ex);
51
+ }
52
+ }
53
+
54
+ public void addUrl(URL url)
55
+ {
56
+ super.addURL(url);
57
+ }
58
+
59
+ @Override
60
+ protected Class<?> loadClass(String name, boolean resolve)
61
+ throws ClassNotFoundException
62
+ {
63
+ synchronized (getClassLoadingLock(name)) {
64
+ Class<?> loadedClass = findLoadedClass(name);
65
+ if (loadedClass != null) {
66
+ return resolveClass(loadedClass, resolve);
67
+ }
68
+
69
+ boolean parentFirst = isParentFirstPackage(name);
70
+ if (!parentFirst) {
71
+ try {
72
+ return resolveClass(findClass(name), resolve);
73
+ } catch (ClassNotFoundException ignored) {
74
+ }
75
+ }
76
+
77
+ try {
78
+ return resolveClass(getParent().loadClass(name), resolve);
79
+ } catch (ClassNotFoundException ignored) {
80
+ }
81
+
82
+ if (parentFirst) {
83
+ return resolveClass(findClass(name), resolve);
84
+ }
85
+
86
+ throw new ClassNotFoundException(name);
87
+ }
88
+ }
89
+
90
+ private Class<?> resolveClass(Class<?> clazz, boolean resolve)
91
+ {
92
+ if (resolve) {
93
+ resolveClass(clazz);
94
+ }
95
+ return clazz;
96
+ }
97
+
98
+ @Override
99
+ public URL getResource(String name)
100
+ {
101
+ boolean childFirst = isParentFirstPath(name);
102
+
103
+ if (childFirst) {
104
+ URL childUrl = findResource(name);
105
+ if (childUrl != null) {
106
+ return childUrl;
107
+ }
108
+ }
109
+
110
+ URL parentUrl = getParent().getResource(name);
111
+ if (parentUrl != null) {
112
+ return parentUrl;
113
+ }
114
+
115
+ if (!childFirst) {
116
+ URL childUrl = findResource(name);
117
+ if (childUrl != null) {
118
+ return childUrl;
119
+ }
120
+ }
121
+
122
+ return null;
123
+ }
124
+
125
+ @Override
126
+ public Enumeration<URL> getResources(String name)
127
+ throws IOException
128
+ {
129
+ List<Iterator<URL>> resources = new ArrayList<>();
130
+
131
+ boolean parentFirst = isParentFirstPath(name);
132
+
133
+ if (!parentFirst) {
134
+ Iterator<URL> childResources = Iterators.forEnumeration(findResources(name));
135
+ resources.add(childResources);
136
+ }
137
+
138
+ Iterator<URL> parentResources = Iterators.forEnumeration(getParent().getResources(name));
139
+ resources.add(parentResources);
140
+
141
+ if (parentFirst) {
142
+ Iterator<URL> childResources = Iterators.forEnumeration(findResources(name));
143
+ resources.add(childResources);
144
+ }
145
+
146
+ return Iterators.asEnumeration(Iterators.concat(resources.iterator()));
147
+ }
148
+
149
+ private boolean isParentFirstPackage(String name)
150
+ {
151
+ for (String pkg : parentFirstPackagePrefixes) {
152
+ if (name.startsWith(pkg)) {
153
+ return true;
154
+ }
155
+ }
156
+ return false;
157
+ }
158
+
159
+ private boolean isParentFirstPath(String name)
160
+ {
161
+ for (String path : parentFirstResourcePrefixes) {
162
+ if (name.startsWith(path)) {
163
+ return true;
164
+ }
165
+ }
166
+ return false;
167
+ }
168
+ }