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,100 @@
1
+ package org.embulk.jruby;
2
+
3
+ import java.util.List;
4
+ import java.util.ArrayList;
5
+ import java.util.Set;
6
+ import java.io.File;
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.Provider;
12
+ import com.google.inject.multibindings.Multibinder;
13
+ import com.google.inject.Inject;
14
+ import com.google.inject.Injector;
15
+ import com.google.inject.Key;
16
+ import com.google.inject.spi.Dependency;
17
+ import com.google.inject.spi.ProviderWithDependencies;
18
+ import org.jruby.CompatVersion;
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.spi.BufferAllocator;
24
+
25
+ public class JRubyScriptingModule
26
+ implements Module
27
+ {
28
+ public JRubyScriptingModule(ConfigSource systemConfig)
29
+ {
30
+ // TODO get jruby-home from systemConfig to call jruby.container.setHomeDirectory
31
+ // TODO get jruby-load-paths from systemConfig to call jruby.container.setLoadPaths
32
+ }
33
+
34
+ @Override
35
+ public void configure(Binder binder)
36
+ {
37
+ binder.bind(ScriptingContainer.class).toProvider(ScriptingContainerProvider.class).in(Scopes.SINGLETON);
38
+ //binder.bind(JRubyModule.class).in(Scopes.SINGLETON);
39
+
40
+ Multibinder<PluginSource> multibinder = Multibinder.newSetBinder(binder, PluginSource.class);
41
+ multibinder.addBinding().to(JRubyPluginSource.class);
42
+ }
43
+
44
+ private static class ScriptingContainerProvider
45
+ implements ProviderWithDependencies<ScriptingContainer>
46
+ {
47
+ private final Injector injector;
48
+
49
+ @Inject
50
+ public ScriptingContainerProvider(Injector injector)
51
+ {
52
+ this.injector = injector;
53
+ }
54
+
55
+ public ScriptingContainer get()
56
+ {
57
+ ScriptingContainer jruby = new ScriptingContainer();
58
+ jruby.setCompatVersion(CompatVersion.RUBY1_9);
59
+
60
+ // Search embulk/java/bootstrap.rb from a $LOAD_PATH.
61
+ // $LOAD_PATH is set by lib/embulk/command/embulk.rb if Embulk starts
62
+ // using embulk-cli but it's not set if Embulk is embedded in an application.
63
+ // Here adds this jar's internal resources to $LOAD_PATH for those applciations.
64
+
65
+ List<String> loadPaths = new ArrayList<String>(jruby.getLoadPaths());
66
+ String coreJarPath = JRubyScriptingModule.class.getProtectionDomain().getCodeSource().getLocation().getPath();
67
+ if (!loadPaths.contains(coreJarPath)) {
68
+ loadPaths.add(coreJarPath);
69
+ }
70
+ jruby.setLoadPaths(loadPaths);
71
+
72
+ // jruby searches embulk/java/bootstrap.rb from the beginning of $LOAD_PATH.
73
+ jruby.runScriptlet("require 'embulk/java/bootstrap'");
74
+
75
+ // set some constants
76
+ jruby.callMethod(
77
+ jruby.runScriptlet("Embulk::Java"),
78
+ "const_set", "Injector", injector);
79
+ jruby.callMethod(
80
+ jruby.runScriptlet("Embulk::Java::Injected"),
81
+ "const_set", "ModelManager", injector.getInstance(ModelManager.class));
82
+ jruby.callMethod(
83
+ jruby.runScriptlet("Embulk::Java::Injected"),
84
+ "const_set", "BufferAllocator", injector.getInstance(BufferAllocator.class));
85
+
86
+ // load embulk.rb
87
+ jruby.runScriptlet("require 'embulk'");
88
+
89
+ return jruby;
90
+ }
91
+
92
+ public Set<Dependency<?>> getDependencies()
93
+ {
94
+ // get() depends on other modules
95
+ return ImmutableSet.of(
96
+ Dependency.get(Key.get(ModelManager.class)),
97
+ Dependency.get(Key.get(BufferAllocator.class)));
98
+ }
99
+ }
100
+ }
@@ -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,92 @@
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
+ PluginFactory<T> factory = (PluginFactory<T>) injector.getInstance(
50
+ Key.get(PluginFactory.class, pluginFactoryName(iface, name)));
51
+ return factory.newPlugin(injector);
52
+ } catch (com.google.inject.ConfigurationException ex) {
53
+ throw new PluginSourceNotMatchException();
54
+ }
55
+ }
56
+
57
+ public static <T> void registerPluginTo(Binder binder, Class<T> iface, String name, final Class<?> impl)
58
+ {
59
+ PluginFactory<T> factory;
60
+ if (FileInputPlugin.class.isAssignableFrom(impl)) {
61
+ Preconditions.checkArgument(InputPlugin.class.equals(iface));
62
+ factory = new PluginFactory<T>() {
63
+ public T newPlugin(Injector injector)
64
+ {
65
+ return (T) new FileInputRunner((FileInputPlugin) injector.getInstance(impl));
66
+ }
67
+ };
68
+ } else if (FileOutputPlugin.class.isAssignableFrom(impl)) {
69
+ Preconditions.checkArgument(OutputPlugin.class.equals(iface));
70
+ factory = new PluginFactory<T>() {
71
+ public T newPlugin(Injector injector)
72
+ {
73
+ return (T) new FileOutputRunner((FileOutputPlugin) injector.getInstance(impl));
74
+ }
75
+ };
76
+ } else {
77
+ Preconditions.checkArgument(iface.isAssignableFrom(impl));
78
+ factory = new PluginFactory<T>() {
79
+ public T newPlugin(Injector injector)
80
+ {
81
+ return (T) injector.getInstance(impl);
82
+ }
83
+ };
84
+ }
85
+ binder.bind(PluginFactory.class).annotatedWith(pluginFactoryName(iface, name)).toInstance(factory);
86
+ }
87
+
88
+ private static Named pluginFactoryName(Class<?> iface, String name)
89
+ {
90
+ return Names.named(iface.getName() + "." + name);
91
+ }
92
+ }
@@ -0,0 +1,34 @@
1
+ package org.embulk.plugin;
2
+
3
+ import java.util.Set;
4
+ import java.util.List;
5
+ import com.google.common.collect.ImmutableList;
6
+ import com.google.inject.Inject;
7
+ import com.google.inject.Injector;
8
+ import org.embulk.config.ConfigException;
9
+
10
+ public class PluginManager
11
+ {
12
+ private final List<PluginSource> sources;
13
+ private final Injector injector;
14
+
15
+ // Set<PluginSource> is injected BuiltinPluginSourceModule or extensions
16
+ // using Multibinder<PluginSource>.
17
+ @Inject
18
+ public PluginManager(Set<PluginSource> pluginSources, Injector injector)
19
+ {
20
+ this.sources = ImmutableList.copyOf(pluginSources);
21
+ this.injector = injector;
22
+ }
23
+
24
+ public <T> T newPlugin(Class<T> iface, PluginType type)
25
+ {
26
+ for (PluginSource source : sources) {
27
+ try {
28
+ return source.newPlugin(iface, type);
29
+ } catch (PluginSourceNotMatchException e) {
30
+ }
31
+ }
32
+ throw new ConfigException("Plugin not found"); // TODO exception message should include type in original format
33
+ }
34
+ }
@@ -0,0 +1,6 @@
1
+ package org.embulk.plugin;
2
+
3
+ public interface PluginSource
4
+ {
5
+ public <T> T newPlugin(Class<T> iface, PluginType type) throws PluginSourceNotMatchException;
6
+ }
@@ -0,0 +1,19 @@
1
+ package org.embulk.plugin;
2
+
3
+ public class PluginSourceNotMatchException
4
+ extends Exception
5
+ {
6
+ public PluginSourceNotMatchException()
7
+ {
8
+ }
9
+
10
+ public PluginSourceNotMatchException(String message)
11
+ {
12
+ super(message);
13
+ }
14
+
15
+ public PluginSourceNotMatchException(Throwable cause)
16
+ {
17
+ super(cause);
18
+ }
19
+ }
@@ -0,0 +1,47 @@
1
+ package org.embulk.plugin;
2
+
3
+ import com.fasterxml.jackson.annotation.JsonCreator;
4
+ import com.fasterxml.jackson.annotation.JsonValue;
5
+
6
+ public class PluginType
7
+ {
8
+ private final String name;
9
+
10
+ // TODO accept isObject()/ObjectNode for complex PluginSource
11
+ @JsonCreator
12
+ public PluginType(String name)
13
+ {
14
+ if (name == null) {
15
+ throw new NullPointerException("name must not be null");
16
+ }
17
+ this.name = name;
18
+ }
19
+
20
+ @JsonValue
21
+ public String getName()
22
+ {
23
+ return name;
24
+ }
25
+
26
+ @Override
27
+ public int hashCode()
28
+ {
29
+ return name.hashCode();
30
+ }
31
+
32
+ @Override
33
+ public boolean equals(Object other)
34
+ {
35
+ if (!(other instanceof PluginType)) {
36
+ return false;
37
+ }
38
+ PluginType o = (PluginType) other;
39
+ return name.equals(o.name);
40
+ }
41
+
42
+ @Override
43
+ public String toString()
44
+ {
45
+ return name;
46
+ }
47
+ }
@@ -0,0 +1,19 @@
1
+ package org.embulk.plugin;
2
+
3
+ public class SetThreadContextClassLoader
4
+ implements AutoCloseable
5
+ {
6
+ private final ClassLoader original;
7
+
8
+ public SetThreadContextClassLoader(ClassLoader classLoader)
9
+ {
10
+ this.original = Thread.currentThread().getContextClassLoader();
11
+ Thread.currentThread().setContextClassLoader(classLoader);
12
+ }
13
+
14
+ @Override
15
+ public void close()
16
+ {
17
+ Thread.currentThread().setContextClassLoader(original);
18
+ }
19
+ }
@@ -0,0 +1,113 @@
1
+ package org.embulk.spi;
2
+
3
+ import java.util.Arrays;
4
+
5
+ public class Buffer
6
+ {
7
+ public static final Buffer EMPTY = Buffer.allocate(0);
8
+
9
+ private byte[] array;
10
+ private int offset;
11
+ private int filled;
12
+ private final int capacity;
13
+
14
+ protected Buffer(byte[] wrap, int offset, int capacity)
15
+ {
16
+ this.array = wrap;
17
+ this.offset = offset;
18
+ this.capacity = capacity;
19
+ this.filled = offset;
20
+ if (array.length < offset + capacity) {
21
+ // TODO
22
+ throw new IllegalStateException("capacity out of bound");
23
+ }
24
+ }
25
+
26
+ public static Buffer allocate(int length)
27
+ {
28
+ return new Buffer(new byte[length], 0, length);
29
+ }
30
+
31
+ public static Buffer copyOf(byte[] src)
32
+ {
33
+ return copyOf(src, 0, src.length);
34
+ }
35
+
36
+ public static Buffer copyOf(byte[] src, int index, int length)
37
+ {
38
+ return wrap(Arrays.copyOfRange(src, index, length));
39
+ }
40
+
41
+ public static Buffer wrap(byte[] src)
42
+ {
43
+ return wrap(src, 0, src.length);
44
+ }
45
+
46
+ public static Buffer wrap(byte[] src, int offset, int size)
47
+ {
48
+ return new Buffer(src, offset, size).limit(size);
49
+ }
50
+
51
+ public byte[] array()
52
+ {
53
+ return array;
54
+ }
55
+
56
+ public int offset()
57
+ {
58
+ return offset;
59
+ }
60
+
61
+ public Buffer offset(int offset)
62
+ {
63
+ this.offset = offset;
64
+ return this;
65
+ }
66
+
67
+ public int limit()
68
+ {
69
+ return filled - offset;
70
+ }
71
+
72
+ public Buffer limit(int limit)
73
+ {
74
+ if (capacity < limit) {
75
+ // TODO
76
+ throw new IllegalStateException("limit index out of bound: capacity="+capacity+" limit="+limit);
77
+ }
78
+ this.filled = offset + limit;
79
+ return this;
80
+ }
81
+
82
+ public int capacity()
83
+ {
84
+ return capacity;
85
+ }
86
+
87
+ public void setBytes(int index, byte[] source, int sourceIndex, int length)
88
+ {
89
+ System.arraycopy(source, sourceIndex, array, offset + index, length);
90
+ }
91
+
92
+ public void setBytes(int index, Buffer source, int sourceIndex, int length)
93
+ {
94
+ setBytes(index, source.array(), source.offset() + sourceIndex, length);
95
+ }
96
+
97
+ public void getBytes(int index, byte[] dest, int destIndex, int length)
98
+ {
99
+ System.arraycopy(array, offset + index, dest, destIndex, length);
100
+ }
101
+
102
+ public void getBytes(int index, Buffer dest, int destIndex, int length)
103
+ {
104
+ getBytes(index, dest.array(), dest.offset() + destIndex, length);
105
+ }
106
+
107
+ public void release()
108
+ {
109
+ }
110
+
111
+ // TODO equals
112
+ // TODO hashCode
113
+ }