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,31 @@
|
|
|
1
|
+
package org.embulk.config;
|
|
2
|
+
|
|
3
|
+
public interface TaskSource
|
|
4
|
+
extends DataSource
|
|
5
|
+
{
|
|
6
|
+
<T> T loadTask(Class<T> taskType);
|
|
7
|
+
|
|
8
|
+
@Override
|
|
9
|
+
TaskSource getNested(String attrName);
|
|
10
|
+
|
|
11
|
+
@Override
|
|
12
|
+
TaskSource getNestedOrSetEmpty(String attrName);
|
|
13
|
+
|
|
14
|
+
@Override
|
|
15
|
+
TaskSource set(String attrName, Object v);
|
|
16
|
+
|
|
17
|
+
@Override
|
|
18
|
+
TaskSource setNested(String attrName, DataSource v);
|
|
19
|
+
|
|
20
|
+
@Override
|
|
21
|
+
TaskSource setAll(DataSource other);
|
|
22
|
+
|
|
23
|
+
@Override
|
|
24
|
+
TaskSource remove(String attrName);
|
|
25
|
+
|
|
26
|
+
@Override
|
|
27
|
+
TaskSource deepCopy();
|
|
28
|
+
|
|
29
|
+
@Override
|
|
30
|
+
TaskSource merge(DataSource other);
|
|
31
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
package org.embulk.config;
|
|
2
|
+
|
|
3
|
+
import java.util.Set;
|
|
4
|
+
import javax.validation.ConstraintViolation;
|
|
5
|
+
|
|
6
|
+
public class TaskValidationException
|
|
7
|
+
extends RuntimeException
|
|
8
|
+
{
|
|
9
|
+
@SuppressWarnings("unchecked")
|
|
10
|
+
private final Set violations;
|
|
11
|
+
|
|
12
|
+
public <T> TaskValidationException(Set<ConstraintViolation<T>> violations)
|
|
13
|
+
{
|
|
14
|
+
super(formatMessage(violations));
|
|
15
|
+
this.violations = violations;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@SuppressWarnings("unchecked")
|
|
19
|
+
public Set<ConstraintViolation<?>> getViolations()
|
|
20
|
+
{
|
|
21
|
+
return violations;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
private static <T> String formatMessage(Set<ConstraintViolation<T>> violations)
|
|
25
|
+
{
|
|
26
|
+
StringBuilder sb = new StringBuilder();
|
|
27
|
+
sb.append("Configuration task validation failed.");
|
|
28
|
+
for(ConstraintViolation<T> violation : violations) {
|
|
29
|
+
sb.append(" ");
|
|
30
|
+
sb.append(violation.getPropertyPath());
|
|
31
|
+
sb.append(" ");
|
|
32
|
+
sb.append(violation.getMessage());
|
|
33
|
+
sb.append(" but got ");
|
|
34
|
+
sb.append(violation.getInvalidValue());
|
|
35
|
+
}
|
|
36
|
+
return sb.toString();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
package org.embulk.config;
|
|
2
|
+
|
|
3
|
+
import java.util.Set;
|
|
4
|
+
import javax.validation.Validator;
|
|
5
|
+
import javax.validation.ConstraintViolation;
|
|
6
|
+
|
|
7
|
+
public class TaskValidator
|
|
8
|
+
{
|
|
9
|
+
private final Validator validator;
|
|
10
|
+
|
|
11
|
+
public TaskValidator(Validator validator)
|
|
12
|
+
{
|
|
13
|
+
this.validator = validator;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public <T> void validateModel(T model) throws TaskValidationException
|
|
17
|
+
{
|
|
18
|
+
Set<ConstraintViolation<T>> violations = validator.validate(model);
|
|
19
|
+
if (!violations.isEmpty()) {
|
|
20
|
+
throw new TaskValidationException(violations);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
@@ -0,0 +1,652 @@
|
|
|
1
|
+
package org.embulk.exec;
|
|
2
|
+
|
|
3
|
+
import java.util.List;
|
|
4
|
+
import java.util.concurrent.ExecutionException;
|
|
5
|
+
import com.google.common.base.Optional;
|
|
6
|
+
import com.google.common.collect.ImmutableList;
|
|
7
|
+
import com.google.inject.Inject;
|
|
8
|
+
import com.google.inject.Injector;
|
|
9
|
+
import com.google.common.base.Throwables;
|
|
10
|
+
import org.embulk.config.Task;
|
|
11
|
+
import org.embulk.config.Config;
|
|
12
|
+
import org.embulk.config.ConfigDefault;
|
|
13
|
+
import org.embulk.config.ConfigSource;
|
|
14
|
+
import org.embulk.config.ConfigException;
|
|
15
|
+
import org.embulk.config.TaskSource;
|
|
16
|
+
import org.embulk.config.ConfigDiff;
|
|
17
|
+
import org.embulk.config.TaskReport;
|
|
18
|
+
import org.embulk.plugin.PluginType;
|
|
19
|
+
import org.embulk.spi.Schema;
|
|
20
|
+
import org.embulk.spi.Exec;
|
|
21
|
+
import org.embulk.spi.ExecSession;
|
|
22
|
+
import org.embulk.spi.ExecAction;
|
|
23
|
+
import org.embulk.spi.ExecutorPlugin;
|
|
24
|
+
import org.embulk.spi.ProcessTask;
|
|
25
|
+
import org.embulk.spi.ProcessState;
|
|
26
|
+
import org.embulk.spi.TaskState;
|
|
27
|
+
import org.embulk.spi.InputPlugin;
|
|
28
|
+
import org.embulk.spi.FilterPlugin;
|
|
29
|
+
import org.embulk.spi.OutputPlugin;
|
|
30
|
+
import org.embulk.spi.util.Filters;
|
|
31
|
+
import org.slf4j.Logger;
|
|
32
|
+
|
|
33
|
+
public class BulkLoader
|
|
34
|
+
{
|
|
35
|
+
private final Injector injector;
|
|
36
|
+
|
|
37
|
+
public interface BulkLoaderTask
|
|
38
|
+
extends Task
|
|
39
|
+
{
|
|
40
|
+
@Config("exec")
|
|
41
|
+
@ConfigDefault("{}")
|
|
42
|
+
public ConfigSource getExecConfig();
|
|
43
|
+
|
|
44
|
+
@Config("in")
|
|
45
|
+
public ConfigSource getInputConfig();
|
|
46
|
+
|
|
47
|
+
@Config("filters")
|
|
48
|
+
@ConfigDefault("[]")
|
|
49
|
+
public List<ConfigSource> getFilterConfigs();
|
|
50
|
+
|
|
51
|
+
@Config("out")
|
|
52
|
+
public ConfigSource getOutputConfig();
|
|
53
|
+
|
|
54
|
+
public TaskSource getOutputTask();
|
|
55
|
+
public void setOutputTask(TaskSource taskSource);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
@Inject
|
|
59
|
+
public BulkLoader(Injector injector,
|
|
60
|
+
@ForSystemConfig ConfigSource systemConfig)
|
|
61
|
+
{
|
|
62
|
+
this.injector = injector;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
private static class LoaderState
|
|
66
|
+
implements ProcessState
|
|
67
|
+
{
|
|
68
|
+
private final Logger logger;
|
|
69
|
+
|
|
70
|
+
private final ProcessPluginSet plugins;
|
|
71
|
+
|
|
72
|
+
private volatile TaskSource inputTaskSource;
|
|
73
|
+
private volatile TaskSource outputTaskSource;
|
|
74
|
+
private volatile List<TaskSource> filterTaskSources;
|
|
75
|
+
private volatile List<Schema> schemas;
|
|
76
|
+
private volatile Schema executorSchema;
|
|
77
|
+
|
|
78
|
+
private volatile ConfigDiff inputConfigDiff;
|
|
79
|
+
private volatile ConfigDiff outputConfigDiff;
|
|
80
|
+
|
|
81
|
+
private volatile List<TaskState> inputTaskStates;
|
|
82
|
+
private volatile List<TaskState> outputTaskStates;
|
|
83
|
+
|
|
84
|
+
public LoaderState(Logger logger, ProcessPluginSet plugins)
|
|
85
|
+
{
|
|
86
|
+
this.logger = logger;
|
|
87
|
+
this.plugins = plugins;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
public Logger getLogger()
|
|
91
|
+
{
|
|
92
|
+
return logger;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
public void setSchemas(List<Schema> schemas)
|
|
96
|
+
{
|
|
97
|
+
this.schemas = schemas;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
public void setExecutorSchema(Schema executorSchema)
|
|
101
|
+
{
|
|
102
|
+
this.executorSchema = executorSchema;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
public void setInputTaskSource(TaskSource inputTaskSource)
|
|
106
|
+
{
|
|
107
|
+
this.inputTaskSource = inputTaskSource;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
public void setOutputTaskSource(TaskSource outputTaskSource)
|
|
111
|
+
{
|
|
112
|
+
this.outputTaskSource = outputTaskSource;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
public void setFilterTaskSources(List<TaskSource> filterTaskSources)
|
|
116
|
+
{
|
|
117
|
+
this.filterTaskSources = filterTaskSources;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
public ProcessTask buildProcessTask()
|
|
121
|
+
{
|
|
122
|
+
return new ProcessTask(
|
|
123
|
+
plugins.getInputPluginType(), plugins.getOutputPluginType(), plugins.getFilterPluginTypes(),
|
|
124
|
+
inputTaskSource, outputTaskSource, filterTaskSources,
|
|
125
|
+
schemas, executorSchema, Exec.newTaskSource());
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
@Override
|
|
129
|
+
public void initialize(int inputTaskCount, int outputTaskCount)
|
|
130
|
+
{
|
|
131
|
+
if (inputTaskStates != null || outputTaskStates != null) {
|
|
132
|
+
// initialize is called twice if resume (by restoreResumedTaskReports and ExecutorPlugin.execute)
|
|
133
|
+
if (inputTaskStates.size() != inputTaskCount || outputTaskStates.size() != outputTaskCount) {
|
|
134
|
+
throw new ConfigException(String.format(
|
|
135
|
+
"input task count and output task (%d and %d) must be same with the first execution (%d and %d) whenre resumed",
|
|
136
|
+
inputTaskCount, outputTaskCount, inputTaskStates.size(), outputTaskStates.size()));
|
|
137
|
+
}
|
|
138
|
+
} else {
|
|
139
|
+
ImmutableList.Builder<TaskState> inputTaskStates = ImmutableList.builder();
|
|
140
|
+
ImmutableList.Builder<TaskState> outputTaskStates = ImmutableList.builder();
|
|
141
|
+
for (int i=0; i < inputTaskCount; i++) {
|
|
142
|
+
inputTaskStates.add(new TaskState());
|
|
143
|
+
}
|
|
144
|
+
for (int i=0; i < outputTaskCount; i++) {
|
|
145
|
+
outputTaskStates.add(new TaskState());
|
|
146
|
+
}
|
|
147
|
+
this.inputTaskStates = inputTaskStates.build();
|
|
148
|
+
this.outputTaskStates = outputTaskStates.build();
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
@Override
|
|
153
|
+
public TaskState getInputTaskState(int inputTaskIndex)
|
|
154
|
+
{
|
|
155
|
+
return inputTaskStates.get(inputTaskIndex);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
@Override
|
|
159
|
+
public TaskState getOutputTaskState(int outputTaskIndex)
|
|
160
|
+
{
|
|
161
|
+
return outputTaskStates.get(outputTaskIndex);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
public boolean isAllTasksCommitted()
|
|
165
|
+
{
|
|
166
|
+
if (outputTaskStates == null) {
|
|
167
|
+
// not initialized
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
for (TaskState outputTaskState : outputTaskStates) {
|
|
171
|
+
if (!outputTaskState.isCommitted()) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
public boolean isAllTransactionsCommitted()
|
|
179
|
+
{
|
|
180
|
+
return inputConfigDiff != null && outputConfigDiff != null;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
public boolean isAnyStarted()
|
|
184
|
+
{
|
|
185
|
+
if (inputTaskStates == null) {
|
|
186
|
+
// not initialized
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
for (TaskState inputTaskState : inputTaskStates) {
|
|
190
|
+
if (inputTaskState.isStarted()) {
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
public void setOutputConfigDiff(ConfigDiff outputConfigDiff)
|
|
198
|
+
{
|
|
199
|
+
if (outputConfigDiff == null) {
|
|
200
|
+
outputConfigDiff = Exec.newConfigDiff();
|
|
201
|
+
}
|
|
202
|
+
this.outputConfigDiff = outputConfigDiff;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
public void setInputConfigDiff(ConfigDiff inputConfigDiff)
|
|
206
|
+
{
|
|
207
|
+
if (inputConfigDiff == null) {
|
|
208
|
+
inputConfigDiff = Exec.newConfigDiff();
|
|
209
|
+
}
|
|
210
|
+
this.inputConfigDiff = inputConfigDiff;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
private List<Optional<TaskReport>> getInputTaskReports()
|
|
214
|
+
{
|
|
215
|
+
ImmutableList.Builder<Optional<TaskReport>> builder = ImmutableList.builder();
|
|
216
|
+
for (TaskState inputTaskState : inputTaskStates) {
|
|
217
|
+
builder.add(inputTaskState.getTaskReport());
|
|
218
|
+
}
|
|
219
|
+
return builder.build();
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
private List<Optional<TaskReport>> getOutputTaskReports()
|
|
223
|
+
{
|
|
224
|
+
ImmutableList.Builder<Optional<TaskReport>> builder = ImmutableList.builder();
|
|
225
|
+
for (TaskState outputTaskState : outputTaskStates) {
|
|
226
|
+
builder.add(outputTaskState.getTaskReport());
|
|
227
|
+
}
|
|
228
|
+
return builder.build();
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
public List<TaskReport> getAllInputTaskReports()
|
|
232
|
+
{
|
|
233
|
+
ImmutableList.Builder<TaskReport> builder = ImmutableList.builder();
|
|
234
|
+
for (TaskState inputTaskState : inputTaskStates) {
|
|
235
|
+
builder.add(inputTaskState.getTaskReport().get());
|
|
236
|
+
}
|
|
237
|
+
return builder.build();
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
public List<TaskReport> getAllOutputTaskReports()
|
|
241
|
+
{
|
|
242
|
+
ImmutableList.Builder<TaskReport> builder = ImmutableList.builder();
|
|
243
|
+
for (TaskState outputTaskState : outputTaskStates) {
|
|
244
|
+
builder.add(outputTaskState.getTaskReport().get());
|
|
245
|
+
}
|
|
246
|
+
return builder.build();
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
public List<Throwable> getExceptions()
|
|
250
|
+
{
|
|
251
|
+
ImmutableList.Builder<Throwable> builder = ImmutableList.builder();
|
|
252
|
+
if (inputTaskStates != null) { // null if not initialized yet
|
|
253
|
+
for (TaskState inputTaskState : inputTaskStates) {
|
|
254
|
+
Optional<Throwable> exception = inputTaskState.getException();
|
|
255
|
+
if (exception.isPresent()) {
|
|
256
|
+
builder.add(exception.get());
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
if (outputTaskStates != null) { // null if not initialized yet
|
|
261
|
+
for (TaskState outputTaskState : outputTaskStates) {
|
|
262
|
+
Optional<Throwable> exception = outputTaskState.getException();
|
|
263
|
+
if (exception.isPresent()) {
|
|
264
|
+
builder.add(exception.get());
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return builder.build();
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
public RuntimeException getRepresentativeException()
|
|
272
|
+
{
|
|
273
|
+
RuntimeException top = null;
|
|
274
|
+
for (Throwable ex : getExceptions()) {
|
|
275
|
+
if (top != null) {
|
|
276
|
+
top.addSuppressed(ex);
|
|
277
|
+
} else {
|
|
278
|
+
if (ex instanceof RuntimeException) {
|
|
279
|
+
top = (RuntimeException) ex;
|
|
280
|
+
} else {
|
|
281
|
+
top = new RuntimeException(ex);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
if (top == null) {
|
|
286
|
+
top = new RuntimeException("Some transactions are not committed");
|
|
287
|
+
}
|
|
288
|
+
return top;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
public ExecutionResult buildExecuteResult()
|
|
292
|
+
{
|
|
293
|
+
return buildExecuteResultWithWarningException(null);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
public ExecutionResult buildExecuteResultWithWarningException(Throwable ex)
|
|
297
|
+
{
|
|
298
|
+
ConfigDiff configDiff = Exec.newConfigDiff();
|
|
299
|
+
if (inputConfigDiff != null) {
|
|
300
|
+
configDiff.getNestedOrSetEmpty("in").merge(inputConfigDiff);
|
|
301
|
+
}
|
|
302
|
+
if (outputConfigDiff != null) {
|
|
303
|
+
configDiff.getNestedOrSetEmpty("out").merge(outputConfigDiff);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
ImmutableList.Builder<Throwable> ignoredExceptions = ImmutableList.builder();
|
|
307
|
+
for (Throwable e : getExceptions()) {
|
|
308
|
+
ignoredExceptions.add(e);
|
|
309
|
+
}
|
|
310
|
+
if (ex != null) {
|
|
311
|
+
ignoredExceptions.add(ex);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
return new ExecutionResult(configDiff, ignoredExceptions.build());
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
public ResumeState buildResumeState(ExecSession exec)
|
|
318
|
+
{
|
|
319
|
+
return new ResumeState(
|
|
320
|
+
exec.getSessionExecConfig(),
|
|
321
|
+
inputTaskSource, outputTaskSource,
|
|
322
|
+
first(schemas), executorSchema,
|
|
323
|
+
getInputTaskReports(), getOutputTaskReports());
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
public PartialExecutionException buildPartialExecuteException(Throwable cause, ExecSession exec)
|
|
327
|
+
{
|
|
328
|
+
return new PartialExecutionException(cause, buildResumeState(exec));
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
public ExecutionResult run(ExecSession exec, final ConfigSource config)
|
|
333
|
+
{
|
|
334
|
+
try {
|
|
335
|
+
return Exec.doWith(exec, new ExecAction<ExecutionResult>() {
|
|
336
|
+
public ExecutionResult run()
|
|
337
|
+
{
|
|
338
|
+
try (SetCurrentThreadName dontCare = new SetCurrentThreadName("transaction")) {
|
|
339
|
+
return doRun(config);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
} catch (ExecutionException ex) {
|
|
344
|
+
throw Throwables.propagate(ex.getCause());
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
public ExecutionResult resume(final ConfigSource config, final ResumeState resume)
|
|
349
|
+
{
|
|
350
|
+
try {
|
|
351
|
+
ExecSession exec = ExecSession.builder(injector).fromExecConfig(resume.getExecSessionConfigSource()).build();
|
|
352
|
+
ExecutionResult result = Exec.doWith(exec, new ExecAction<ExecutionResult>() {
|
|
353
|
+
public ExecutionResult run()
|
|
354
|
+
{
|
|
355
|
+
try (SetCurrentThreadName dontCare = new SetCurrentThreadName("resume")) {
|
|
356
|
+
return doResume(config, resume);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
exec.cleanup();
|
|
361
|
+
return result;
|
|
362
|
+
} catch (ExecutionException ex) {
|
|
363
|
+
throw Throwables.propagate(ex.getCause());
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
public void cleanup(final ConfigSource config, final ResumeState resume)
|
|
368
|
+
{
|
|
369
|
+
try {
|
|
370
|
+
ExecSession exec = ExecSession.builder(injector).fromExecConfig(resume.getExecSessionConfigSource()).build();
|
|
371
|
+
Exec.doWith(exec, new ExecAction<Void>() {
|
|
372
|
+
public Void run()
|
|
373
|
+
{
|
|
374
|
+
try (SetCurrentThreadName dontCare = new SetCurrentThreadName("cleanup")) {
|
|
375
|
+
doCleanup(config, resume);
|
|
376
|
+
return null;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
});
|
|
380
|
+
exec.cleanup();
|
|
381
|
+
} catch (ExecutionException ex) {
|
|
382
|
+
throw Throwables.propagate(ex.getCause());
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
private static class ProcessPluginSet
|
|
387
|
+
{
|
|
388
|
+
private final PluginType inputPluginType;
|
|
389
|
+
private final PluginType outputPluginType;
|
|
390
|
+
private final List<PluginType> filterPluginTypes;
|
|
391
|
+
|
|
392
|
+
private final InputPlugin inputPlugin;
|
|
393
|
+
private final OutputPlugin outputPlugin;
|
|
394
|
+
private final List<FilterPlugin> filterPlugins;
|
|
395
|
+
|
|
396
|
+
public ProcessPluginSet(BulkLoaderTask task)
|
|
397
|
+
{
|
|
398
|
+
this.inputPluginType = task.getInputConfig().get(PluginType.class, "type");
|
|
399
|
+
this.outputPluginType = task.getOutputConfig().get(PluginType.class, "type");
|
|
400
|
+
this.filterPluginTypes = Filters.getPluginTypes(task.getFilterConfigs());
|
|
401
|
+
this.inputPlugin = Exec.newPlugin(InputPlugin.class, inputPluginType);
|
|
402
|
+
this.outputPlugin = Exec.newPlugin(OutputPlugin.class, outputPluginType);
|
|
403
|
+
this.filterPlugins = Filters.newFilterPlugins(Exec.session(), filterPluginTypes);
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
public PluginType getInputPluginType()
|
|
407
|
+
{
|
|
408
|
+
return inputPluginType;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
public PluginType getOutputPluginType()
|
|
412
|
+
{
|
|
413
|
+
return outputPluginType;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
public List<PluginType> getFilterPluginTypes()
|
|
417
|
+
{
|
|
418
|
+
return filterPluginTypes;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
public InputPlugin getInputPlugin()
|
|
422
|
+
{
|
|
423
|
+
return inputPlugin;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
public OutputPlugin getOutputPlugin()
|
|
427
|
+
{
|
|
428
|
+
return outputPlugin;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
public List<FilterPlugin> getFilterPlugins()
|
|
432
|
+
{
|
|
433
|
+
return filterPlugins;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
public void doCleanup(ConfigSource config, ResumeState resume)
|
|
438
|
+
{
|
|
439
|
+
BulkLoaderTask task = config.loadConfig(BulkLoaderTask.class);
|
|
440
|
+
ProcessPluginSet plugins = new ProcessPluginSet(task); // TODO don't create filter plugins
|
|
441
|
+
|
|
442
|
+
ImmutableList.Builder<TaskReport> successfulInputTaskReports = ImmutableList.builder();
|
|
443
|
+
ImmutableList.Builder<TaskReport> successfulOutputTaskReports = ImmutableList.builder();
|
|
444
|
+
for (Optional<TaskReport> inputTaskReport : resume.getInputTaskReports()) {
|
|
445
|
+
if (inputTaskReport.isPresent()) {
|
|
446
|
+
successfulInputTaskReports.add(inputTaskReport.get());
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
for (Optional<TaskReport> outputTaskReport : resume.getOutputTaskReports()) {
|
|
450
|
+
if (outputTaskReport.isPresent()) {
|
|
451
|
+
successfulOutputTaskReports.add(outputTaskReport.get());
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
plugins.getInputPlugin().cleanup(resume.getInputTaskSource(), resume.getInputSchema(),
|
|
456
|
+
resume.getInputTaskReports().size(), successfulInputTaskReports.build());
|
|
457
|
+
|
|
458
|
+
plugins.getOutputPlugin().cleanup(resume.getOutputTaskSource(), resume.getOutputSchema(),
|
|
459
|
+
resume.getOutputTaskReports().size(), successfulOutputTaskReports.build());
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
private ExecutorPlugin newExecutorPlugin(BulkLoaderTask task)
|
|
463
|
+
{
|
|
464
|
+
return Exec.newPlugin(ExecutorPlugin.class,
|
|
465
|
+
task.getExecConfig().get(PluginType.class, "type", new PluginType("local")));
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
private ExecutionResult doRun(ConfigSource config)
|
|
469
|
+
{
|
|
470
|
+
final BulkLoaderTask task = config.loadConfig(BulkLoaderTask.class);
|
|
471
|
+
|
|
472
|
+
final ExecutorPlugin exec = newExecutorPlugin(task);
|
|
473
|
+
final ProcessPluginSet plugins = new ProcessPluginSet(task);
|
|
474
|
+
|
|
475
|
+
final LoaderState state = new LoaderState(Exec.getLogger(BulkLoader.class), plugins);
|
|
476
|
+
try {
|
|
477
|
+
ConfigDiff inputConfigDiff = plugins.getInputPlugin().transaction(task.getInputConfig(), new InputPlugin.Control() {
|
|
478
|
+
public List<TaskReport> run(final TaskSource inputTask, final Schema inputSchema, final int inputTaskCount)
|
|
479
|
+
{
|
|
480
|
+
state.setInputTaskSource(inputTask);
|
|
481
|
+
Filters.transaction(plugins.getFilterPlugins(), task.getFilterConfigs(), inputSchema, new Filters.Control() {
|
|
482
|
+
public void run(final List<TaskSource> filterTasks, final List<Schema> schemas)
|
|
483
|
+
{
|
|
484
|
+
state.setSchemas(schemas);
|
|
485
|
+
state.setFilterTaskSources(filterTasks);
|
|
486
|
+
exec.transaction(task.getExecConfig(), last(schemas), inputTaskCount, new ExecutorPlugin.Control() {
|
|
487
|
+
public void transaction(final Schema executorSchema, final int outputTaskCount, final ExecutorPlugin.Executor executor)
|
|
488
|
+
{
|
|
489
|
+
state.setExecutorSchema(executorSchema);
|
|
490
|
+
ConfigDiff outputConfigDiff = plugins.getOutputPlugin().transaction(task.getOutputConfig(), executorSchema, outputTaskCount, new OutputPlugin.Control() {
|
|
491
|
+
public List<TaskReport> run(final TaskSource outputTask)
|
|
492
|
+
{
|
|
493
|
+
state.setOutputTaskSource(outputTask);
|
|
494
|
+
|
|
495
|
+
state.initialize(inputTaskCount, outputTaskCount);
|
|
496
|
+
|
|
497
|
+
if (!state.isAllTasksCommitted()) { // inputTaskCount == 0
|
|
498
|
+
execute(task, executor, state);
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
return state.getAllOutputTaskReports();
|
|
502
|
+
}
|
|
503
|
+
});
|
|
504
|
+
state.setOutputConfigDiff(outputConfigDiff);
|
|
505
|
+
}
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
});
|
|
509
|
+
return state.getAllInputTaskReports();
|
|
510
|
+
}
|
|
511
|
+
});
|
|
512
|
+
state.setInputConfigDiff(inputConfigDiff);
|
|
513
|
+
|
|
514
|
+
cleanupCommittedTransaction(config, state);
|
|
515
|
+
|
|
516
|
+
return state.buildExecuteResult();
|
|
517
|
+
|
|
518
|
+
} catch (Throwable ex) {
|
|
519
|
+
if (state.isAllTasksCommitted() && state.isAllTransactionsCommitted()) {
|
|
520
|
+
// ignore the exception
|
|
521
|
+
return state.buildExecuteResultWithWarningException(ex);
|
|
522
|
+
}
|
|
523
|
+
if (!state.isAnyStarted()) {
|
|
524
|
+
throw ex;
|
|
525
|
+
}
|
|
526
|
+
throw state.buildPartialExecuteException(ex, Exec.session());
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
private ExecutionResult doResume(ConfigSource config, final ResumeState resume)
|
|
531
|
+
{
|
|
532
|
+
final BulkLoaderTask task = config.loadConfig(BulkLoaderTask.class);
|
|
533
|
+
|
|
534
|
+
final ExecutorPlugin exec = newExecutorPlugin(task);
|
|
535
|
+
final ProcessPluginSet plugins = new ProcessPluginSet(task);
|
|
536
|
+
|
|
537
|
+
final LoaderState state = new LoaderState(Exec.getLogger(BulkLoader.class), plugins);
|
|
538
|
+
try {
|
|
539
|
+
ConfigDiff inputConfigDiff = plugins.getInputPlugin().resume(resume.getInputTaskSource(), resume.getInputSchema(), resume.getInputTaskReports().size(), new InputPlugin.Control() {
|
|
540
|
+
public List<TaskReport> run(final TaskSource inputTask, final Schema inputSchema, final int inputTaskCount)
|
|
541
|
+
{
|
|
542
|
+
// TODO validate inputTask?
|
|
543
|
+
// TODO validate inputSchema
|
|
544
|
+
state.setInputTaskSource(inputTask);
|
|
545
|
+
Filters.transaction(plugins.getFilterPlugins(), task.getFilterConfigs(), inputSchema, new Filters.Control() {
|
|
546
|
+
public void run(final List<TaskSource> filterTasks, final List<Schema> schemas)
|
|
547
|
+
{
|
|
548
|
+
state.setSchemas(schemas);
|
|
549
|
+
state.setFilterTaskSources(filterTasks);
|
|
550
|
+
exec.transaction(task.getExecConfig(), last(schemas), inputTaskCount, new ExecutorPlugin.Control() {
|
|
551
|
+
public void transaction(final Schema executorSchema, final int outputTaskCount, final ExecutorPlugin.Executor executor)
|
|
552
|
+
{
|
|
553
|
+
// TODO validate executorSchema
|
|
554
|
+
state.setExecutorSchema(executorSchema);
|
|
555
|
+
ConfigDiff outputConfigDiff = plugins.getOutputPlugin().resume(resume.getOutputTaskSource(), executorSchema, outputTaskCount, new OutputPlugin.Control() {
|
|
556
|
+
public List<TaskReport> run(final TaskSource outputTask)
|
|
557
|
+
{
|
|
558
|
+
// TODO validate outputTask?
|
|
559
|
+
state.setOutputTaskSource(outputTask);
|
|
560
|
+
|
|
561
|
+
restoreResumedTaskReports(resume, state);
|
|
562
|
+
if (!state.isAllTasksCommitted()) {
|
|
563
|
+
execute(task, executor, state);
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
return state.getAllOutputTaskReports();
|
|
567
|
+
}
|
|
568
|
+
});
|
|
569
|
+
state.setOutputConfigDiff(outputConfigDiff);
|
|
570
|
+
}
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
});
|
|
574
|
+
return state.getAllInputTaskReports();
|
|
575
|
+
}
|
|
576
|
+
});
|
|
577
|
+
state.setInputConfigDiff(inputConfigDiff);
|
|
578
|
+
|
|
579
|
+
cleanupCommittedTransaction(config, state);
|
|
580
|
+
|
|
581
|
+
return state.buildExecuteResult();
|
|
582
|
+
|
|
583
|
+
} catch (Throwable ex) {
|
|
584
|
+
if (state.isAllTasksCommitted() && state.isAllTransactionsCommitted()) {
|
|
585
|
+
// ignore the exception
|
|
586
|
+
return state.buildExecuteResultWithWarningException(ex);
|
|
587
|
+
}
|
|
588
|
+
if (!state.isAnyStarted()) {
|
|
589
|
+
throw ex;
|
|
590
|
+
}
|
|
591
|
+
throw state.buildPartialExecuteException(ex, Exec.session());
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
private static void restoreResumedTaskReports(ResumeState resume, LoaderState state)
|
|
596
|
+
{
|
|
597
|
+
int inputTaskCount = resume.getInputTaskReports().size();
|
|
598
|
+
int outputTaskCount = resume.getOutputTaskReports().size();
|
|
599
|
+
|
|
600
|
+
state.initialize(inputTaskCount, outputTaskCount);
|
|
601
|
+
|
|
602
|
+
for (int i=0; i < inputTaskCount; i++) {
|
|
603
|
+
Optional<TaskReport> report = resume.getInputTaskReports().get(i);
|
|
604
|
+
if (report.isPresent()) {
|
|
605
|
+
TaskState task = state.getInputTaskState(i);
|
|
606
|
+
task.start();
|
|
607
|
+
task.setTaskReport(report.get());
|
|
608
|
+
task.finish();
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
for (int i=0; i < outputTaskCount; i++) {
|
|
613
|
+
Optional<TaskReport> report = resume.getOutputTaskReports().get(i);
|
|
614
|
+
if (report.isPresent()) {
|
|
615
|
+
TaskState task = state.getOutputTaskState(i);
|
|
616
|
+
task.start();
|
|
617
|
+
task.setTaskReport(report.get());
|
|
618
|
+
task.finish();
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
private void execute(BulkLoaderTask task, ExecutorPlugin.Executor executor, LoaderState state)
|
|
624
|
+
{
|
|
625
|
+
ProcessTask procTask = state.buildProcessTask();
|
|
626
|
+
|
|
627
|
+
executor.execute(procTask, state);
|
|
628
|
+
|
|
629
|
+
if (!state.isAllTasksCommitted()) {
|
|
630
|
+
throw state.getRepresentativeException();
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
private void cleanupCommittedTransaction(ConfigSource config, LoaderState state)
|
|
635
|
+
{
|
|
636
|
+
try {
|
|
637
|
+
doCleanup(config, state.buildResumeState(Exec.session()));
|
|
638
|
+
} catch (Exception ex) {
|
|
639
|
+
state.getLogger().warn("Commit succeeded but cleanup failed. Ignoring this exception.", ex); // TODO
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
private static Schema first(List<Schema> schemas)
|
|
644
|
+
{
|
|
645
|
+
return schemas.get(0);
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
private static Schema last(List<Schema> schemas)
|
|
649
|
+
{
|
|
650
|
+
return schemas.get(schemas.size() - 1);
|
|
651
|
+
}
|
|
652
|
+
}
|