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,20 @@
|
|
|
1
|
+
package org.embulk.config;
|
|
2
|
+
|
|
3
|
+
import java.lang.reflect.Type;
|
|
4
|
+
import com.fasterxml.jackson.core.type.TypeReference;
|
|
5
|
+
|
|
6
|
+
class GenericTypeReference
|
|
7
|
+
extends TypeReference<Object>
|
|
8
|
+
{
|
|
9
|
+
private final Type type;
|
|
10
|
+
|
|
11
|
+
public GenericTypeReference(Type type)
|
|
12
|
+
{
|
|
13
|
+
this.type = type;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public Type getType()
|
|
17
|
+
{
|
|
18
|
+
return type;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
package org.embulk.config;
|
|
2
|
+
|
|
3
|
+
import javax.validation.Validation;
|
|
4
|
+
import org.apache.bval.jsr303.ApacheValidationProvider;
|
|
5
|
+
import com.google.inject.Inject;
|
|
6
|
+
import com.google.inject.Injector;
|
|
7
|
+
import com.google.common.base.Throwables;
|
|
8
|
+
import com.fasterxml.jackson.core.JsonParser;
|
|
9
|
+
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
10
|
+
import com.fasterxml.jackson.databind.JsonNode;
|
|
11
|
+
import com.fasterxml.jackson.databind.node.ObjectNode;
|
|
12
|
+
|
|
13
|
+
public class ModelManager
|
|
14
|
+
{
|
|
15
|
+
private final Injector injector;
|
|
16
|
+
private final ObjectMapper objectMapper;
|
|
17
|
+
private final ObjectMapper configObjectMapper; // configObjectMapper uses different TaskDeserializer
|
|
18
|
+
private final TaskValidator taskValidator;
|
|
19
|
+
|
|
20
|
+
@Inject
|
|
21
|
+
public ModelManager(Injector injector, ObjectMapper objectMapper)
|
|
22
|
+
{
|
|
23
|
+
this.injector = injector;
|
|
24
|
+
this.objectMapper = objectMapper;
|
|
25
|
+
this.configObjectMapper = objectMapper.copy();
|
|
26
|
+
this.taskValidator = new TaskValidator(
|
|
27
|
+
Validation.byProvider(ApacheValidationProvider.class).configure().buildValidatorFactory().getValidator());
|
|
28
|
+
|
|
29
|
+
objectMapper.registerModule(new TaskSerDe.TaskSerializerModule(objectMapper));
|
|
30
|
+
objectMapper.registerModule(new TaskSerDe.TaskDeserializerModule(objectMapper, this));
|
|
31
|
+
objectMapper.registerModule(new DataSourceSerDe.SerDeModule(this));
|
|
32
|
+
configObjectMapper.registerModule(new TaskSerDe.TaskSerializerModule(configObjectMapper));
|
|
33
|
+
configObjectMapper.registerModule(new TaskSerDe.ConfigTaskDeserializerModule(configObjectMapper, this));
|
|
34
|
+
configObjectMapper.registerModule(new DataSourceSerDe.SerDeModule(this));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public <T> T readObject(Class<T> valueType, String json)
|
|
38
|
+
{
|
|
39
|
+
try {
|
|
40
|
+
return objectMapper.readValue(json, valueType);
|
|
41
|
+
} catch (Exception ex) {
|
|
42
|
+
throw Throwables.propagate(ex);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public <T> T readObject(Class<T> valueType, JsonParser parser)
|
|
47
|
+
{
|
|
48
|
+
try {
|
|
49
|
+
return objectMapper.readValue(parser, valueType);
|
|
50
|
+
} catch (Exception ex) {
|
|
51
|
+
throw Throwables.propagate(ex);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public <T> T readObjectWithConfigSerDe(Class<T> valueType, String json)
|
|
56
|
+
{
|
|
57
|
+
T t;
|
|
58
|
+
try {
|
|
59
|
+
t = configObjectMapper.readValue(json, valueType);
|
|
60
|
+
} catch (Exception ex) {
|
|
61
|
+
Throwables.propagateIfInstanceOf(ex, ConfigException.class);
|
|
62
|
+
throw new ConfigException(ex);
|
|
63
|
+
}
|
|
64
|
+
validate(t);
|
|
65
|
+
return t;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public <T> T readObjectWithConfigSerDe(Class<T> valueType, JsonParser parser)
|
|
69
|
+
{
|
|
70
|
+
T t;
|
|
71
|
+
try {
|
|
72
|
+
t = configObjectMapper.readValue(parser, valueType);
|
|
73
|
+
} catch (Exception ex) {
|
|
74
|
+
Throwables.propagateIfInstanceOf(ex, ConfigException.class);
|
|
75
|
+
throw new ConfigException(ex);
|
|
76
|
+
}
|
|
77
|
+
validate(t);
|
|
78
|
+
return t;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
public String writeObject(Object object)
|
|
82
|
+
{
|
|
83
|
+
try {
|
|
84
|
+
return objectMapper.writeValueAsString(object);
|
|
85
|
+
} catch (Exception ex) {
|
|
86
|
+
throw Throwables.propagate(ex);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
public void validate(Object object)
|
|
91
|
+
{
|
|
92
|
+
taskValidator.validateModel(object);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// visible for DataSource.set
|
|
96
|
+
JsonNode writeObjectAsJsonNode(Object v)
|
|
97
|
+
{
|
|
98
|
+
String json = writeObject(v);
|
|
99
|
+
try {
|
|
100
|
+
return objectMapper.readValue(json, JsonNode.class);
|
|
101
|
+
} catch (Exception ex) {
|
|
102
|
+
throw Throwables.propagate(ex);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// visible for TaskInvocationHandler.invokeDump
|
|
107
|
+
ObjectNode writeObjectAsObjectNode(Object v)
|
|
108
|
+
{
|
|
109
|
+
String json = writeObject(v);
|
|
110
|
+
try {
|
|
111
|
+
return objectMapper.readValue(json, ObjectNode.class);
|
|
112
|
+
} catch (Exception ex) {
|
|
113
|
+
throw Throwables.propagate(ex);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// visible for TaskSerDe.set
|
|
118
|
+
// TODO create annotation calss and get its instance at the 2nd argument
|
|
119
|
+
<T> T getInjectedInstance(Class<T> type)
|
|
120
|
+
{
|
|
121
|
+
return injector.getInstance(type);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
package org.embulk.config;
|
|
2
|
+
|
|
3
|
+
import java.lang.reflect.Proxy;
|
|
4
|
+
import java.lang.reflect.Method;
|
|
5
|
+
import java.lang.reflect.InvocationHandler;
|
|
6
|
+
import java.util.Set;
|
|
7
|
+
import java.util.Map;
|
|
8
|
+
import java.util.HashMap;
|
|
9
|
+
import com.google.common.collect.ImmutableMap;
|
|
10
|
+
|
|
11
|
+
class TaskInvocationHandler
|
|
12
|
+
implements InvocationHandler
|
|
13
|
+
{
|
|
14
|
+
private final ModelManager model;
|
|
15
|
+
private final Class<?> iface;
|
|
16
|
+
private final Map<String, Object> objects;
|
|
17
|
+
private final Set<String> injectedFields;
|
|
18
|
+
|
|
19
|
+
public TaskInvocationHandler(ModelManager model, Class<?> iface, Map<String, Object> objects, Set<String> injectedFields)
|
|
20
|
+
{
|
|
21
|
+
this.model = model;
|
|
22
|
+
this.iface = iface;
|
|
23
|
+
this.objects = objects;
|
|
24
|
+
this.injectedFields = injectedFields;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* fieldName = Method of the getter
|
|
29
|
+
*/
|
|
30
|
+
public static Map<String, Method> fieldGetters(Class<?> iface)
|
|
31
|
+
{
|
|
32
|
+
ImmutableMap.Builder<String, Method> builder = ImmutableMap.builder();
|
|
33
|
+
for (Method method : iface.getMethods()) {
|
|
34
|
+
String methodName = method.getName();
|
|
35
|
+
String fieldName = getterFieldNameOrNull(methodName);
|
|
36
|
+
if (fieldName != null && hasExpectedArgumentLength(method, 0)) {
|
|
37
|
+
builder.put(fieldName, method);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return builder.build();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// visible for ModelManager.AccessorSerializer
|
|
44
|
+
Map<String, Object> getObjects()
|
|
45
|
+
{
|
|
46
|
+
return objects;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// visible for ModelManager.AccessorSerializer
|
|
50
|
+
Set<String> getInjectedFields()
|
|
51
|
+
{
|
|
52
|
+
return injectedFields;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
protected Object invokeGetter(Method method, String fieldName)
|
|
56
|
+
{
|
|
57
|
+
return objects.get(fieldName);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
protected void invokeSetter(Method method, String fieldName, Object value)
|
|
61
|
+
{
|
|
62
|
+
if (value == null) {
|
|
63
|
+
objects.remove(fieldName);
|
|
64
|
+
} else {
|
|
65
|
+
objects.put(fieldName, value);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
private Map<String, Object> getSerializableFields()
|
|
70
|
+
{
|
|
71
|
+
Map<String, Object> data = new HashMap<String, Object>(objects);
|
|
72
|
+
for (String injected : injectedFields) {
|
|
73
|
+
data.remove(injected);
|
|
74
|
+
}
|
|
75
|
+
return data;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
protected TaskSource invokeDump()
|
|
79
|
+
{
|
|
80
|
+
return new DataSourceImpl(model, model.writeObjectAsObjectNode(getSerializableFields()));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
protected String invokeToString()
|
|
84
|
+
{
|
|
85
|
+
StringBuilder sb = new StringBuilder();
|
|
86
|
+
sb.append(iface.getName());
|
|
87
|
+
sb.append(getSerializableFields());
|
|
88
|
+
return sb.toString();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
protected int invokeHashCode()
|
|
92
|
+
{
|
|
93
|
+
return objects.hashCode();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
protected boolean invokeEquals(Object other)
|
|
97
|
+
{
|
|
98
|
+
return (other instanceof TaskInvocationHandler) &&
|
|
99
|
+
objects.equals(((TaskInvocationHandler) other).objects);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
public Object invoke(Object proxy, Method method, Object[] args)
|
|
103
|
+
{
|
|
104
|
+
String methodName = method.getName();
|
|
105
|
+
|
|
106
|
+
switch(methodName) {
|
|
107
|
+
case "validate":
|
|
108
|
+
checkArgumentLength(method, 0, methodName);
|
|
109
|
+
model.validate(proxy);
|
|
110
|
+
return proxy;
|
|
111
|
+
|
|
112
|
+
case "dump":
|
|
113
|
+
checkArgumentLength(method, 0, methodName);
|
|
114
|
+
return invokeDump();
|
|
115
|
+
|
|
116
|
+
case "toString":
|
|
117
|
+
checkArgumentLength(method, 0, methodName);
|
|
118
|
+
return invokeToString();
|
|
119
|
+
|
|
120
|
+
case "hashCode":
|
|
121
|
+
checkArgumentLength(method, 0, methodName);
|
|
122
|
+
return invokeHashCode();
|
|
123
|
+
|
|
124
|
+
case "equals":
|
|
125
|
+
checkArgumentLength(method, 1, methodName);
|
|
126
|
+
if (args[0] instanceof Proxy) {
|
|
127
|
+
Object otherHandler = Proxy.getInvocationHandler(args[0]);
|
|
128
|
+
return invokeEquals(otherHandler);
|
|
129
|
+
}
|
|
130
|
+
return false;
|
|
131
|
+
|
|
132
|
+
default:
|
|
133
|
+
{
|
|
134
|
+
String fieldName;
|
|
135
|
+
fieldName = getterFieldNameOrNull(methodName);
|
|
136
|
+
if (fieldName != null) {
|
|
137
|
+
checkArgumentLength(method, 0, methodName);
|
|
138
|
+
return invokeGetter(method, fieldName);
|
|
139
|
+
}
|
|
140
|
+
fieldName = setterFieldNameOrNull(methodName);
|
|
141
|
+
if (fieldName != null) {
|
|
142
|
+
checkArgumentLength(method, 1, methodName);
|
|
143
|
+
invokeSetter(method, fieldName, args[0]);
|
|
144
|
+
return this;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
throw new IllegalArgumentException(String.format("Undefined method '%s'", methodName));
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
private static String getterFieldNameOrNull(String methodName)
|
|
153
|
+
{
|
|
154
|
+
if (methodName.startsWith("get")) {
|
|
155
|
+
return methodName.substring(3);
|
|
156
|
+
}
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
private static String setterFieldNameOrNull(String methodName)
|
|
161
|
+
{
|
|
162
|
+
if (methodName.startsWith("set")) {
|
|
163
|
+
return methodName.substring(3);
|
|
164
|
+
}
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
protected static boolean hasExpectedArgumentLength(Method method, int expected)
|
|
169
|
+
{
|
|
170
|
+
return method.getParameterTypes().length == expected;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
protected static void checkArgumentLength(Method method, int expected, String methodName)
|
|
174
|
+
{
|
|
175
|
+
if (!hasExpectedArgumentLength(method, expected)) {
|
|
176
|
+
throw new IllegalArgumentException(
|
|
177
|
+
String.format("Method '%s' expected %d argument but got %d arguments", methodName, expected, method.getParameterTypes().length));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
package org.embulk.config;
|
|
2
|
+
|
|
3
|
+
public interface TaskReport
|
|
4
|
+
extends DataSource
|
|
5
|
+
{
|
|
6
|
+
@Override
|
|
7
|
+
TaskReport getNested(String attrName);
|
|
8
|
+
|
|
9
|
+
@Override
|
|
10
|
+
TaskReport getNestedOrSetEmpty(String attrName);
|
|
11
|
+
|
|
12
|
+
@Override
|
|
13
|
+
TaskReport set(String attrName, Object v);
|
|
14
|
+
|
|
15
|
+
@Override
|
|
16
|
+
TaskReport setNested(String attrName, DataSource v);
|
|
17
|
+
|
|
18
|
+
@Override
|
|
19
|
+
TaskReport setAll(DataSource other);
|
|
20
|
+
|
|
21
|
+
@Override
|
|
22
|
+
TaskReport remove(String attrName);
|
|
23
|
+
|
|
24
|
+
@Override
|
|
25
|
+
TaskReport deepCopy();
|
|
26
|
+
|
|
27
|
+
@Override
|
|
28
|
+
TaskReport merge(DataSource other);
|
|
29
|
+
}
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
package org.embulk.config;
|
|
2
|
+
|
|
3
|
+
import java.lang.reflect.Proxy;
|
|
4
|
+
import java.lang.reflect.Method;
|
|
5
|
+
import java.lang.reflect.Type;
|
|
6
|
+
import java.io.IOException;
|
|
7
|
+
import java.util.List;
|
|
8
|
+
import java.util.Map;
|
|
9
|
+
import java.util.HashMap;
|
|
10
|
+
import java.util.concurrent.ConcurrentHashMap;
|
|
11
|
+
import com.google.common.base.Optional;
|
|
12
|
+
import com.google.common.collect.ImmutableList;
|
|
13
|
+
import com.google.common.collect.ImmutableSet;
|
|
14
|
+
import com.google.common.collect.ImmutableMap;
|
|
15
|
+
import com.fasterxml.jackson.core.JsonGenerator;
|
|
16
|
+
import com.fasterxml.jackson.core.JsonParser;
|
|
17
|
+
import com.fasterxml.jackson.core.JsonToken;
|
|
18
|
+
import com.fasterxml.jackson.core.Version;
|
|
19
|
+
import com.fasterxml.jackson.databind.Module;
|
|
20
|
+
import com.fasterxml.jackson.databind.module.SimpleModule;
|
|
21
|
+
import com.fasterxml.jackson.databind.deser.Deserializers;
|
|
22
|
+
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
23
|
+
import com.fasterxml.jackson.databind.JavaType;
|
|
24
|
+
import com.fasterxml.jackson.databind.BeanDescription;
|
|
25
|
+
import com.fasterxml.jackson.databind.JsonSerializer;
|
|
26
|
+
import com.fasterxml.jackson.databind.JsonDeserializer;
|
|
27
|
+
import com.fasterxml.jackson.databind.SerializerProvider;
|
|
28
|
+
import com.fasterxml.jackson.databind.DeserializationContext;
|
|
29
|
+
import com.fasterxml.jackson.databind.DeserializationConfig;
|
|
30
|
+
import com.fasterxml.jackson.databind.JsonMappingException;
|
|
31
|
+
|
|
32
|
+
class TaskSerDe
|
|
33
|
+
{
|
|
34
|
+
public static class TaskSerializer
|
|
35
|
+
extends JsonSerializer<Task>
|
|
36
|
+
{
|
|
37
|
+
private final ObjectMapper nestedObjectMapper;
|
|
38
|
+
|
|
39
|
+
public TaskSerializer(ObjectMapper nestedObjectMapper)
|
|
40
|
+
{
|
|
41
|
+
this.nestedObjectMapper = nestedObjectMapper;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
@Override
|
|
45
|
+
public void serialize(Task value, JsonGenerator jgen, SerializerProvider provider)
|
|
46
|
+
throws IOException
|
|
47
|
+
{
|
|
48
|
+
if (value instanceof Proxy) {
|
|
49
|
+
Object handler = Proxy.getInvocationHandler(value);
|
|
50
|
+
if (handler instanceof TaskInvocationHandler) {
|
|
51
|
+
TaskInvocationHandler h = (TaskInvocationHandler) handler;
|
|
52
|
+
Map<String, Object> objects = h.getObjects();
|
|
53
|
+
jgen.writeStartObject();
|
|
54
|
+
for (Map.Entry<String, Object> pair : objects.entrySet()) {
|
|
55
|
+
if (h.getInjectedFields().contains(pair.getKey())) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
jgen.writeFieldName(pair.getKey());
|
|
59
|
+
nestedObjectMapper.writeValue(jgen, pair.getValue());
|
|
60
|
+
}
|
|
61
|
+
jgen.writeEndObject();
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// TODO exception class & message
|
|
66
|
+
throw new UnsupportedOperationException("Serializing Task is not supported");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public static class TaskDeserializer <T>
|
|
71
|
+
extends JsonDeserializer<T>
|
|
72
|
+
{
|
|
73
|
+
private final ObjectMapper nestedObjectMapper;
|
|
74
|
+
private final ModelManager model;
|
|
75
|
+
private final Class<?> iface;
|
|
76
|
+
private final Map<String, FieldEntry> mappings;
|
|
77
|
+
private final List<InjectEntry> injects;
|
|
78
|
+
|
|
79
|
+
public TaskDeserializer(ObjectMapper nestedObjectMapper, ModelManager model, Class<T> iface)
|
|
80
|
+
{
|
|
81
|
+
this.nestedObjectMapper = nestedObjectMapper;
|
|
82
|
+
this.model = model;
|
|
83
|
+
this.iface = iface;
|
|
84
|
+
this.mappings = getterMappings(iface);
|
|
85
|
+
this.injects = injectEntries(iface);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
protected Map<String, FieldEntry> getterMappings(Class<?> iface)
|
|
89
|
+
{
|
|
90
|
+
ImmutableMap.Builder<String, FieldEntry> builder = ImmutableMap.builder();
|
|
91
|
+
for (Map.Entry<String, Method> getter : TaskInvocationHandler.fieldGetters(iface).entrySet()) {
|
|
92
|
+
Method getterMethod = getter.getValue();
|
|
93
|
+
String fieldName = getter.getKey();
|
|
94
|
+
|
|
95
|
+
if (getterMethod.getAnnotation(ConfigInject.class) != null) {
|
|
96
|
+
// InjectEntry
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
Type fieldType = getterMethod.getGenericReturnType();
|
|
101
|
+
|
|
102
|
+
Optional<String> jsonKey = getJsonKey(getterMethod, fieldName);
|
|
103
|
+
if (!jsonKey.isPresent()) {
|
|
104
|
+
// skip this field
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
Optional<String> defaultJsonString = getDefaultJsonString(getterMethod);
|
|
108
|
+
builder.put(jsonKey.get(), new FieldEntry(fieldName, fieldType, defaultJsonString));
|
|
109
|
+
}
|
|
110
|
+
return builder.build();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
protected List<InjectEntry> injectEntries(Class<?> iface)
|
|
114
|
+
{
|
|
115
|
+
ImmutableList.Builder<InjectEntry> builder = ImmutableList.builder();
|
|
116
|
+
for (Map.Entry<String, Method> getter : TaskInvocationHandler.fieldGetters(iface).entrySet()) {
|
|
117
|
+
Method getterMethod = getter.getValue();
|
|
118
|
+
String fieldName = getter.getKey();
|
|
119
|
+
ConfigInject inject = getterMethod.getAnnotation(ConfigInject.class);
|
|
120
|
+
if (inject != null) {
|
|
121
|
+
// InjectEntry
|
|
122
|
+
builder.add(new InjectEntry(fieldName, getterMethod.getReturnType()));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return builder.build();
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
protected Optional<String> getJsonKey(Method getterMethod, String fieldName)
|
|
129
|
+
{
|
|
130
|
+
return Optional.of(fieldName);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
protected Optional<String> getDefaultJsonString(Method getterMethod)
|
|
134
|
+
{
|
|
135
|
+
return Optional.absent();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
@Override
|
|
139
|
+
@SuppressWarnings("unchecked")
|
|
140
|
+
public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException
|
|
141
|
+
{
|
|
142
|
+
Map<String, Object> objects = new ConcurrentHashMap<String, Object>();
|
|
143
|
+
HashMap<String, FieldEntry> unusedMappings = new HashMap<>(mappings);
|
|
144
|
+
|
|
145
|
+
JsonToken current;
|
|
146
|
+
current = jp.getCurrentToken();
|
|
147
|
+
if (current == JsonToken.START_OBJECT) {
|
|
148
|
+
current = jp.nextToken();
|
|
149
|
+
}
|
|
150
|
+
for (; current != JsonToken.END_OBJECT; current = jp.nextToken()) {
|
|
151
|
+
String key = jp.getCurrentName();
|
|
152
|
+
current = jp.nextToken();
|
|
153
|
+
FieldEntry field = mappings.get(key);
|
|
154
|
+
if (field == null) {
|
|
155
|
+
jp.skipChildren();
|
|
156
|
+
} else {
|
|
157
|
+
Object value = nestedObjectMapper.readValue(jp, new GenericTypeReference(field.getType()));
|
|
158
|
+
if (value == null) {
|
|
159
|
+
throw new JsonMappingException("Setting null to a task field is not allowed. Use Optional<T> (com.google.common.base.Optional) to represent null.");
|
|
160
|
+
}
|
|
161
|
+
objects.put(field.getName(), value);
|
|
162
|
+
unusedMappings.remove(key);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// set default values
|
|
167
|
+
for (Map.Entry<String, FieldEntry> unused : unusedMappings.entrySet()) {
|
|
168
|
+
FieldEntry field = unused.getValue();
|
|
169
|
+
if (field.getDefaultJsonString().isPresent()) {
|
|
170
|
+
Object value = nestedObjectMapper.readValue(field.getDefaultJsonString().get(), new GenericTypeReference(field.getType()));
|
|
171
|
+
if (value == null) {
|
|
172
|
+
throw new JsonMappingException("Setting null to a task field is not allowed. Use Optional<T> (com.google.common.base.Optional) to represent null.");
|
|
173
|
+
}
|
|
174
|
+
objects.put(field.getName(), value);
|
|
175
|
+
} else {
|
|
176
|
+
// required field
|
|
177
|
+
throw new JsonMappingException("Field '"+unused.getKey()+"' is required but not set", jp.getCurrentLocation());
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// inject
|
|
182
|
+
ImmutableSet.Builder<String> injectedFields = ImmutableSet.builder();
|
|
183
|
+
for (InjectEntry inject : injects) {
|
|
184
|
+
objects.put(inject.getName(), model.getInjectedInstance(inject.getType()));
|
|
185
|
+
injectedFields.add(inject.getName());
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return (T) Proxy.newProxyInstance(
|
|
189
|
+
iface.getClassLoader(), new Class<?>[] { iface },
|
|
190
|
+
new TaskInvocationHandler(model, iface, objects, injectedFields.build()));
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
private static class FieldEntry
|
|
194
|
+
{
|
|
195
|
+
private final String name;
|
|
196
|
+
private final Type type;
|
|
197
|
+
private final Optional<String> defaultJsonString;
|
|
198
|
+
|
|
199
|
+
public FieldEntry(String name, Type type, Optional<String> defaultJsonString)
|
|
200
|
+
{
|
|
201
|
+
this.name = name;
|
|
202
|
+
this.type = type;
|
|
203
|
+
this.defaultJsonString = defaultJsonString;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
public String getName()
|
|
207
|
+
{
|
|
208
|
+
return name;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
public Type getType()
|
|
212
|
+
{
|
|
213
|
+
return type;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
public Optional<String> getDefaultJsonString()
|
|
217
|
+
{
|
|
218
|
+
return defaultJsonString;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
private static class InjectEntry
|
|
223
|
+
{
|
|
224
|
+
private final String name;
|
|
225
|
+
private Class<?> type;
|
|
226
|
+
|
|
227
|
+
public InjectEntry(String name, Class<?> type)
|
|
228
|
+
{
|
|
229
|
+
this.name = name;
|
|
230
|
+
this.type = type;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
public String getName()
|
|
234
|
+
{
|
|
235
|
+
return name;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
public Class<?> getType()
|
|
239
|
+
{
|
|
240
|
+
return type;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
public static class TaskSerializerModule
|
|
246
|
+
extends SimpleModule
|
|
247
|
+
{
|
|
248
|
+
public TaskSerializerModule(ObjectMapper nestedObjectMapper)
|
|
249
|
+
{
|
|
250
|
+
super();
|
|
251
|
+
addSerializer(Task.class, new TaskSerializer(nestedObjectMapper));
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
public static class ConfigTaskDeserializer <T>
|
|
256
|
+
extends TaskDeserializer<T>
|
|
257
|
+
{
|
|
258
|
+
public ConfigTaskDeserializer(ObjectMapper nestedObjectMapper, ModelManager model, Class<T> iface)
|
|
259
|
+
{
|
|
260
|
+
super(nestedObjectMapper, model, iface);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
@Override
|
|
264
|
+
protected Optional<String> getJsonKey(Method getterMethod, String fieldName)
|
|
265
|
+
{
|
|
266
|
+
Config a = getterMethod.getAnnotation(Config.class);
|
|
267
|
+
if (a != null) {
|
|
268
|
+
return Optional.of(a.value());
|
|
269
|
+
} else {
|
|
270
|
+
return Optional.absent(); // skip this field
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
@Override
|
|
275
|
+
public Optional<String> getDefaultJsonString(Method getterMethod)
|
|
276
|
+
{
|
|
277
|
+
ConfigDefault a = getterMethod.getAnnotation(ConfigDefault.class);
|
|
278
|
+
if (a != null && !a.value().isEmpty()) {
|
|
279
|
+
return Optional.of(a.value());
|
|
280
|
+
}
|
|
281
|
+
return super.getDefaultJsonString(getterMethod);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
public static class TaskDeserializerModule
|
|
286
|
+
extends Module // can't use just SimpleModule, due to generic types
|
|
287
|
+
{
|
|
288
|
+
protected final ObjectMapper nestedObjectMapper;
|
|
289
|
+
protected final ModelManager model;
|
|
290
|
+
|
|
291
|
+
public TaskDeserializerModule(ObjectMapper nestedObjectMapper, ModelManager model)
|
|
292
|
+
{
|
|
293
|
+
this.nestedObjectMapper = nestedObjectMapper;
|
|
294
|
+
this.model = model;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
@Override
|
|
298
|
+
public String getModuleName() { return "embulk.config.TaskSerDe"; }
|
|
299
|
+
|
|
300
|
+
@Override
|
|
301
|
+
public Version version() { return Version.unknownVersion(); }
|
|
302
|
+
|
|
303
|
+
@Override
|
|
304
|
+
public void setupModule(SetupContext context)
|
|
305
|
+
{
|
|
306
|
+
context.addDeserializers(new Deserializers.Base() {
|
|
307
|
+
@Override
|
|
308
|
+
public JsonDeserializer<?> findBeanDeserializer(JavaType type, DeserializationConfig config,
|
|
309
|
+
BeanDescription beanDesc) throws JsonMappingException
|
|
310
|
+
{
|
|
311
|
+
Class<?> raw = type.getRawClass();
|
|
312
|
+
if (Task.class.isAssignableFrom(raw)) {
|
|
313
|
+
return newTaskDeserializer(raw);
|
|
314
|
+
}
|
|
315
|
+
return super.findBeanDeserializer(type, config, beanDesc);
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
@SuppressWarnings("unchecked")
|
|
321
|
+
protected JsonDeserializer<?> newTaskDeserializer(Class<?> raw)
|
|
322
|
+
{
|
|
323
|
+
return new TaskDeserializer(nestedObjectMapper, model, raw);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
public static class ConfigTaskDeserializerModule
|
|
328
|
+
extends TaskDeserializerModule
|
|
329
|
+
{
|
|
330
|
+
public ConfigTaskDeserializerModule(ObjectMapper nestedObjectMapper, ModelManager model)
|
|
331
|
+
{
|
|
332
|
+
super(nestedObjectMapper, model);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
@Override
|
|
336
|
+
public String getModuleName() { return "embulk.config.ConfigTaskSerDe"; }
|
|
337
|
+
|
|
338
|
+
@Override
|
|
339
|
+
@SuppressWarnings("unchecked")
|
|
340
|
+
protected JsonDeserializer<?> newTaskDeserializer(Class<?> raw)
|
|
341
|
+
{
|
|
342
|
+
return new ConfigTaskDeserializer(nestedObjectMapper, model, raw);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|