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,141 @@
|
|
|
1
|
+
package org.embulk.config;
|
|
2
|
+
|
|
3
|
+
import java.io.File;
|
|
4
|
+
import java.io.FileInputStream;
|
|
5
|
+
import java.io.InputStream;
|
|
6
|
+
import java.io.IOException;
|
|
7
|
+
import java.util.Map;
|
|
8
|
+
import java.util.Properties;
|
|
9
|
+
import com.google.common.collect.ImmutableMap;
|
|
10
|
+
import com.google.inject.Inject;
|
|
11
|
+
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
12
|
+
import com.fasterxml.jackson.core.JsonParser;
|
|
13
|
+
import com.fasterxml.jackson.databind.JsonNode;
|
|
14
|
+
import com.fasterxml.jackson.databind.RuntimeJsonMappingException;
|
|
15
|
+
import com.fasterxml.jackson.databind.node.ObjectNode;
|
|
16
|
+
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
|
|
17
|
+
import org.yaml.snakeyaml.Yaml;
|
|
18
|
+
|
|
19
|
+
public class ConfigLoader
|
|
20
|
+
{
|
|
21
|
+
private final ModelManager model;
|
|
22
|
+
|
|
23
|
+
@Inject
|
|
24
|
+
public ConfigLoader(ModelManager model)
|
|
25
|
+
{
|
|
26
|
+
this.model = model;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public ConfigSource newConfigSource()
|
|
30
|
+
{
|
|
31
|
+
return new DataSourceImpl(model);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public ConfigSource fromJsonString(String string)
|
|
35
|
+
{
|
|
36
|
+
JsonNode node;
|
|
37
|
+
try {
|
|
38
|
+
node = new ObjectMapper().readTree(string);
|
|
39
|
+
}
|
|
40
|
+
catch (IOException ex) {
|
|
41
|
+
throw new RuntimeException(ex);
|
|
42
|
+
}
|
|
43
|
+
validateJsonNode(node);
|
|
44
|
+
return new DataSourceImpl(model, (ObjectNode) node);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public ConfigSource fromJsonFile(File file) throws IOException
|
|
48
|
+
{
|
|
49
|
+
try (FileInputStream is = new FileInputStream(file)) {
|
|
50
|
+
return fromJson(is);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
public ConfigSource fromJson(InputStream stream) throws IOException
|
|
55
|
+
{
|
|
56
|
+
JsonNode node = new ObjectMapper().readTree(stream);
|
|
57
|
+
validateJsonNode(node);
|
|
58
|
+
return new DataSourceImpl(model, (ObjectNode) node);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
public ConfigSource fromYamlString(String string)
|
|
62
|
+
{
|
|
63
|
+
JsonNode node = objectToJson(new Yaml().load(string));
|
|
64
|
+
validateJsonNode(node);
|
|
65
|
+
return new DataSourceImpl(model, (ObjectNode) node);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public ConfigSource fromYamlFile(File file) throws IOException
|
|
69
|
+
{
|
|
70
|
+
try (FileInputStream stream = new FileInputStream(file)) {
|
|
71
|
+
return fromYaml(stream);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
public ConfigSource fromYaml(InputStream stream) throws IOException
|
|
76
|
+
{
|
|
77
|
+
JsonNode node = objectToJson(new Yaml().load(stream));
|
|
78
|
+
validateJsonNode(node);
|
|
79
|
+
return new DataSourceImpl(model, (ObjectNode) node);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
private static void validateJsonNode(JsonNode node)
|
|
83
|
+
{
|
|
84
|
+
if (!node.isObject()) {
|
|
85
|
+
throw new RuntimeJsonMappingException("Expected object to load ConfigSource but got "+node);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
@Deprecated
|
|
90
|
+
public ConfigSource fromJson(JsonParser parser) throws IOException
|
|
91
|
+
{
|
|
92
|
+
// TODO check parsed.isObject()
|
|
93
|
+
ObjectNode source = (ObjectNode) new ObjectMapper().readTree(parser);
|
|
94
|
+
return new DataSourceImpl(model, source);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
public ConfigSource fromPropertiesYamlLiteral(Properties props, String keyPrefix)
|
|
98
|
+
{
|
|
99
|
+
ImmutableMap.Builder<String, String> builder = ImmutableMap.builder();
|
|
100
|
+
for (String propName : props.stringPropertyNames()) {
|
|
101
|
+
builder.put(propName, props.getProperty(propName));
|
|
102
|
+
}
|
|
103
|
+
return fromPropertiesYamlLiteral(builder.build(), keyPrefix);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
public ConfigSource fromPropertiesYamlLiteral(Map<String, String> props, String keyPrefix)
|
|
107
|
+
{
|
|
108
|
+
ObjectNode source = new ObjectNode(JsonNodeFactory.instance);
|
|
109
|
+
DataSource ds = new DataSourceImpl(model, source);
|
|
110
|
+
Yaml yaml = new Yaml();
|
|
111
|
+
for (Map.Entry<String, String> pair : props.entrySet()) {
|
|
112
|
+
if (!pair.getKey().startsWith(keyPrefix)) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
String keyName = pair.getKey().substring(keyPrefix.length());
|
|
116
|
+
Object parsedValue = yaml.load(pair.getValue()); // TODO exception handling
|
|
117
|
+
JsonNode node = objectToJson(parsedValue);
|
|
118
|
+
|
|
119
|
+
// handle "." as a map acccessor. for example:
|
|
120
|
+
// in.parser.type=csv => {"in": {"parser": {"type": "csv"}}}
|
|
121
|
+
// TODO handle "[]" as array index
|
|
122
|
+
String[] fragments = keyName.split("\\.");
|
|
123
|
+
DataSource key = ds;
|
|
124
|
+
for (int i=0; i < fragments.length - 1; i++) {
|
|
125
|
+
key = key.getNestedOrSetEmpty(fragments[i]); // TODO exception handling
|
|
126
|
+
}
|
|
127
|
+
key.set(fragments[fragments.length - 1], node);
|
|
128
|
+
}
|
|
129
|
+
return new DataSourceImpl(model, source);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
private JsonNode objectToJson(Object object)
|
|
133
|
+
{
|
|
134
|
+
ObjectMapper objectMapper = new ObjectMapper();
|
|
135
|
+
try {
|
|
136
|
+
return objectMapper.readTree(objectMapper.writeValueAsString(object));
|
|
137
|
+
} catch (IOException ex) {
|
|
138
|
+
throw new RuntimeException(ex);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
package org.embulk.config;
|
|
2
|
+
|
|
3
|
+
public interface ConfigSource
|
|
4
|
+
extends DataSource
|
|
5
|
+
{
|
|
6
|
+
<T> T loadConfig(Class<T> taskType);
|
|
7
|
+
|
|
8
|
+
@Override
|
|
9
|
+
ConfigSource getNested(String attrName);
|
|
10
|
+
|
|
11
|
+
@Override
|
|
12
|
+
ConfigSource getNestedOrSetEmpty(String attrName);
|
|
13
|
+
|
|
14
|
+
@Override
|
|
15
|
+
ConfigSource set(String attrName, Object v);
|
|
16
|
+
|
|
17
|
+
@Override
|
|
18
|
+
ConfigSource setNested(String attrName, DataSource v);
|
|
19
|
+
|
|
20
|
+
@Override
|
|
21
|
+
ConfigSource setAll(DataSource other);
|
|
22
|
+
|
|
23
|
+
@Override
|
|
24
|
+
ConfigSource remove(String attrName);
|
|
25
|
+
|
|
26
|
+
@Override
|
|
27
|
+
ConfigSource deepCopy();
|
|
28
|
+
|
|
29
|
+
@Override
|
|
30
|
+
ConfigSource merge(DataSource other);
|
|
31
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
package org.embulk.config;
|
|
2
|
+
|
|
3
|
+
import java.util.List;
|
|
4
|
+
import java.util.Map;
|
|
5
|
+
import com.fasterxml.jackson.databind.JsonNode;
|
|
6
|
+
import com.fasterxml.jackson.databind.node.ObjectNode;
|
|
7
|
+
|
|
8
|
+
public interface DataSource
|
|
9
|
+
{
|
|
10
|
+
List<String> getAttributeNames();
|
|
11
|
+
|
|
12
|
+
Iterable<Map.Entry<String, JsonNode>> getAttributes();
|
|
13
|
+
|
|
14
|
+
boolean isEmpty();
|
|
15
|
+
|
|
16
|
+
boolean has(String attrName);
|
|
17
|
+
|
|
18
|
+
<E> E get(Class<E> type, String attrName);
|
|
19
|
+
|
|
20
|
+
<E> E get(Class<E> type, String attrName, E defaultValue);
|
|
21
|
+
|
|
22
|
+
DataSource getNested(String attrName);
|
|
23
|
+
|
|
24
|
+
DataSource getNestedOrSetEmpty(String attrName);
|
|
25
|
+
|
|
26
|
+
DataSource set(String attrName, Object v);
|
|
27
|
+
|
|
28
|
+
DataSource setNested(String attrName, DataSource v);
|
|
29
|
+
|
|
30
|
+
DataSource setAll(DataSource other);
|
|
31
|
+
|
|
32
|
+
DataSource remove(String attrName);
|
|
33
|
+
|
|
34
|
+
DataSource deepCopy();
|
|
35
|
+
|
|
36
|
+
DataSource merge(DataSource other);
|
|
37
|
+
|
|
38
|
+
ObjectNode getObjectNode();
|
|
39
|
+
}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
package org.embulk.config;
|
|
2
|
+
|
|
3
|
+
import java.util.List;
|
|
4
|
+
import java.util.Map;
|
|
5
|
+
import java.util.Iterator;
|
|
6
|
+
import com.google.common.collect.ImmutableList;
|
|
7
|
+
import com.fasterxml.jackson.databind.JsonNode;
|
|
8
|
+
import com.fasterxml.jackson.databind.node.ObjectNode;
|
|
9
|
+
import com.fasterxml.jackson.databind.node.ArrayNode;
|
|
10
|
+
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
|
|
11
|
+
|
|
12
|
+
public class DataSourceImpl
|
|
13
|
+
implements ConfigSource, TaskSource, TaskReport, /* Deprecated */ CommitReport, ConfigDiff
|
|
14
|
+
{
|
|
15
|
+
protected final ObjectNode data;
|
|
16
|
+
protected final ModelManager model;
|
|
17
|
+
|
|
18
|
+
public DataSourceImpl(ModelManager model)
|
|
19
|
+
{
|
|
20
|
+
this(model, new ObjectNode(JsonNodeFactory.instance));
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// visible for DataSourceSerDe, ConfigSourceLoader and TaskInvocationHandler.dump
|
|
24
|
+
public DataSourceImpl(ModelManager model, ObjectNode data)
|
|
25
|
+
{
|
|
26
|
+
this.data = data;
|
|
27
|
+
this.model = model;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
protected DataSourceImpl newInstance(ModelManager model, ObjectNode data)
|
|
31
|
+
{
|
|
32
|
+
return new DataSourceImpl(model, (ObjectNode) data);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// visible for DataSourceSerDe.DataSourceSerializer
|
|
36
|
+
@Override
|
|
37
|
+
public ObjectNode getObjectNode()
|
|
38
|
+
{
|
|
39
|
+
return data;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@Override
|
|
43
|
+
public List<String> getAttributeNames()
|
|
44
|
+
{
|
|
45
|
+
return ImmutableList.copyOf(data.fieldNames());
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@Override
|
|
49
|
+
public Iterable<Map.Entry<String, JsonNode>> getAttributes()
|
|
50
|
+
{
|
|
51
|
+
return new Iterable<Map.Entry<String,JsonNode>>() {
|
|
52
|
+
public Iterator<Map.Entry<String, JsonNode>> iterator()
|
|
53
|
+
{
|
|
54
|
+
return data.fields();
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@Override
|
|
60
|
+
public boolean isEmpty()
|
|
61
|
+
{
|
|
62
|
+
return !data.fieldNames().hasNext();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
@Override
|
|
66
|
+
public boolean has(String attrName)
|
|
67
|
+
{
|
|
68
|
+
return data.has(attrName);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@Override
|
|
72
|
+
public <E> E get(Class<E> type, String attrName)
|
|
73
|
+
{
|
|
74
|
+
JsonNode json = data.get(attrName);
|
|
75
|
+
if (json == null) {
|
|
76
|
+
throw new ConfigException("Attribute "+attrName+" is required but not set");
|
|
77
|
+
}
|
|
78
|
+
return model.readObject(type, json.traverse());
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
@Override
|
|
82
|
+
public <E> E get(Class<E> type, String attrName, E defaultValue)
|
|
83
|
+
{
|
|
84
|
+
JsonNode json = data.get(attrName);
|
|
85
|
+
if (json == null) {
|
|
86
|
+
return defaultValue;
|
|
87
|
+
}
|
|
88
|
+
return model.readObject(type, json.traverse());
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@Override
|
|
92
|
+
public DataSourceImpl getNested(String attrName)
|
|
93
|
+
{
|
|
94
|
+
JsonNode json = data.get(attrName);
|
|
95
|
+
if (json == null) {
|
|
96
|
+
throw new ConfigException("Attribute "+attrName+" is required but not set");
|
|
97
|
+
}
|
|
98
|
+
if (!json.isObject()) {
|
|
99
|
+
throw new ConfigException("Attribute "+attrName+" must be an object");
|
|
100
|
+
}
|
|
101
|
+
return newInstance(model, (ObjectNode) json);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
@Override
|
|
105
|
+
public DataSourceImpl getNestedOrSetEmpty(String attrName)
|
|
106
|
+
{
|
|
107
|
+
JsonNode json = data.get(attrName);
|
|
108
|
+
if (json == null) {
|
|
109
|
+
json = data.objectNode();
|
|
110
|
+
data.set(attrName, json);
|
|
111
|
+
} else if (!json.isObject()) {
|
|
112
|
+
throw new ConfigException("Attribute "+attrName+" must be an object");
|
|
113
|
+
}
|
|
114
|
+
return newInstance(model, (ObjectNode) json);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
@Override
|
|
118
|
+
public DataSourceImpl set(String attrName, Object v)
|
|
119
|
+
{
|
|
120
|
+
if (v == null) {
|
|
121
|
+
remove(attrName);
|
|
122
|
+
} else {
|
|
123
|
+
data.set(attrName, model.writeObjectAsJsonNode(v));
|
|
124
|
+
}
|
|
125
|
+
return this;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
@Override
|
|
129
|
+
public DataSourceImpl setNested(String attrName, DataSource v)
|
|
130
|
+
{
|
|
131
|
+
data.set(attrName, v.getObjectNode());
|
|
132
|
+
return this;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
@Override
|
|
136
|
+
public DataSourceImpl setAll(DataSource other)
|
|
137
|
+
{
|
|
138
|
+
for (Map.Entry<String, JsonNode> field : other.getAttributes()) {
|
|
139
|
+
data.set(field.getKey(), field.getValue());
|
|
140
|
+
}
|
|
141
|
+
return this;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
@Override
|
|
145
|
+
public DataSourceImpl remove(String attrName)
|
|
146
|
+
{
|
|
147
|
+
data.remove(attrName);
|
|
148
|
+
return this;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
@Override
|
|
152
|
+
public DataSourceImpl deepCopy()
|
|
153
|
+
{
|
|
154
|
+
return newInstance(model, data.deepCopy());
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
@Override
|
|
158
|
+
public DataSourceImpl merge(DataSource other)
|
|
159
|
+
{
|
|
160
|
+
mergeJsonObject(data, other.deepCopy().getObjectNode());
|
|
161
|
+
return this;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
private static void mergeJsonObject(ObjectNode src, ObjectNode other)
|
|
165
|
+
{
|
|
166
|
+
Iterator<Map.Entry<String, JsonNode>> ite = other.fields();
|
|
167
|
+
while (ite.hasNext()) {
|
|
168
|
+
Map.Entry<String, JsonNode> pair = ite.next();
|
|
169
|
+
JsonNode s = src.get(pair.getKey());
|
|
170
|
+
JsonNode v = pair.getValue();
|
|
171
|
+
if (v.isObject() && s != null && s.isObject()) {
|
|
172
|
+
mergeJsonObject((ObjectNode) s, (ObjectNode) v);
|
|
173
|
+
} else if (v.isArray() && s != null && s.isArray()) {
|
|
174
|
+
mergeJsonArray((ArrayNode) s, (ArrayNode) v);
|
|
175
|
+
} else {
|
|
176
|
+
src.replace(pair.getKey(), v);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
private static void mergeJsonArray(ArrayNode src, ArrayNode other)
|
|
182
|
+
{
|
|
183
|
+
for (int i=0; i < other.size(); i++) {
|
|
184
|
+
JsonNode s = src.get(i);
|
|
185
|
+
JsonNode v = other.get(i);
|
|
186
|
+
if (s == null) {
|
|
187
|
+
src.add(v);
|
|
188
|
+
} else if (v.isObject() && s.isObject()) {
|
|
189
|
+
mergeJsonObject((ObjectNode) s, (ObjectNode) v);
|
|
190
|
+
} else if (v.isArray() && s.isArray()) {
|
|
191
|
+
mergeJsonArray((ArrayNode) s, (ArrayNode) v);
|
|
192
|
+
} else {
|
|
193
|
+
src.remove(i);
|
|
194
|
+
src.insert(i, v);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
@Override
|
|
200
|
+
public <T> T loadTask(Class<T> taskType)
|
|
201
|
+
{
|
|
202
|
+
return model.readObject(taskType, data.traverse());
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
@Override
|
|
206
|
+
public <T> T loadConfig(Class<T> taskType)
|
|
207
|
+
{
|
|
208
|
+
return model.readObjectWithConfigSerDe(taskType, data.traverse());
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
@Override
|
|
212
|
+
public String toString()
|
|
213
|
+
{
|
|
214
|
+
return data.toString();
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
@Override
|
|
218
|
+
public boolean equals(Object other)
|
|
219
|
+
{
|
|
220
|
+
if (!(other instanceof DataSource)) {
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
return data.equals(((DataSource) other).getObjectNode());
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
@Override
|
|
227
|
+
public int hashCode()
|
|
228
|
+
{
|
|
229
|
+
return data.hashCode();
|
|
230
|
+
}
|
|
231
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
package org.embulk.config;
|
|
2
|
+
|
|
3
|
+
import java.io.IOException;
|
|
4
|
+
import com.fasterxml.jackson.core.JsonGenerator;
|
|
5
|
+
import com.fasterxml.jackson.core.JsonParser;
|
|
6
|
+
import com.fasterxml.jackson.databind.module.SimpleModule;
|
|
7
|
+
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
8
|
+
import com.fasterxml.jackson.databind.JsonSerializer;
|
|
9
|
+
import com.fasterxml.jackson.databind.JsonDeserializer;
|
|
10
|
+
import com.fasterxml.jackson.databind.SerializerProvider;
|
|
11
|
+
import com.fasterxml.jackson.databind.DeserializationContext;
|
|
12
|
+
import com.fasterxml.jackson.databind.JsonNode;
|
|
13
|
+
import com.fasterxml.jackson.databind.JsonMappingException;
|
|
14
|
+
import com.fasterxml.jackson.databind.node.ObjectNode;
|
|
15
|
+
|
|
16
|
+
public class DataSourceSerDe
|
|
17
|
+
{
|
|
18
|
+
public static class SerDeModule
|
|
19
|
+
extends SimpleModule
|
|
20
|
+
{
|
|
21
|
+
@SuppressWarnings("deprecation")
|
|
22
|
+
public SerDeModule(final ModelManager model)
|
|
23
|
+
{
|
|
24
|
+
// DataSourceImpl
|
|
25
|
+
addSerializer(DataSourceImpl.class, new DataSourceSerializer<DataSourceImpl>());
|
|
26
|
+
addDeserializer(DataSourceImpl.class, new DataSourceDeserializer<DataSourceImpl>(model));
|
|
27
|
+
|
|
28
|
+
// ConfigSource
|
|
29
|
+
addSerializer(ConfigSource.class, new DataSourceSerializer<ConfigSource>());
|
|
30
|
+
addDeserializer(ConfigSource.class, new DataSourceDeserializer<ConfigSource>(model));
|
|
31
|
+
|
|
32
|
+
// TaskSource
|
|
33
|
+
addSerializer(TaskSource.class, new DataSourceSerializer<TaskSource>());
|
|
34
|
+
addDeserializer(TaskSource.class, new DataSourceDeserializer<TaskSource>(model));
|
|
35
|
+
|
|
36
|
+
// TaskReport
|
|
37
|
+
addSerializer(TaskReport.class, new DataSourceSerializer<TaskReport>());
|
|
38
|
+
addDeserializer(TaskReport.class, new DataSourceDeserializer<TaskReport>(model));
|
|
39
|
+
|
|
40
|
+
// CommitReport (Deprecated)
|
|
41
|
+
addSerializer(CommitReport.class, new DataSourceSerializer<CommitReport>());
|
|
42
|
+
addDeserializer(CommitReport.class, new DataSourceDeserializer<CommitReport>(model));
|
|
43
|
+
|
|
44
|
+
// ConfigDiff
|
|
45
|
+
addSerializer(ConfigDiff.class, new DataSourceSerializer<ConfigDiff>());
|
|
46
|
+
addDeserializer(ConfigDiff.class, new DataSourceDeserializer<ConfigDiff>(model));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private static class DataSourceDeserializer <T extends DataSource> // TODO T extends DataSource super DataSourceImpl
|
|
51
|
+
extends JsonDeserializer<T>
|
|
52
|
+
{
|
|
53
|
+
private final ModelManager model;
|
|
54
|
+
private final ObjectMapper treeObjectMapper;
|
|
55
|
+
|
|
56
|
+
DataSourceDeserializer(ModelManager model)
|
|
57
|
+
{
|
|
58
|
+
this.model = model;
|
|
59
|
+
this.treeObjectMapper = new ObjectMapper();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
@Override
|
|
63
|
+
@SuppressWarnings("unchecked")
|
|
64
|
+
public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException
|
|
65
|
+
{
|
|
66
|
+
JsonNode json = treeObjectMapper.readTree(jp);
|
|
67
|
+
if (!json.isObject()) {
|
|
68
|
+
throw new JsonMappingException("Expected object to deserialize DataSource", jp.getCurrentLocation());
|
|
69
|
+
}
|
|
70
|
+
return (T) new DataSourceImpl(model, (ObjectNode) json);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
private static class DataSourceSerializer <T extends DataSource>
|
|
75
|
+
extends JsonSerializer<T>
|
|
76
|
+
{
|
|
77
|
+
@Override
|
|
78
|
+
public void serialize(T value, JsonGenerator jgen, SerializerProvider provider)
|
|
79
|
+
throws IOException
|
|
80
|
+
{
|
|
81
|
+
value.getObjectNode().serialize(jgen, provider);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|