embulk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/.gitignore +13 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +33 -0
- data/README.md +117 -0
- data/Rakefile +58 -0
- data/bin/embulk +63 -0
- data/build.gradle +149 -0
- data/embulk-cli/build.gradle +6 -0
- data/embulk-cli/pom.xml +94 -0
- data/embulk-cli/src/main/java/org/embulk/cli/Main.java +15 -0
- data/embulk-core/build.gradle +6 -0
- data/embulk-core/pom.xml +143 -0
- data/embulk-core/src/main/java/org/embulk/EmbulkService.java +39 -0
- data/embulk-core/src/main/java/org/embulk/command/Runner.java +199 -0
- data/embulk-core/src/main/java/org/embulk/command/TablePrinter.java +119 -0
- data/embulk-core/src/main/java/org/embulk/config/CommitReport.java +26 -0
- data/embulk-core/src/main/java/org/embulk/config/Config.java +15 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigDefault.java +15 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigException.java +20 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigLoader.java +83 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigSource.java +28 -0
- data/embulk-core/src/main/java/org/embulk/config/DataSource.java +35 -0
- data/embulk-core/src/main/java/org/embulk/config/DataSourceImpl.java +208 -0
- data/embulk-core/src/main/java/org/embulk/config/DataSourceSerDe.java +80 -0
- data/embulk-core/src/main/java/org/embulk/config/GenericTypeReference.java +20 -0
- data/embulk-core/src/main/java/org/embulk/config/ModelManager.java +125 -0
- data/embulk-core/src/main/java/org/embulk/config/NextConfig.java +26 -0
- data/embulk-core/src/main/java/org/embulk/config/Task.java +10 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskInvocationHandler.java +180 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskSerDe.java +343 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskSource.java +28 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskValidationException.java +37 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskValidator.java +24 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExecModule.java +45 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExecuteInterruptedException.java +10 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExecuteResult.java +19 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExtensionServiceLoaderModule.java +43 -0
- data/embulk-core/src/main/java/org/embulk/exec/ForSystemConfig.java +16 -0
- data/embulk-core/src/main/java/org/embulk/exec/GuessExecutor.java +307 -0
- data/embulk-core/src/main/java/org/embulk/exec/LocalExecutor.java +274 -0
- data/embulk-core/src/main/java/org/embulk/exec/LoggerProvider.java +30 -0
- data/embulk-core/src/main/java/org/embulk/exec/NoSampleException.java +10 -0
- data/embulk-core/src/main/java/org/embulk/exec/PooledBufferAllocator.java +58 -0
- data/embulk-core/src/main/java/org/embulk/exec/PreviewExecutor.java +138 -0
- data/embulk-core/src/main/java/org/embulk/exec/PreviewResult.java +27 -0
- data/embulk-core/src/main/java/org/embulk/exec/PreviewedNoticeError.java +17 -0
- data/embulk-core/src/main/java/org/embulk/exec/SamplingParserPlugin.java +116 -0
- data/embulk-core/src/main/java/org/embulk/exec/SystemConfigModule.java +24 -0
- data/embulk-core/src/main/java/org/embulk/jruby/JRubyPluginSource.java +69 -0
- data/embulk-core/src/main/java/org/embulk/jruby/JRubyScriptingModule.java +100 -0
- data/embulk-core/src/main/java/org/embulk/plugin/BuiltinPluginSourceModule.java +17 -0
- data/embulk-core/src/main/java/org/embulk/plugin/InjectedPluginSource.java +92 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginManager.java +34 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginSource.java +6 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginSourceNotMatchException.java +19 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginType.java +47 -0
- data/embulk-core/src/main/java/org/embulk/plugin/SetThreadContextClassLoader.java +19 -0
- data/embulk-core/src/main/java/org/embulk/spi/Buffer.java +113 -0
- data/embulk-core/src/main/java/org/embulk/spi/BufferAllocator.java +8 -0
- data/embulk-core/src/main/java/org/embulk/spi/Column.java +92 -0
- data/embulk-core/src/main/java/org/embulk/spi/ColumnConfig.java +79 -0
- data/embulk-core/src/main/java/org/embulk/spi/DecoderPlugin.java +16 -0
- data/embulk-core/src/main/java/org/embulk/spi/EncoderPlugin.java +16 -0
- data/embulk-core/src/main/java/org/embulk/spi/Exec.java +76 -0
- data/embulk-core/src/main/java/org/embulk/spi/ExecAction.java +6 -0
- data/embulk-core/src/main/java/org/embulk/spi/ExecSession.java +105 -0
- data/embulk-core/src/main/java/org/embulk/spi/Extension.java +42 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileInput.java +11 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileInputPlugin.java +19 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileInputRunner.java +113 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileOutput.java +13 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileOutputPlugin.java +20 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileOutputRunner.java +167 -0
- data/embulk-core/src/main/java/org/embulk/spi/FormatterPlugin.java +18 -0
- data/embulk-core/src/main/java/org/embulk/spi/GuessPlugin.java +9 -0
- data/embulk-core/src/main/java/org/embulk/spi/InputPlugin.java +20 -0
- data/embulk-core/src/main/java/org/embulk/spi/OutputPlugin.java +21 -0
- data/embulk-core/src/main/java/org/embulk/spi/Page.java +45 -0
- data/embulk-core/src/main/java/org/embulk/spi/PageBuilder.java +327 -0
- data/embulk-core/src/main/java/org/embulk/spi/PageFormat.java +47 -0
- data/embulk-core/src/main/java/org/embulk/spi/PageOutput.java +11 -0
- data/embulk-core/src/main/java/org/embulk/spi/PageReader.java +227 -0
- data/embulk-core/src/main/java/org/embulk/spi/ParserPlugin.java +17 -0
- data/embulk-core/src/main/java/org/embulk/spi/Schema.java +101 -0
- data/embulk-core/src/main/java/org/embulk/spi/SchemaConfig.java +52 -0
- data/embulk-core/src/main/java/org/embulk/spi/SchemaVisitor.java +14 -0
- data/embulk-core/src/main/java/org/embulk/spi/Transactional.java +10 -0
- data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileInput.java +17 -0
- data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileOutput.java +19 -0
- data/embulk-core/src/main/java/org/embulk/spi/TransactionalPageOutput.java +17 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/DateTimeZoneSerDe.java +57 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelper.java +8 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelperFactory.java +6 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/Timestamp.java +159 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormat.java +98 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormatter.java +55 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParseException.java +6 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParser.java +60 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampSerDe.java +50 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/AbstractType.java +55 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/BooleanType.java +12 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/DoubleType.java +12 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/LongType.java +12 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/StringType.java +12 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/TimestampType.java +39 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/Type.java +15 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/TypeDeserializer.java +47 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/Types.java +14 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/CharsetSerDe.java +55 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Decoders.java +81 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Encoders.java +81 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/FileInputInputStream.java +110 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/FileOutputOutputStream.java +94 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/InputStreamFileInput.java +111 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Inputs.java +74 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/LineDecoder.java +118 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/LineEncoder.java +109 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/ListFileInput.java +52 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Newline.java +38 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/PagePrinter.java +102 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Pages.java +139 -0
- data/embulk-core/src/test/java/org/embulk/EmbulkTestRuntime.java +110 -0
- data/embulk-core/src/test/java/org/embulk/GuiceBinder.java +72 -0
- data/embulk-core/src/test/java/org/embulk/RandomManager.java +53 -0
- data/embulk-core/src/test/java/org/embulk/TestPluginSourceModule.java +23 -0
- data/embulk-core/src/test/java/org/embulk/TestUtilityModule.java +17 -0
- data/embulk-core/src/test/java/org/embulk/config/TestConfigSource.java +114 -0
- data/embulk-core/src/test/java/org/embulk/config/TestTaskSource.java +70 -0
- data/embulk-core/src/test/java/org/embulk/plugin/MockPluginSource.java +57 -0
- data/embulk-core/src/test/java/org/embulk/plugin/TestPluginType.java +18 -0
- data/embulk-core/src/test/java/org/embulk/spi/MockFileOutput.java +63 -0
- data/embulk-core/src/test/java/org/embulk/spi/MockFormatterPlugin.java +101 -0
- data/embulk-core/src/test/java/org/embulk/spi/MockParserPlugin.java +73 -0
- data/embulk-core/src/test/java/org/embulk/spi/PageTestUtils.java +78 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestFileInputInputStream.java +67 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestFileInputRunner.java +180 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestFileOutputRunner.java +192 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestInputStreamFileInput.java +188 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestPageBuilderReader.java +301 -0
- data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestamp.java +116 -0
- data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestampFormatterParser.java +52 -0
- data/embulk-core/src/test/java/org/embulk/spi/type/TestTypeSerDe.java +45 -0
- data/embulk-core/src/test/java/org/embulk/spi/util/TestLineDecoder.java +132 -0
- data/embulk-core/src/test/java/org/embulk/spi/util/TestLineEncoder.java +123 -0
- data/embulk-standards/build.gradle +6 -0
- data/embulk-standards/pom.xml +68 -0
- data/embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java +158 -0
- data/embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java +233 -0
- data/embulk-standards/src/main/java/org/embulk/standards/CsvTokenizer.java +355 -0
- data/embulk-standards/src/main/java/org/embulk/standards/GzipFileDecoderPlugin.java +55 -0
- data/embulk-standards/src/main/java/org/embulk/standards/GzipFileEncoderPlugin.java +39 -0
- data/embulk-standards/src/main/java/org/embulk/standards/LocalFileInputPlugin.java +138 -0
- data/embulk-standards/src/main/java/org/embulk/standards/LocalFileOutputPlugin.java +128 -0
- data/embulk-standards/src/main/java/org/embulk/standards/NullOutputPlugin.java +46 -0
- data/embulk-standards/src/main/java/org/embulk/standards/S3FileInputPlugin.java +238 -0
- data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginExtension.java +16 -0
- data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginModule.java +44 -0
- data/embulk-standards/src/main/java/org/embulk/standards/StdoutOutputPlugin.java +71 -0
- data/embulk-standards/src/main/resources/META-INF/services/org.embulk.spi.Extension +1 -0
- data/embulk-standards/src/test/java/org/embulk/standards/TestCsvParserPlugin.java +69 -0
- data/embulk-standards/src/test/java/org/embulk/standards/TestCsvTokenizer.java +291 -0
- data/embulk-standards/src/test/java/org/embulk/standards/TestS3FileInputPlugin.java +43 -0
- data/embulk.gemspec +27 -0
- data/examples/config.yml +34 -0
- data/examples/csv/sample.csv.gz +0 -0
- data/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/gradle/wrapper/gradle-wrapper.properties +6 -0
- data/gradlew +164 -0
- data/gradlew.bat +90 -0
- data/lib/embulk.rb +16 -0
- data/lib/embulk/buffer.rb +17 -0
- data/lib/embulk/column.rb +47 -0
- data/lib/embulk/command/embulk.rb +39 -0
- data/lib/embulk/command/embulk_example.rb +32 -0
- data/lib/embulk/command/embulk_generate_bin.rb +62 -0
- data/lib/embulk/command/embulk_run.rb +243 -0
- data/lib/embulk/data/bundle/.bundle/config +3 -0
- data/lib/embulk/data/bundle/Gemfile +31 -0
- data/lib/embulk/data/bundle/Gemfile.lock +8 -0
- data/lib/embulk/data/bundle/embulk/input_example.rb +40 -0
- data/lib/embulk/data/bundle/embulk/output_example.rb +51 -0
- data/lib/embulk/data_source.rb +66 -0
- data/lib/embulk/error.rb +5 -0
- data/lib/embulk/guess_charset.rb +26 -0
- data/lib/embulk/guess_csv.rb +195 -0
- data/lib/embulk/guess_gzip.rb +18 -0
- data/lib/embulk/guess_newline.rb +20 -0
- data/lib/embulk/guess_plugin.rb +113 -0
- data/lib/embulk/input_plugin.rb +53 -0
- data/lib/embulk/java/bootstrap.rb +12 -0
- data/lib/embulk/java/imports.rb +26 -0
- data/lib/embulk/java/time_helper.rb +77 -0
- data/lib/embulk/output_plugin.rb +104 -0
- data/lib/embulk/page.rb +28 -0
- data/lib/embulk/page_builder.rb +22 -0
- data/lib/embulk/plugin.rb +152 -0
- data/lib/embulk/plugin_registry.rb +70 -0
- data/lib/embulk/schema.rb +85 -0
- data/lib/embulk/time_format_guess.rb +331 -0
- data/lib/embulk/version.rb +3 -0
- data/pom.xml +533 -0
- data/settings.gradle +5 -0
- metadata +370 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
package org.embulk.config;
|
|
2
|
+
|
|
3
|
+
import java.io.IOException;
|
|
4
|
+
import com.google.inject.Inject;
|
|
5
|
+
import com.fasterxml.jackson.core.JsonGenerator;
|
|
6
|
+
import com.fasterxml.jackson.core.JsonParser;
|
|
7
|
+
import com.fasterxml.jackson.databind.module.SimpleModule;
|
|
8
|
+
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
9
|
+
import com.fasterxml.jackson.databind.JsonSerializer;
|
|
10
|
+
import com.fasterxml.jackson.databind.JsonDeserializer;
|
|
11
|
+
import com.fasterxml.jackson.databind.SerializerProvider;
|
|
12
|
+
import com.fasterxml.jackson.databind.DeserializationContext;
|
|
13
|
+
import com.fasterxml.jackson.databind.JsonNode;
|
|
14
|
+
import com.fasterxml.jackson.databind.JsonMappingException;
|
|
15
|
+
import com.fasterxml.jackson.databind.node.ObjectNode;
|
|
16
|
+
import com.fasterxml.jackson.module.guice.ObjectMapperModule;
|
|
17
|
+
|
|
18
|
+
public class DataSourceSerDe
|
|
19
|
+
{
|
|
20
|
+
public static class SerDeModule
|
|
21
|
+
extends SimpleModule
|
|
22
|
+
{
|
|
23
|
+
public SerDeModule(final ModelManager model)
|
|
24
|
+
{
|
|
25
|
+
// DataSourceImpl
|
|
26
|
+
addSerializer(DataSourceImpl.class, new DataSourceSerializer<DataSourceImpl>());
|
|
27
|
+
addDeserializer(DataSourceImpl.class, new DataSourceDeserializer<DataSourceImpl>(model));
|
|
28
|
+
|
|
29
|
+
// ConfigSource
|
|
30
|
+
addSerializer(ConfigSource.class, new DataSourceSerializer<ConfigSource>());
|
|
31
|
+
addDeserializer(ConfigSource.class, new DataSourceDeserializer<ConfigSource>(model));
|
|
32
|
+
|
|
33
|
+
// TaskSource
|
|
34
|
+
addSerializer(TaskSource.class, new DataSourceSerializer<TaskSource>());
|
|
35
|
+
addDeserializer(TaskSource.class, new DataSourceDeserializer<TaskSource>(model));
|
|
36
|
+
|
|
37
|
+
// CommitReport
|
|
38
|
+
addSerializer(CommitReport.class, new DataSourceSerializer<CommitReport>());
|
|
39
|
+
addDeserializer(CommitReport.class, new DataSourceDeserializer<CommitReport>(model));
|
|
40
|
+
|
|
41
|
+
// NextConfig
|
|
42
|
+
addSerializer(NextConfig.class, new DataSourceSerializer<NextConfig>());
|
|
43
|
+
addDeserializer(NextConfig.class, new DataSourceDeserializer<NextConfig>(model));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
private static class DataSourceDeserializer <T extends DataSource> // TODO T extends DataSource super DataSourceImpl
|
|
48
|
+
extends JsonDeserializer<T>
|
|
49
|
+
{
|
|
50
|
+
private final ModelManager model;
|
|
51
|
+
private final ObjectMapper treeObjectMapper;
|
|
52
|
+
|
|
53
|
+
DataSourceDeserializer(ModelManager model)
|
|
54
|
+
{
|
|
55
|
+
this.model = model;
|
|
56
|
+
this.treeObjectMapper = new ObjectMapper();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@Override
|
|
60
|
+
public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException
|
|
61
|
+
{
|
|
62
|
+
JsonNode json = treeObjectMapper.readTree(jp);
|
|
63
|
+
if (!json.isObject()) {
|
|
64
|
+
throw new JsonMappingException("Expected object to deserialize DataSource", jp.getCurrentLocation());
|
|
65
|
+
}
|
|
66
|
+
return (T) new DataSourceImpl(model, (ObjectNode) json);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
private static class DataSourceSerializer <T extends DataSource>
|
|
71
|
+
extends JsonSerializer<T>
|
|
72
|
+
{
|
|
73
|
+
@Override
|
|
74
|
+
public void serialize(T value, JsonGenerator jgen, SerializerProvider provider)
|
|
75
|
+
throws IOException
|
|
76
|
+
{
|
|
77
|
+
value.getObjectNode().serialize(jgen, provider);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -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,125 @@
|
|
|
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.Module;
|
|
10
|
+
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
11
|
+
import com.fasterxml.jackson.databind.JsonNode;
|
|
12
|
+
import com.fasterxml.jackson.databind.node.ObjectNode;
|
|
13
|
+
import com.fasterxml.jackson.databind.JsonMappingException;
|
|
14
|
+
|
|
15
|
+
public class ModelManager
|
|
16
|
+
{
|
|
17
|
+
private final Injector injector;
|
|
18
|
+
private final ObjectMapper objectMapper;
|
|
19
|
+
private final ObjectMapper configObjectMapper; // configObjectMapper uses different TaskDeserializer
|
|
20
|
+
private final TaskValidator taskValidator;
|
|
21
|
+
|
|
22
|
+
@Inject
|
|
23
|
+
public ModelManager(Injector injector, ObjectMapper objectMapper)
|
|
24
|
+
{
|
|
25
|
+
this.injector = injector;
|
|
26
|
+
this.objectMapper = objectMapper;
|
|
27
|
+
this.configObjectMapper = objectMapper.copy();
|
|
28
|
+
this.taskValidator = new TaskValidator(
|
|
29
|
+
Validation.byProvider(ApacheValidationProvider.class).configure().buildValidatorFactory().getValidator());
|
|
30
|
+
|
|
31
|
+
objectMapper.registerModule(new TaskSerDe.TaskSerializerModule(objectMapper));
|
|
32
|
+
objectMapper.registerModule(new TaskSerDe.TaskDeserializerModule(objectMapper, this));
|
|
33
|
+
objectMapper.registerModule(new DataSourceSerDe.SerDeModule(this));
|
|
34
|
+
configObjectMapper.registerModule(new TaskSerDe.TaskSerializerModule(configObjectMapper));
|
|
35
|
+
configObjectMapper.registerModule(new TaskSerDe.ConfigTaskDeserializerModule(configObjectMapper, this));
|
|
36
|
+
configObjectMapper.registerModule(new DataSourceSerDe.SerDeModule(this));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
public <T> T readObject(Class<T> valueType, String json)
|
|
40
|
+
{
|
|
41
|
+
try {
|
|
42
|
+
return objectMapper.readValue(json, valueType);
|
|
43
|
+
} catch (Exception ex) {
|
|
44
|
+
throw Throwables.propagate(ex);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public <T> T readObject(Class<T> valueType, JsonParser parser)
|
|
49
|
+
{
|
|
50
|
+
try {
|
|
51
|
+
return objectMapper.readValue(parser, valueType);
|
|
52
|
+
} catch (Exception ex) {
|
|
53
|
+
throw Throwables.propagate(ex);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public <T> T readObjectWithConfigSerDe(Class<T> valueType, String json)
|
|
58
|
+
{
|
|
59
|
+
T t;
|
|
60
|
+
try {
|
|
61
|
+
t = configObjectMapper.readValue(json, valueType);
|
|
62
|
+
} catch (Exception ex) {
|
|
63
|
+
Throwables.propagateIfInstanceOf(ex, ConfigException.class);
|
|
64
|
+
throw new ConfigException(ex);
|
|
65
|
+
}
|
|
66
|
+
validate(t);
|
|
67
|
+
return t;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public <T> T readObjectWithConfigSerDe(Class<T> valueType, JsonParser parser)
|
|
71
|
+
{
|
|
72
|
+
T t;
|
|
73
|
+
try {
|
|
74
|
+
t = configObjectMapper.readValue(parser, valueType);
|
|
75
|
+
} catch (Exception ex) {
|
|
76
|
+
Throwables.propagateIfInstanceOf(ex, ConfigException.class);
|
|
77
|
+
throw new ConfigException(ex);
|
|
78
|
+
}
|
|
79
|
+
validate(t);
|
|
80
|
+
return t;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
public String writeObject(Object object)
|
|
84
|
+
{
|
|
85
|
+
try {
|
|
86
|
+
return objectMapper.writeValueAsString(object);
|
|
87
|
+
} catch (Exception ex) {
|
|
88
|
+
throw Throwables.propagate(ex);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public void validate(Object object)
|
|
93
|
+
{
|
|
94
|
+
taskValidator.validateModel(object);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// visible for DataSource.set
|
|
98
|
+
JsonNode writeObjectAsJsonNode(Object v)
|
|
99
|
+
{
|
|
100
|
+
String json = writeObject(v);
|
|
101
|
+
try {
|
|
102
|
+
return objectMapper.readValue(json, JsonNode.class);
|
|
103
|
+
} catch (Exception ex) {
|
|
104
|
+
throw Throwables.propagate(ex);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// visible for TaskInvocationHandler.invokeDump
|
|
109
|
+
ObjectNode writeObjectAsObjectNode(Object v)
|
|
110
|
+
{
|
|
111
|
+
String json = writeObject(v);
|
|
112
|
+
try {
|
|
113
|
+
return objectMapper.readValue(json, ObjectNode.class);
|
|
114
|
+
} catch (Exception ex) {
|
|
115
|
+
throw Throwables.propagate(ex);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// visible for TaskSerDe.set
|
|
120
|
+
// TODO create annotation calss and get its instance at the 2nd argument
|
|
121
|
+
<T> T getInjectedInstance(Class<T> type)
|
|
122
|
+
{
|
|
123
|
+
return injector.getInstance(type);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
package org.embulk.config;
|
|
2
|
+
|
|
3
|
+
public interface NextConfig
|
|
4
|
+
extends DataSource
|
|
5
|
+
{
|
|
6
|
+
@Override
|
|
7
|
+
public NextConfig getNested(String attrName);
|
|
8
|
+
|
|
9
|
+
@Override
|
|
10
|
+
public NextConfig getNestedOrSetEmpty(String attrName);
|
|
11
|
+
|
|
12
|
+
@Override
|
|
13
|
+
public NextConfig set(String attrName, Object v);
|
|
14
|
+
|
|
15
|
+
@Override
|
|
16
|
+
public NextConfig setNested(String attrName, DataSource v);
|
|
17
|
+
|
|
18
|
+
@Override
|
|
19
|
+
public NextConfig setAll(DataSource other);
|
|
20
|
+
|
|
21
|
+
@Override
|
|
22
|
+
public NextConfig deepCopy();
|
|
23
|
+
|
|
24
|
+
@Override
|
|
25
|
+
public NextConfig merge(DataSource other);
|
|
26
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
package org.embulk.config;
|
|
2
|
+
|
|
3
|
+
public interface Task
|
|
4
|
+
{
|
|
5
|
+
public void validate();
|
|
6
|
+
// TODO public void validateConfig();
|
|
7
|
+
// ConfigSource.loadTask calls validateConfig and it validates only fields that have Config annotation
|
|
8
|
+
|
|
9
|
+
public TaskSource dump();
|
|
10
|
+
}
|
|
@@ -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
|
+
}
|