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,47 @@
|
|
|
1
|
+
package org.embulk.spi.type;
|
|
2
|
+
|
|
3
|
+
import java.util.HashMap;
|
|
4
|
+
import java.util.Map;
|
|
5
|
+
import java.io.IOException;
|
|
6
|
+
import com.google.common.base.Joiner;
|
|
7
|
+
import com.google.common.collect.ImmutableMap;
|
|
8
|
+
import com.fasterxml.jackson.databind.module.SimpleModule;
|
|
9
|
+
import com.fasterxml.jackson.databind.DeserializationContext;
|
|
10
|
+
import com.fasterxml.jackson.databind.deser.std.FromStringDeserializer;
|
|
11
|
+
import com.fasterxml.jackson.databind.JsonMappingException;
|
|
12
|
+
import org.embulk.config.ModelManager;
|
|
13
|
+
|
|
14
|
+
public class TypeDeserializer
|
|
15
|
+
extends FromStringDeserializer<Type>
|
|
16
|
+
{
|
|
17
|
+
private static final Map<String, Type> stringToTypeMap;
|
|
18
|
+
|
|
19
|
+
static {
|
|
20
|
+
ImmutableMap.Builder<String, Type> builder = ImmutableMap.builder();
|
|
21
|
+
builder.put(BooleanType.BOOLEAN.getName(), BooleanType.BOOLEAN);
|
|
22
|
+
builder.put(LongType.LONG.getName(), LongType.LONG);
|
|
23
|
+
builder.put(DoubleType.DOUBLE.getName(), DoubleType.DOUBLE);
|
|
24
|
+
builder.put(StringType.STRING.getName(), StringType.STRING);
|
|
25
|
+
builder.put(TimestampType.TIMESTAMP.getName(), TimestampType.TIMESTAMP);
|
|
26
|
+
stringToTypeMap = builder.build();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public TypeDeserializer()
|
|
30
|
+
{
|
|
31
|
+
super(Type.class);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
@Override
|
|
35
|
+
protected Type _deserialize(String value, DeserializationContext context)
|
|
36
|
+
throws IOException
|
|
37
|
+
{
|
|
38
|
+
Type t = stringToTypeMap.get(value);
|
|
39
|
+
if (t == null) {
|
|
40
|
+
throw new JsonMappingException(
|
|
41
|
+
String.format("Unknown type name '%s'. Supported types are: %s",
|
|
42
|
+
value,
|
|
43
|
+
Joiner.on(", ").join(stringToTypeMap.keySet())));
|
|
44
|
+
}
|
|
45
|
+
return t;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
package org.embulk.spi.type;
|
|
2
|
+
|
|
3
|
+
public class Types
|
|
4
|
+
{
|
|
5
|
+
public static final BooleanType BOOLEAN = BooleanType.BOOLEAN;
|
|
6
|
+
|
|
7
|
+
public static final LongType LONG = LongType.LONG;
|
|
8
|
+
|
|
9
|
+
public static final DoubleType DOUBLE = DoubleType.DOUBLE;
|
|
10
|
+
|
|
11
|
+
public static final StringType STRING = StringType.STRING;
|
|
12
|
+
|
|
13
|
+
public static final TimestampType TIMESTAMP = TimestampType.TIMESTAMP;
|
|
14
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
package org.embulk.spi.util;
|
|
2
|
+
|
|
3
|
+
import java.io.IOException;
|
|
4
|
+
import java.nio.charset.Charset;
|
|
5
|
+
import com.fasterxml.jackson.core.JsonGenerator;
|
|
6
|
+
import com.fasterxml.jackson.databind.module.SimpleModule;
|
|
7
|
+
import com.fasterxml.jackson.databind.SerializerProvider;
|
|
8
|
+
import com.fasterxml.jackson.databind.DeserializationContext;
|
|
9
|
+
import com.fasterxml.jackson.databind.JsonSerializer;
|
|
10
|
+
import com.fasterxml.jackson.databind.JsonMappingException;
|
|
11
|
+
import com.fasterxml.jackson.databind.deser.std.FromStringDeserializer;
|
|
12
|
+
import com.fasterxml.jackson.module.guice.ObjectMapperModule;
|
|
13
|
+
|
|
14
|
+
public class CharsetSerDe
|
|
15
|
+
{
|
|
16
|
+
public static void configure(ObjectMapperModule mapper)
|
|
17
|
+
{
|
|
18
|
+
SimpleModule module = new SimpleModule();
|
|
19
|
+
module.addSerializer(Charset.class, new CharsetSerializer());
|
|
20
|
+
module.addDeserializer(Charset.class, new CharsetDeserializer());
|
|
21
|
+
mapper.registerModule(module);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public static class CharsetSerializer
|
|
25
|
+
extends JsonSerializer<Charset>
|
|
26
|
+
{
|
|
27
|
+
@Override
|
|
28
|
+
public void serialize(Charset value, JsonGenerator jgen, SerializerProvider provider)
|
|
29
|
+
throws IOException
|
|
30
|
+
{
|
|
31
|
+
jgen.writeString(value.name());
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public static class CharsetDeserializer
|
|
36
|
+
extends FromStringDeserializer<Charset>
|
|
37
|
+
{
|
|
38
|
+
public CharsetDeserializer()
|
|
39
|
+
{
|
|
40
|
+
super(Charset.class);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
@Override
|
|
44
|
+
protected Charset _deserialize(String value, DeserializationContext context)
|
|
45
|
+
throws JsonMappingException
|
|
46
|
+
{
|
|
47
|
+
try {
|
|
48
|
+
return Charset.forName(value);
|
|
49
|
+
} catch (UnsupportedOperationException ex) {
|
|
50
|
+
// TODO include link to a document to the message for the list of supported time zones
|
|
51
|
+
throw new JsonMappingException(String.format("Unknown charset '%s'", value));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
package org.embulk.spi.util;
|
|
2
|
+
|
|
3
|
+
import java.util.List;
|
|
4
|
+
import com.google.common.collect.ImmutableList;
|
|
5
|
+
import org.embulk.config.TaskSource;
|
|
6
|
+
import org.embulk.config.ConfigSource;
|
|
7
|
+
import org.embulk.plugin.PluginType;
|
|
8
|
+
import org.embulk.spi.ExecSession;
|
|
9
|
+
import org.embulk.spi.FileInput;
|
|
10
|
+
import org.embulk.spi.DecoderPlugin;
|
|
11
|
+
|
|
12
|
+
public abstract class Decoders
|
|
13
|
+
{
|
|
14
|
+
private Decoders() { }
|
|
15
|
+
|
|
16
|
+
public static List<DecoderPlugin> newDecoderPlugins(ExecSession exec, List<ConfigSource> configs)
|
|
17
|
+
{
|
|
18
|
+
ImmutableList.Builder<DecoderPlugin> builder = ImmutableList.builder();
|
|
19
|
+
for (ConfigSource config : configs) {
|
|
20
|
+
builder.add(exec.newPlugin(DecoderPlugin.class, config.get(PluginType.class, "type")));
|
|
21
|
+
}
|
|
22
|
+
return builder.build();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public interface Control
|
|
26
|
+
{
|
|
27
|
+
public void run(List<TaskSource> taskSources);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public static void transaction(List<DecoderPlugin> plugins, List<ConfigSource> configs,
|
|
31
|
+
Decoders.Control control)
|
|
32
|
+
{
|
|
33
|
+
new RecursiveControl(plugins, configs, control).transaction();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public static FileInput open(List<DecoderPlugin> plugins, List<TaskSource> taskSources,
|
|
37
|
+
FileInput input)
|
|
38
|
+
{
|
|
39
|
+
FileInput in = input;
|
|
40
|
+
int pos = 0;
|
|
41
|
+
while (pos < plugins.size()) {
|
|
42
|
+
in = plugins.get(pos).open(taskSources.get(pos), in);
|
|
43
|
+
pos++;
|
|
44
|
+
}
|
|
45
|
+
return in;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
private static class RecursiveControl
|
|
49
|
+
{
|
|
50
|
+
private final List<DecoderPlugin> plugins;
|
|
51
|
+
private final List<ConfigSource> configs;
|
|
52
|
+
private final Decoders.Control finalControl;
|
|
53
|
+
private final ImmutableList.Builder<TaskSource> taskSources;
|
|
54
|
+
private int pos;
|
|
55
|
+
|
|
56
|
+
RecursiveControl(List<DecoderPlugin> plugins, List<ConfigSource> configs,
|
|
57
|
+
Decoders.Control finalControl)
|
|
58
|
+
{
|
|
59
|
+
this.plugins = plugins;
|
|
60
|
+
this.configs = configs;
|
|
61
|
+
this.finalControl = finalControl;
|
|
62
|
+
this.taskSources = ImmutableList.builder();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
public void transaction()
|
|
66
|
+
{
|
|
67
|
+
if (pos < plugins.size()) {
|
|
68
|
+
plugins.get(pos).transaction(configs.get(pos), new DecoderPlugin.Control() {
|
|
69
|
+
public void run(TaskSource taskSource)
|
|
70
|
+
{
|
|
71
|
+
taskSources.add(taskSource);
|
|
72
|
+
pos++;
|
|
73
|
+
transaction();
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
} else {
|
|
77
|
+
finalControl.run(taskSources.build());
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
package org.embulk.spi.util;
|
|
2
|
+
|
|
3
|
+
import java.util.List;
|
|
4
|
+
import com.google.common.collect.ImmutableList;
|
|
5
|
+
import org.embulk.config.TaskSource;
|
|
6
|
+
import org.embulk.config.ConfigSource;
|
|
7
|
+
import org.embulk.plugin.PluginType;
|
|
8
|
+
import org.embulk.spi.ExecSession;
|
|
9
|
+
import org.embulk.spi.FileOutput;
|
|
10
|
+
import org.embulk.spi.EncoderPlugin;
|
|
11
|
+
|
|
12
|
+
public abstract class Encoders
|
|
13
|
+
{
|
|
14
|
+
private Encoders() { }
|
|
15
|
+
|
|
16
|
+
public static List<EncoderPlugin> newEncoderPlugins(ExecSession exec, List<ConfigSource> configs)
|
|
17
|
+
{
|
|
18
|
+
ImmutableList.Builder<EncoderPlugin> builder = ImmutableList.builder();
|
|
19
|
+
for (ConfigSource config : configs) {
|
|
20
|
+
builder.add(exec.newPlugin(EncoderPlugin.class, config.get(PluginType.class, "type")));
|
|
21
|
+
}
|
|
22
|
+
return builder.build();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public interface Control
|
|
26
|
+
{
|
|
27
|
+
public void run(List<TaskSource> taskSources);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public static void transaction(List<EncoderPlugin> plugins, List<ConfigSource> configs,
|
|
31
|
+
Encoders.Control control)
|
|
32
|
+
{
|
|
33
|
+
new RecursiveControl(plugins, configs, control).transaction();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public static FileOutput open(List<EncoderPlugin> plugins, List<TaskSource> taskSources,
|
|
37
|
+
FileOutput output)
|
|
38
|
+
{
|
|
39
|
+
FileOutput out = output;
|
|
40
|
+
int pos = 0;
|
|
41
|
+
while (pos < plugins.size()) {
|
|
42
|
+
out = plugins.get(pos).open(taskSources.get(pos), out);
|
|
43
|
+
pos++;
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
private static class RecursiveControl
|
|
49
|
+
{
|
|
50
|
+
private final List<EncoderPlugin> plugins;
|
|
51
|
+
private final List<ConfigSource> configs;
|
|
52
|
+
private final Encoders.Control finalControl;
|
|
53
|
+
private final ImmutableList.Builder<TaskSource> taskSources;
|
|
54
|
+
private int pos;
|
|
55
|
+
|
|
56
|
+
RecursiveControl(List<EncoderPlugin> plugins, List<ConfigSource> configs,
|
|
57
|
+
Encoders.Control finalControl)
|
|
58
|
+
{
|
|
59
|
+
this.plugins = plugins;
|
|
60
|
+
this.configs = configs;
|
|
61
|
+
this.finalControl = finalControl;
|
|
62
|
+
this.taskSources = ImmutableList.builder();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
public void transaction()
|
|
66
|
+
{
|
|
67
|
+
if (pos < plugins.size()) {
|
|
68
|
+
plugins.get(pos).transaction(configs.get(pos), new EncoderPlugin.Control() {
|
|
69
|
+
public void run(TaskSource taskSource)
|
|
70
|
+
{
|
|
71
|
+
taskSources.add(taskSource);
|
|
72
|
+
pos++;
|
|
73
|
+
transaction();
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
} else {
|
|
77
|
+
finalControl.run(taskSources.build());
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
package org.embulk.spi.util;
|
|
2
|
+
|
|
3
|
+
import java.io.InputStream;
|
|
4
|
+
import org.embulk.spi.Buffer;
|
|
5
|
+
import org.embulk.spi.FileInput;
|
|
6
|
+
|
|
7
|
+
public class FileInputInputStream
|
|
8
|
+
extends InputStream
|
|
9
|
+
{
|
|
10
|
+
private final FileInput in;
|
|
11
|
+
private int pos;
|
|
12
|
+
private Buffer buffer = Buffer.EMPTY;
|
|
13
|
+
|
|
14
|
+
public FileInputInputStream(FileInput in)
|
|
15
|
+
{
|
|
16
|
+
this.in = in;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public boolean markSupported()
|
|
20
|
+
{
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public boolean nextFile()
|
|
25
|
+
{
|
|
26
|
+
releaseBuffer();
|
|
27
|
+
return in.nextFile();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
@Override
|
|
31
|
+
public int available()
|
|
32
|
+
{
|
|
33
|
+
return buffer.limit() - pos;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@Override
|
|
37
|
+
public int read()
|
|
38
|
+
{
|
|
39
|
+
while (pos >= buffer.limit()) {
|
|
40
|
+
if (!nextBuffer()) {
|
|
41
|
+
return -1;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
byte b = buffer.array()[buffer.offset() + pos];
|
|
45
|
+
pos++;
|
|
46
|
+
if (pos >= buffer.limit()) {
|
|
47
|
+
releaseBuffer();
|
|
48
|
+
}
|
|
49
|
+
return b & 0xff;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@Override
|
|
53
|
+
public int read(byte[] b, int off, int len)
|
|
54
|
+
{
|
|
55
|
+
while (pos >= buffer.limit()) {
|
|
56
|
+
if (!nextBuffer()) {
|
|
57
|
+
return -1;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
int remaining = buffer.limit() - pos;
|
|
61
|
+
boolean allConsumed;
|
|
62
|
+
if (remaining <= len) {
|
|
63
|
+
allConsumed = true;
|
|
64
|
+
len = remaining;
|
|
65
|
+
} else {
|
|
66
|
+
allConsumed = false;
|
|
67
|
+
}
|
|
68
|
+
if (b != null) {
|
|
69
|
+
// b == null if skip
|
|
70
|
+
buffer.getBytes(pos, b, off, len);
|
|
71
|
+
}
|
|
72
|
+
if (allConsumed) {
|
|
73
|
+
releaseBuffer();
|
|
74
|
+
} else {
|
|
75
|
+
pos += len;
|
|
76
|
+
}
|
|
77
|
+
return len;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
@Override
|
|
81
|
+
public long skip(long len)
|
|
82
|
+
{
|
|
83
|
+
return read(null, 0, (int) Math.min(len, Integer.MAX_VALUE));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
private boolean nextBuffer()
|
|
87
|
+
{
|
|
88
|
+
releaseBuffer();
|
|
89
|
+
Buffer b = in.poll();
|
|
90
|
+
if (b == null) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
buffer = b;
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
private void releaseBuffer()
|
|
98
|
+
{
|
|
99
|
+
buffer.release();
|
|
100
|
+
buffer = Buffer.EMPTY;
|
|
101
|
+
pos = 0;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
@Override
|
|
105
|
+
public void close()
|
|
106
|
+
{
|
|
107
|
+
releaseBuffer();
|
|
108
|
+
in.close();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
package org.embulk.spi.util;
|
|
2
|
+
|
|
3
|
+
import java.io.OutputStream;
|
|
4
|
+
import org.embulk.spi.Buffer;
|
|
5
|
+
import org.embulk.spi.BufferAllocator;
|
|
6
|
+
import org.embulk.spi.FileOutput;
|
|
7
|
+
|
|
8
|
+
public class FileOutputOutputStream
|
|
9
|
+
extends OutputStream
|
|
10
|
+
{
|
|
11
|
+
private final FileOutput out;
|
|
12
|
+
private final BufferAllocator allocator;
|
|
13
|
+
private int pos;
|
|
14
|
+
private Buffer buffer;
|
|
15
|
+
|
|
16
|
+
public FileOutputOutputStream(FileOutput out, BufferAllocator allocator)
|
|
17
|
+
{
|
|
18
|
+
this.out = out;
|
|
19
|
+
this.allocator = allocator;
|
|
20
|
+
this.buffer = allocator.allocate();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public void nextFile()
|
|
24
|
+
{
|
|
25
|
+
out.nextFile();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@Override
|
|
29
|
+
public void write(int b)
|
|
30
|
+
{
|
|
31
|
+
buffer.array()[buffer.offset() + pos] = (byte) b;
|
|
32
|
+
pos++;
|
|
33
|
+
if (pos >= buffer.capacity()) {
|
|
34
|
+
flush();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@Override
|
|
39
|
+
public void write(byte[] b, int off, int len)
|
|
40
|
+
{
|
|
41
|
+
while (true) {
|
|
42
|
+
int available = buffer.capacity() - pos;
|
|
43
|
+
if (available < len) {
|
|
44
|
+
buffer.setBytes(pos, b, off, available);
|
|
45
|
+
pos += available;
|
|
46
|
+
len -= available;
|
|
47
|
+
off += available;
|
|
48
|
+
flush();
|
|
49
|
+
} else {
|
|
50
|
+
buffer.setBytes(pos, b, off, len);
|
|
51
|
+
pos += len;
|
|
52
|
+
if (available <= len) {
|
|
53
|
+
flush();
|
|
54
|
+
}
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
private boolean doFlush()
|
|
61
|
+
{
|
|
62
|
+
if (pos > 0) {
|
|
63
|
+
buffer.limit(pos);
|
|
64
|
+
out.add(buffer);
|
|
65
|
+
buffer = Buffer.EMPTY;
|
|
66
|
+
pos = 0;
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
@Override
|
|
73
|
+
public void flush()
|
|
74
|
+
{
|
|
75
|
+
if (doFlush()) {
|
|
76
|
+
buffer = allocator.allocate();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public void finish()
|
|
81
|
+
{
|
|
82
|
+
doFlush();
|
|
83
|
+
out.finish();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
@Override
|
|
87
|
+
public void close()
|
|
88
|
+
{
|
|
89
|
+
out.close();
|
|
90
|
+
buffer.release();
|
|
91
|
+
buffer = Buffer.EMPTY;
|
|
92
|
+
pos = 0;
|
|
93
|
+
}
|
|
94
|
+
}
|