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.
- checksums.yaml +15 -0
- data/.gitignore +13 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +33 -0
- data/README.md +117 -0
- data/Rakefile +58 -0
- data/bin/embulk +63 -0
- data/build.gradle +149 -0
- data/embulk-cli/build.gradle +6 -0
- data/embulk-cli/pom.xml +94 -0
- data/embulk-cli/src/main/java/org/embulk/cli/Main.java +15 -0
- data/embulk-core/build.gradle +6 -0
- data/embulk-core/pom.xml +143 -0
- data/embulk-core/src/main/java/org/embulk/EmbulkService.java +39 -0
- data/embulk-core/src/main/java/org/embulk/command/Runner.java +199 -0
- data/embulk-core/src/main/java/org/embulk/command/TablePrinter.java +119 -0
- data/embulk-core/src/main/java/org/embulk/config/CommitReport.java +26 -0
- data/embulk-core/src/main/java/org/embulk/config/Config.java +15 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigDefault.java +15 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigException.java +20 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigLoader.java +83 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigSource.java +28 -0
- data/embulk-core/src/main/java/org/embulk/config/DataSource.java +35 -0
- data/embulk-core/src/main/java/org/embulk/config/DataSourceImpl.java +208 -0
- data/embulk-core/src/main/java/org/embulk/config/DataSourceSerDe.java +80 -0
- data/embulk-core/src/main/java/org/embulk/config/GenericTypeReference.java +20 -0
- data/embulk-core/src/main/java/org/embulk/config/ModelManager.java +125 -0
- data/embulk-core/src/main/java/org/embulk/config/NextConfig.java +26 -0
- data/embulk-core/src/main/java/org/embulk/config/Task.java +10 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskInvocationHandler.java +180 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskSerDe.java +343 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskSource.java +28 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskValidationException.java +37 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskValidator.java +24 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExecModule.java +45 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExecuteInterruptedException.java +10 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExecuteResult.java +19 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExtensionServiceLoaderModule.java +43 -0
- data/embulk-core/src/main/java/org/embulk/exec/ForSystemConfig.java +16 -0
- data/embulk-core/src/main/java/org/embulk/exec/GuessExecutor.java +307 -0
- data/embulk-core/src/main/java/org/embulk/exec/LocalExecutor.java +274 -0
- data/embulk-core/src/main/java/org/embulk/exec/LoggerProvider.java +30 -0
- data/embulk-core/src/main/java/org/embulk/exec/NoSampleException.java +10 -0
- data/embulk-core/src/main/java/org/embulk/exec/PooledBufferAllocator.java +58 -0
- data/embulk-core/src/main/java/org/embulk/exec/PreviewExecutor.java +138 -0
- data/embulk-core/src/main/java/org/embulk/exec/PreviewResult.java +27 -0
- data/embulk-core/src/main/java/org/embulk/exec/PreviewedNoticeError.java +17 -0
- data/embulk-core/src/main/java/org/embulk/exec/SamplingParserPlugin.java +116 -0
- data/embulk-core/src/main/java/org/embulk/exec/SystemConfigModule.java +24 -0
- data/embulk-core/src/main/java/org/embulk/jruby/JRubyPluginSource.java +69 -0
- data/embulk-core/src/main/java/org/embulk/jruby/JRubyScriptingModule.java +100 -0
- data/embulk-core/src/main/java/org/embulk/plugin/BuiltinPluginSourceModule.java +17 -0
- data/embulk-core/src/main/java/org/embulk/plugin/InjectedPluginSource.java +92 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginManager.java +34 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginSource.java +6 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginSourceNotMatchException.java +19 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginType.java +47 -0
- data/embulk-core/src/main/java/org/embulk/plugin/SetThreadContextClassLoader.java +19 -0
- data/embulk-core/src/main/java/org/embulk/spi/Buffer.java +113 -0
- data/embulk-core/src/main/java/org/embulk/spi/BufferAllocator.java +8 -0
- data/embulk-core/src/main/java/org/embulk/spi/Column.java +92 -0
- data/embulk-core/src/main/java/org/embulk/spi/ColumnConfig.java +79 -0
- data/embulk-core/src/main/java/org/embulk/spi/DecoderPlugin.java +16 -0
- data/embulk-core/src/main/java/org/embulk/spi/EncoderPlugin.java +16 -0
- data/embulk-core/src/main/java/org/embulk/spi/Exec.java +76 -0
- data/embulk-core/src/main/java/org/embulk/spi/ExecAction.java +6 -0
- data/embulk-core/src/main/java/org/embulk/spi/ExecSession.java +105 -0
- data/embulk-core/src/main/java/org/embulk/spi/Extension.java +42 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileInput.java +11 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileInputPlugin.java +19 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileInputRunner.java +113 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileOutput.java +13 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileOutputPlugin.java +20 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileOutputRunner.java +167 -0
- data/embulk-core/src/main/java/org/embulk/spi/FormatterPlugin.java +18 -0
- data/embulk-core/src/main/java/org/embulk/spi/GuessPlugin.java +9 -0
- data/embulk-core/src/main/java/org/embulk/spi/InputPlugin.java +20 -0
- data/embulk-core/src/main/java/org/embulk/spi/OutputPlugin.java +21 -0
- data/embulk-core/src/main/java/org/embulk/spi/Page.java +45 -0
- data/embulk-core/src/main/java/org/embulk/spi/PageBuilder.java +327 -0
- data/embulk-core/src/main/java/org/embulk/spi/PageFormat.java +47 -0
- data/embulk-core/src/main/java/org/embulk/spi/PageOutput.java +11 -0
- data/embulk-core/src/main/java/org/embulk/spi/PageReader.java +227 -0
- data/embulk-core/src/main/java/org/embulk/spi/ParserPlugin.java +17 -0
- data/embulk-core/src/main/java/org/embulk/spi/Schema.java +101 -0
- data/embulk-core/src/main/java/org/embulk/spi/SchemaConfig.java +52 -0
- data/embulk-core/src/main/java/org/embulk/spi/SchemaVisitor.java +14 -0
- data/embulk-core/src/main/java/org/embulk/spi/Transactional.java +10 -0
- data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileInput.java +17 -0
- data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileOutput.java +19 -0
- data/embulk-core/src/main/java/org/embulk/spi/TransactionalPageOutput.java +17 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/DateTimeZoneSerDe.java +57 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelper.java +8 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelperFactory.java +6 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/Timestamp.java +159 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormat.java +98 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormatter.java +55 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParseException.java +6 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParser.java +60 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampSerDe.java +50 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/AbstractType.java +55 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/BooleanType.java +12 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/DoubleType.java +12 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/LongType.java +12 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/StringType.java +12 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/TimestampType.java +39 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/Type.java +15 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/TypeDeserializer.java +47 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/Types.java +14 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/CharsetSerDe.java +55 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Decoders.java +81 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Encoders.java +81 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/FileInputInputStream.java +110 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/FileOutputOutputStream.java +94 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/InputStreamFileInput.java +111 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Inputs.java +74 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/LineDecoder.java +118 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/LineEncoder.java +109 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/ListFileInput.java +52 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Newline.java +38 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/PagePrinter.java +102 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Pages.java +139 -0
- data/embulk-core/src/test/java/org/embulk/EmbulkTestRuntime.java +110 -0
- data/embulk-core/src/test/java/org/embulk/GuiceBinder.java +72 -0
- data/embulk-core/src/test/java/org/embulk/RandomManager.java +53 -0
- data/embulk-core/src/test/java/org/embulk/TestPluginSourceModule.java +23 -0
- data/embulk-core/src/test/java/org/embulk/TestUtilityModule.java +17 -0
- data/embulk-core/src/test/java/org/embulk/config/TestConfigSource.java +114 -0
- data/embulk-core/src/test/java/org/embulk/config/TestTaskSource.java +70 -0
- data/embulk-core/src/test/java/org/embulk/plugin/MockPluginSource.java +57 -0
- data/embulk-core/src/test/java/org/embulk/plugin/TestPluginType.java +18 -0
- data/embulk-core/src/test/java/org/embulk/spi/MockFileOutput.java +63 -0
- data/embulk-core/src/test/java/org/embulk/spi/MockFormatterPlugin.java +101 -0
- data/embulk-core/src/test/java/org/embulk/spi/MockParserPlugin.java +73 -0
- data/embulk-core/src/test/java/org/embulk/spi/PageTestUtils.java +78 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestFileInputInputStream.java +67 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestFileInputRunner.java +180 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestFileOutputRunner.java +192 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestInputStreamFileInput.java +188 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestPageBuilderReader.java +301 -0
- data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestamp.java +116 -0
- data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestampFormatterParser.java +52 -0
- data/embulk-core/src/test/java/org/embulk/spi/type/TestTypeSerDe.java +45 -0
- data/embulk-core/src/test/java/org/embulk/spi/util/TestLineDecoder.java +132 -0
- data/embulk-core/src/test/java/org/embulk/spi/util/TestLineEncoder.java +123 -0
- data/embulk-standards/build.gradle +6 -0
- data/embulk-standards/pom.xml +68 -0
- data/embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java +158 -0
- data/embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java +233 -0
- data/embulk-standards/src/main/java/org/embulk/standards/CsvTokenizer.java +355 -0
- data/embulk-standards/src/main/java/org/embulk/standards/GzipFileDecoderPlugin.java +55 -0
- data/embulk-standards/src/main/java/org/embulk/standards/GzipFileEncoderPlugin.java +39 -0
- data/embulk-standards/src/main/java/org/embulk/standards/LocalFileInputPlugin.java +138 -0
- data/embulk-standards/src/main/java/org/embulk/standards/LocalFileOutputPlugin.java +128 -0
- data/embulk-standards/src/main/java/org/embulk/standards/NullOutputPlugin.java +46 -0
- data/embulk-standards/src/main/java/org/embulk/standards/S3FileInputPlugin.java +238 -0
- data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginExtension.java +16 -0
- data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginModule.java +44 -0
- data/embulk-standards/src/main/java/org/embulk/standards/StdoutOutputPlugin.java +71 -0
- data/embulk-standards/src/main/resources/META-INF/services/org.embulk.spi.Extension +1 -0
- data/embulk-standards/src/test/java/org/embulk/standards/TestCsvParserPlugin.java +69 -0
- data/embulk-standards/src/test/java/org/embulk/standards/TestCsvTokenizer.java +291 -0
- data/embulk-standards/src/test/java/org/embulk/standards/TestS3FileInputPlugin.java +43 -0
- data/embulk.gemspec +27 -0
- data/examples/config.yml +34 -0
- data/examples/csv/sample.csv.gz +0 -0
- data/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/gradle/wrapper/gradle-wrapper.properties +6 -0
- data/gradlew +164 -0
- data/gradlew.bat +90 -0
- data/lib/embulk.rb +16 -0
- data/lib/embulk/buffer.rb +17 -0
- data/lib/embulk/column.rb +47 -0
- data/lib/embulk/command/embulk.rb +39 -0
- data/lib/embulk/command/embulk_example.rb +32 -0
- data/lib/embulk/command/embulk_generate_bin.rb +62 -0
- data/lib/embulk/command/embulk_run.rb +243 -0
- data/lib/embulk/data/bundle/.bundle/config +3 -0
- data/lib/embulk/data/bundle/Gemfile +31 -0
- data/lib/embulk/data/bundle/Gemfile.lock +8 -0
- data/lib/embulk/data/bundle/embulk/input_example.rb +40 -0
- data/lib/embulk/data/bundle/embulk/output_example.rb +51 -0
- data/lib/embulk/data_source.rb +66 -0
- data/lib/embulk/error.rb +5 -0
- data/lib/embulk/guess_charset.rb +26 -0
- data/lib/embulk/guess_csv.rb +195 -0
- data/lib/embulk/guess_gzip.rb +18 -0
- data/lib/embulk/guess_newline.rb +20 -0
- data/lib/embulk/guess_plugin.rb +113 -0
- data/lib/embulk/input_plugin.rb +53 -0
- data/lib/embulk/java/bootstrap.rb +12 -0
- data/lib/embulk/java/imports.rb +26 -0
- data/lib/embulk/java/time_helper.rb +77 -0
- data/lib/embulk/output_plugin.rb +104 -0
- data/lib/embulk/page.rb +28 -0
- data/lib/embulk/page_builder.rb +22 -0
- data/lib/embulk/plugin.rb +152 -0
- data/lib/embulk/plugin_registry.rb +70 -0
- data/lib/embulk/schema.rb +85 -0
- data/lib/embulk/time_format_guess.rb +331 -0
- data/lib/embulk/version.rb +3 -0
- data/pom.xml +533 -0
- data/settings.gradle +5 -0
- 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,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
|
+
}
|