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.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.ruby-version +1 -0
- data/.travis.yml +18 -0
- data/COPYING +14 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +31 -0
- data/README.md +206 -0
- data/Rakefile +26 -0
- data/appveyor.yml +20 -0
- data/bin/embulk +106 -0
- data/build.gradle +338 -0
- data/embulk-cli/build.gradle +6 -0
- data/embulk-cli/src/main/java/org/embulk/cli/Main.java +22 -0
- data/embulk-cli/src/main/sh/selfrun.sh +158 -0
- data/embulk-cli/src/test/java/org/embulk/cli/DummyMain.java +23 -0
- data/embulk-cli/src/test/java/org/embulk/cli/SelfrunTest.java +281 -0
- data/embulk-core/build.gradle +59 -0
- data/embulk-core/src/main/java/org/embulk/EmbulkEmbed.java +315 -0
- data/embulk-core/src/main/java/org/embulk/EmbulkService.java +76 -0
- data/embulk-core/src/main/java/org/embulk/command/PreviewPrinter.java +84 -0
- data/embulk-core/src/main/java/org/embulk/command/TablePreviewPrinter.java +107 -0
- data/embulk-core/src/main/java/org/embulk/command/VerticalPreviewPrinter.java +47 -0
- data/embulk-core/src/main/java/org/embulk/config/CommitReport.java +33 -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/ConfigDiff.java +29 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigException.java +20 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigInject.java +14 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigLoader.java +141 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigSource.java +31 -0
- data/embulk-core/src/main/java/org/embulk/config/DataSource.java +39 -0
- data/embulk-core/src/main/java/org/embulk/config/DataSourceImpl.java +231 -0
- data/embulk-core/src/main/java/org/embulk/config/DataSourceSerDe.java +84 -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 +123 -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/TaskReport.java +29 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskSerDe.java +345 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskSource.java +31 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskValidationException.java +38 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskValidator.java +24 -0
- data/embulk-core/src/main/java/org/embulk/exec/BulkLoader.java +652 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExecModule.java +52 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExecutionInterruptedException.java +10 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExecutionResult.java +26 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExtensionServiceLoaderModule.java +43 -0
- data/embulk-core/src/main/java/org/embulk/exec/ForGuess.java +16 -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 +373 -0
- data/embulk-core/src/main/java/org/embulk/exec/LocalExecutorPlugin.java +129 -0
- data/embulk-core/src/main/java/org/embulk/exec/LocalThreadExecutor.java +34 -0
- data/embulk-core/src/main/java/org/embulk/exec/LoggerProvider.java +60 -0
- data/embulk-core/src/main/java/org/embulk/exec/NoSampleException.java +10 -0
- data/embulk-core/src/main/java/org/embulk/exec/PartialExecutionException.java +18 -0
- data/embulk-core/src/main/java/org/embulk/exec/PooledBufferAllocator.java +77 -0
- data/embulk-core/src/main/java/org/embulk/exec/PreviewExecutor.java +183 -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/ResumeState.java +100 -0
- data/embulk-core/src/main/java/org/embulk/exec/SamplingParserPlugin.java +136 -0
- data/embulk-core/src/main/java/org/embulk/exec/SetCurrentThreadName.java +19 -0
- data/embulk-core/src/main/java/org/embulk/exec/SystemConfigModule.java +24 -0
- data/embulk-core/src/main/java/org/embulk/exec/TempFileAllocator.java +35 -0
- data/embulk-core/src/main/java/org/embulk/guice/Bootstrap.java +157 -0
- data/embulk-core/src/main/java/org/embulk/guice/CloseableInjector.java +22 -0
- data/embulk-core/src/main/java/org/embulk/guice/InjectorProxy.java +145 -0
- data/embulk-core/src/main/java/org/embulk/guice/LifeCycleInjector.java +26 -0
- data/embulk-core/src/main/java/org/embulk/guice/LifeCycleInjectorProxy.java +61 -0
- data/embulk-core/src/main/java/org/embulk/guice/LifeCycleManager.java +187 -0
- data/embulk-core/src/main/java/org/embulk/guice/LifeCycleMethods.java +89 -0
- data/embulk-core/src/main/java/org/embulk/guice/LifeCycleMethodsMap.java +38 -0
- data/embulk-core/src/main/java/org/embulk/guice/LifeCycleModule.java +97 -0
- data/embulk-core/src/main/java/org/embulk/jruby/JRubyPluginSource.java +72 -0
- data/embulk-core/src/main/java/org/embulk/jruby/JRubyScriptingModule.java +119 -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 +96 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginClassLoader.java +168 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginClassLoaderFactory.java +9 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginClassLoaderModule.java +71 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginManager.java +78 -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/compat/InputPluginWrapper.java +102 -0
- data/embulk-core/src/main/java/org/embulk/plugin/compat/PluginWrappers.java +30 -0
- data/embulk-core/src/main/java/org/embulk/plugin/compat/TransactionalFileInputWrapper.java +96 -0
- data/embulk-core/src/main/java/org/embulk/plugin/compat/TransactionalFileOutputWrapper.java +102 -0
- data/embulk-core/src/main/java/org/embulk/plugin/compat/TransactionalPageOutputWrapper.java +95 -0
- data/embulk-core/src/main/java/org/embulk/spi/Buffer.java +148 -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 +112 -0
- data/embulk-core/src/main/java/org/embulk/spi/ColumnVisitor.java +14 -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 +113 -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 +217 -0
- data/embulk-core/src/main/java/org/embulk/spi/ExecutorPlugin.java +19 -0
- data/embulk-core/src/main/java/org/embulk/spi/Extension.java +44 -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 +30 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileInputRunner.java +162 -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 +28 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileOutputRunner.java +202 -0
- data/embulk-core/src/main/java/org/embulk/spi/FilterPlugin.java +18 -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 +33 -0
- data/embulk-core/src/main/java/org/embulk/spi/OutputPlugin.java +29 -0
- data/embulk-core/src/main/java/org/embulk/spi/Page.java +51 -0
- data/embulk-core/src/main/java/org/embulk/spi/PageBuilder.java +338 -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 +226 -0
- data/embulk-core/src/main/java/org/embulk/spi/ParserPlugin.java +17 -0
- data/embulk-core/src/main/java/org/embulk/spi/ProcessState.java +10 -0
- data/embulk-core/src/main/java/org/embulk/spi/ProcessTask.java +117 -0
- data/embulk-core/src/main/java/org/embulk/spi/Schema.java +134 -0
- data/embulk-core/src/main/java/org/embulk/spi/SchemaConfig.java +93 -0
- data/embulk-core/src/main/java/org/embulk/spi/SchemaConfigException.java +22 -0
- data/embulk-core/src/main/java/org/embulk/spi/TaskState.java +81 -0
- data/embulk-core/src/main/java/org/embulk/spi/TempFileException.java +19 -0
- data/embulk-core/src/main/java/org/embulk/spi/TempFileSpace.java +87 -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 +55 -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 +100 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormatter.java +97 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParseException.java +10 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParser.java +104 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampSerDe.java +49 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/AbstractType.java +58 -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 +41 -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 +44 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/Types.java +14 -0
- data/embulk-core/src/main/java/org/embulk/spi/unit/ByteSize.java +156 -0
- data/embulk-core/src/main/java/org/embulk/spi/unit/LocalFile.java +106 -0
- data/embulk-core/src/main/java/org/embulk/spi/unit/LocalFileSerDe.java +113 -0
- data/embulk-core/src/main/java/org/embulk/spi/unit/ToString.java +54 -0
- data/embulk-core/src/main/java/org/embulk/spi/unit/ToStringMap.java +34 -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/DynamicColumnNotFoundException.java +10 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/DynamicColumnSetter.java +18 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/DynamicColumnSetterFactory.java +94 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/DynamicPageBuilder.java +161 -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/Executors.java +95 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/FileInputInputStream.java +111 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/FileOutputOutputStream.java +119 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Filters.java +100 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/InputStreamFileInput.java +190 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/InputStreamTransactionalFileInput.java +25 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Inputs.java +65 -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 +123 -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/OutputStreamFileOutput.java +88 -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/main/java/org/embulk/spi/util/ResumableInputStream.java +128 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/RetryExecutor.java +130 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Timestamps.java +53 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/AbstractDynamicColumnSetter.java +79 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/BooleanColumnSetter.java +64 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/DefaultValueSetter.java +18 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/DoubleColumnSetter.java +61 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/LongColumnSetter.java +69 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/NullDefaultValueSetter.java +34 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/SkipColumnSetter.java +52 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/StringColumnSetter.java +56 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/TimestampColumnSetter.java +64 -0
- data/embulk-core/src/main/resources/embulk/logback-color.xml +72 -0
- data/embulk-core/src/main/resources/embulk/logback-console.xml +14 -0
- data/embulk-core/src/main/resources/embulk/logback-file.xml +25 -0
- data/embulk-core/src/main/resources/embulk/parent_first_packages.properties +70 -0
- data/embulk-core/src/main/resources/embulk/parent_first_resources.properties +28 -0
- data/embulk-core/src/test/java/org/embulk/EmbulkTestRuntime.java +114 -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/TestConfigLoader.java +66 -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 +58 -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 +57 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestBuffer.java +24 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestFileInputInputStream.java +89 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestFileInputRunner.java +196 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestFileOutputRunner.java +207 -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 +319 -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 +63 -0
- data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestampFormatterParserDeprecated.java +67 -0
- data/embulk-core/src/test/java/org/embulk/spi/type/TestTypeSerDe.java +45 -0
- data/embulk-core/src/test/java/org/embulk/spi/unit/TestByteSize.java +79 -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-docs/Makefile +178 -0
- data/embulk-docs/build.gradle +32 -0
- data/embulk-docs/make.bat +243 -0
- data/embulk-docs/push-gh-pages.sh +49 -0
- data/embulk-docs/src/_static/embulk-architecture.png +0 -0
- data/embulk-docs/src/_static/embulk-logo.png +0 -0
- data/embulk-docs/src/_static/embulk-logo.svg +133 -0
- data/embulk-docs/src/built-in.rst +440 -0
- data/embulk-docs/src/conf.py +260 -0
- data/embulk-docs/src/customization.rst +184 -0
- data/embulk-docs/src/index.rst +84 -0
- data/embulk-docs/src/recipe.rst +8 -0
- data/embulk-docs/src/recipe/scheduled-csv-load-to-elasticsearch-kibana4.rst +153 -0
- data/embulk-docs/src/release.rst +57 -0
- data/embulk-docs/src/release/release-0.1.0.rst +8 -0
- data/embulk-docs/src/release/release-0.2.0.rst +16 -0
- data/embulk-docs/src/release/release-0.2.1.rst +19 -0
- data/embulk-docs/src/release/release-0.3.0.rst +34 -0
- data/embulk-docs/src/release/release-0.3.1.rst +11 -0
- data/embulk-docs/src/release/release-0.3.2.rst +15 -0
- data/embulk-docs/src/release/release-0.4.0.rst +74 -0
- data/embulk-docs/src/release/release-0.4.1.rst +18 -0
- data/embulk-docs/src/release/release-0.4.10.rst +17 -0
- data/embulk-docs/src/release/release-0.4.2.rst +18 -0
- data/embulk-docs/src/release/release-0.4.3.rst +34 -0
- data/embulk-docs/src/release/release-0.4.4.rst +39 -0
- data/embulk-docs/src/release/release-0.4.5.rst +24 -0
- data/embulk-docs/src/release/release-0.4.6.rst +30 -0
- data/embulk-docs/src/release/release-0.4.7.rst +16 -0
- data/embulk-docs/src/release/release-0.4.8.rst +15 -0
- data/embulk-docs/src/release/release-0.4.9.rst +23 -0
- data/embulk-docs/src/release/release-0.5.0.rst +89 -0
- data/embulk-docs/src/release/release-0.5.1.rst +13 -0
- data/embulk-docs/src/release/release-0.5.2.rst +30 -0
- data/embulk-docs/src/release/release-0.5.3.rst +22 -0
- data/embulk-docs/src/release/release-0.5.4.rst +24 -0
- data/embulk-docs/src/release/release-0.5.5.rst +18 -0
- data/embulk-docs/src/release/release-0.6.0.rst +34 -0
- data/embulk-docs/src/release/release-0.6.1.rst +11 -0
- data/embulk-docs/src/release/release-0.6.10.rst +15 -0
- data/embulk-docs/src/release/release-0.6.11.rst +19 -0
- data/embulk-docs/src/release/release-0.6.12.rst +31 -0
- data/embulk-docs/src/release/release-0.6.13.rst +23 -0
- data/embulk-docs/src/release/release-0.6.14.rst +47 -0
- data/embulk-docs/src/release/release-0.6.15.rst +26 -0
- data/embulk-docs/src/release/release-0.6.16.rst +26 -0
- data/embulk-docs/src/release/release-0.6.17.rst +39 -0
- data/embulk-docs/src/release/release-0.6.18.rst +14 -0
- data/embulk-docs/src/release/release-0.6.19.rst +18 -0
- data/embulk-docs/src/release/release-0.6.2.rst +17 -0
- data/embulk-docs/src/release/release-0.6.20.rst +19 -0
- data/embulk-docs/src/release/release-0.6.21.rst +20 -0
- data/embulk-docs/src/release/release-0.6.22.rst +26 -0
- data/embulk-docs/src/release/release-0.6.23.rst +17 -0
- data/embulk-docs/src/release/release-0.6.24.rst +13 -0
- data/embulk-docs/src/release/release-0.6.25.rst +12 -0
- data/embulk-docs/src/release/release-0.6.3.rst +23 -0
- data/embulk-docs/src/release/release-0.6.4.rst +13 -0
- data/embulk-docs/src/release/release-0.6.5.rst +17 -0
- data/embulk-docs/src/release/release-0.6.6.rst +17 -0
- data/embulk-docs/src/release/release-0.6.7.rst +17 -0
- data/embulk-docs/src/release/release-0.6.8.rst +24 -0
- data/embulk-docs/src/release/release-0.6.9.rst +24 -0
- data/embulk-docs/src/release/release-0.7.0.rst +96 -0
- data/embulk-standards/build.gradle +5 -0
- data/embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java +284 -0
- data/embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java +379 -0
- data/embulk-standards/src/main/java/org/embulk/standards/CsvTokenizer.java +411 -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 +71 -0
- data/embulk-standards/src/main/java/org/embulk/standards/LocalFileInputPlugin.java +203 -0
- data/embulk-standards/src/main/java/org/embulk/standards/LocalFileOutputPlugin.java +148 -0
- data/embulk-standards/src/main/java/org/embulk/standards/NullOutputPlugin.java +59 -0
- data/embulk-standards/src/main/java/org/embulk/standards/RenameFilterPlugin.java +56 -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 +53 -0
- data/embulk-standards/src/main/java/org/embulk/standards/StdoutOutputPlugin.java +85 -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/TestCsvFormatterPlugin.java +312 -0
- data/embulk-standards/src/test/java/org/embulk/standards/TestCsvParserPlugin.java +75 -0
- data/embulk-standards/src/test/java/org/embulk/standards/TestCsvTokenizer.java +360 -0
- data/embulk-standards/src/test/java/org/embulk/standards/TestRenameFilterPlugin.java +88 -0
- data/embulk.gemspec +39 -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 +72 -0
- data/lib/embulk/buffer.rb +22 -0
- data/lib/embulk/column.rb +70 -0
- data/lib/embulk/command/embulk_bundle.rb +56 -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_main.rb +2 -0
- data/lib/embulk/command/embulk_migrate_plugin.rb +170 -0
- data/lib/embulk/command/embulk_new_plugin.rb +124 -0
- data/lib/embulk/command/embulk_run.rb +470 -0
- data/lib/embulk/command/embulk_selfupdate.rb +84 -0
- data/lib/embulk/data/bundle/.bundle/config +3 -0
- data/lib/embulk/data/bundle/.ruby-version +1 -0
- data/lib/embulk/data/bundle/Gemfile +26 -0
- data/lib/embulk/data/bundle/embulk/filter/example.rb +42 -0
- data/lib/embulk/data/bundle/embulk/input/example.rb +54 -0
- data/lib/embulk/data/bundle/embulk/output/example.rb +58 -0
- data/lib/embulk/data/new/LICENSE.txt +21 -0
- data/lib/embulk/data/new/README.md.erb +111 -0
- data/lib/embulk/data/new/gitignore.erb +13 -0
- data/lib/embulk/data/new/java/build.gradle.erb +73 -0
- data/lib/embulk/data/new/java/decoder.java.erb +84 -0
- data/lib/embulk/data/new/java/encoder.java.erb +86 -0
- data/lib/embulk/data/new/java/file_input.java.erb +143 -0
- data/lib/embulk/data/new/java/file_output.java.erb +93 -0
- data/lib/embulk/data/new/java/filter.java.erb +56 -0
- data/lib/embulk/data/new/java/formatter.java.erb +54 -0
- data/lib/embulk/data/new/java/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/lib/embulk/data/new/java/gradle/wrapper/gradle-wrapper.properties +6 -0
- data/lib/embulk/data/new/java/gradlew +164 -0
- data/lib/embulk/data/new/java/gradlew.bat +90 -0
- data/lib/embulk/data/new/java/input.java.erb +87 -0
- data/lib/embulk/data/new/java/output.java.erb +77 -0
- data/lib/embulk/data/new/java/parser.java.erb +60 -0
- data/lib/embulk/data/new/java/plugin_loader.rb.erb +3 -0
- data/lib/embulk/data/new/java/test.java.erb +5 -0
- data/lib/embulk/data/new/ruby/.ruby-version +1 -0
- data/lib/embulk/data/new/ruby/Gemfile +2 -0
- data/lib/embulk/data/new/ruby/Rakefile +3 -0
- data/lib/embulk/data/new/ruby/decoder_guess.rb.erb +25 -0
- data/lib/embulk/data/new/ruby/filter.rb.erb +41 -0
- data/lib/embulk/data/new/ruby/formatter.rb.erb +49 -0
- data/lib/embulk/data/new/ruby/gemspec.erb +20 -0
- data/lib/embulk/data/new/ruby/input.rb.erb +59 -0
- data/lib/embulk/data/new/ruby/output.rb.erb +61 -0
- data/lib/embulk/data/new/ruby/parser.rb.erb +44 -0
- data/lib/embulk/data/new/ruby/parser_guess.rb.erb +65 -0
- data/lib/embulk/data/package_data.rb +50 -0
- data/lib/embulk/data_source.rb +220 -0
- data/lib/embulk/decoder_plugin.rb +27 -0
- data/lib/embulk/encoder_plugin.rb +27 -0
- data/lib/embulk/error.rb +8 -0
- data/lib/embulk/executor_plugin.rb +23 -0
- data/lib/embulk/file_input.rb +87 -0
- data/lib/embulk/file_input_plugin.rb +27 -0
- data/lib/embulk/file_output.rb +56 -0
- data/lib/embulk/file_output_plugin.rb +27 -0
- data/lib/embulk/filter_plugin.rb +105 -0
- data/lib/embulk/formatter_plugin.rb +105 -0
- data/lib/embulk/guess/charset.rb +44 -0
- data/lib/embulk/guess/csv.rb +327 -0
- data/lib/embulk/guess/gzip.rb +18 -0
- data/lib/embulk/guess/newline.rb +22 -0
- data/lib/embulk/guess/schema_guess.rb +118 -0
- data/lib/embulk/guess/time_format_guess.rb +394 -0
- data/lib/embulk/guess_plugin.rb +129 -0
- data/lib/embulk/input_plugin.rb +121 -0
- data/lib/embulk/java/bootstrap.rb +24 -0
- data/lib/embulk/java/imports.rb +69 -0
- data/lib/embulk/java/time_helper.rb +79 -0
- data/lib/embulk/java_plugin.rb +90 -0
- data/lib/embulk/logger.rb +154 -0
- data/lib/embulk/output_plugin.rb +150 -0
- data/lib/embulk/page.rb +30 -0
- data/lib/embulk/page_builder.rb +76 -0
- data/lib/embulk/parser_plugin.rb +78 -0
- data/lib/embulk/plugin.rb +239 -0
- data/lib/embulk/plugin_registry.rb +96 -0
- data/lib/embulk/runner.rb +184 -0
- data/lib/embulk/schema.rb +103 -0
- data/lib/embulk/version.rb +3 -0
- data/settings.gradle +6 -0
- data/test/guess/test_schema_guess.rb +11 -0
- data/test/guess/test_time_format_guess.rb +133 -0
- data/test/helper.rb +21 -0
- data/test/run-test.rb +14 -0
- 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
|
+
}
|