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.
Files changed (204) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +13 -0
  3. data/Gemfile +3 -0
  4. data/Gemfile.lock +33 -0
  5. data/README.md +117 -0
  6. data/Rakefile +58 -0
  7. data/bin/embulk +63 -0
  8. data/build.gradle +149 -0
  9. data/embulk-cli/build.gradle +6 -0
  10. data/embulk-cli/pom.xml +94 -0
  11. data/embulk-cli/src/main/java/org/embulk/cli/Main.java +15 -0
  12. data/embulk-core/build.gradle +6 -0
  13. data/embulk-core/pom.xml +143 -0
  14. data/embulk-core/src/main/java/org/embulk/EmbulkService.java +39 -0
  15. data/embulk-core/src/main/java/org/embulk/command/Runner.java +199 -0
  16. data/embulk-core/src/main/java/org/embulk/command/TablePrinter.java +119 -0
  17. data/embulk-core/src/main/java/org/embulk/config/CommitReport.java +26 -0
  18. data/embulk-core/src/main/java/org/embulk/config/Config.java +15 -0
  19. data/embulk-core/src/main/java/org/embulk/config/ConfigDefault.java +15 -0
  20. data/embulk-core/src/main/java/org/embulk/config/ConfigException.java +20 -0
  21. data/embulk-core/src/main/java/org/embulk/config/ConfigLoader.java +83 -0
  22. data/embulk-core/src/main/java/org/embulk/config/ConfigSource.java +28 -0
  23. data/embulk-core/src/main/java/org/embulk/config/DataSource.java +35 -0
  24. data/embulk-core/src/main/java/org/embulk/config/DataSourceImpl.java +208 -0
  25. data/embulk-core/src/main/java/org/embulk/config/DataSourceSerDe.java +80 -0
  26. data/embulk-core/src/main/java/org/embulk/config/GenericTypeReference.java +20 -0
  27. data/embulk-core/src/main/java/org/embulk/config/ModelManager.java +125 -0
  28. data/embulk-core/src/main/java/org/embulk/config/NextConfig.java +26 -0
  29. data/embulk-core/src/main/java/org/embulk/config/Task.java +10 -0
  30. data/embulk-core/src/main/java/org/embulk/config/TaskInvocationHandler.java +180 -0
  31. data/embulk-core/src/main/java/org/embulk/config/TaskSerDe.java +343 -0
  32. data/embulk-core/src/main/java/org/embulk/config/TaskSource.java +28 -0
  33. data/embulk-core/src/main/java/org/embulk/config/TaskValidationException.java +37 -0
  34. data/embulk-core/src/main/java/org/embulk/config/TaskValidator.java +24 -0
  35. data/embulk-core/src/main/java/org/embulk/exec/ExecModule.java +45 -0
  36. data/embulk-core/src/main/java/org/embulk/exec/ExecuteInterruptedException.java +10 -0
  37. data/embulk-core/src/main/java/org/embulk/exec/ExecuteResult.java +19 -0
  38. data/embulk-core/src/main/java/org/embulk/exec/ExtensionServiceLoaderModule.java +43 -0
  39. data/embulk-core/src/main/java/org/embulk/exec/ForSystemConfig.java +16 -0
  40. data/embulk-core/src/main/java/org/embulk/exec/GuessExecutor.java +307 -0
  41. data/embulk-core/src/main/java/org/embulk/exec/LocalExecutor.java +274 -0
  42. data/embulk-core/src/main/java/org/embulk/exec/LoggerProvider.java +30 -0
  43. data/embulk-core/src/main/java/org/embulk/exec/NoSampleException.java +10 -0
  44. data/embulk-core/src/main/java/org/embulk/exec/PooledBufferAllocator.java +58 -0
  45. data/embulk-core/src/main/java/org/embulk/exec/PreviewExecutor.java +138 -0
  46. data/embulk-core/src/main/java/org/embulk/exec/PreviewResult.java +27 -0
  47. data/embulk-core/src/main/java/org/embulk/exec/PreviewedNoticeError.java +17 -0
  48. data/embulk-core/src/main/java/org/embulk/exec/SamplingParserPlugin.java +116 -0
  49. data/embulk-core/src/main/java/org/embulk/exec/SystemConfigModule.java +24 -0
  50. data/embulk-core/src/main/java/org/embulk/jruby/JRubyPluginSource.java +69 -0
  51. data/embulk-core/src/main/java/org/embulk/jruby/JRubyScriptingModule.java +100 -0
  52. data/embulk-core/src/main/java/org/embulk/plugin/BuiltinPluginSourceModule.java +17 -0
  53. data/embulk-core/src/main/java/org/embulk/plugin/InjectedPluginSource.java +92 -0
  54. data/embulk-core/src/main/java/org/embulk/plugin/PluginManager.java +34 -0
  55. data/embulk-core/src/main/java/org/embulk/plugin/PluginSource.java +6 -0
  56. data/embulk-core/src/main/java/org/embulk/plugin/PluginSourceNotMatchException.java +19 -0
  57. data/embulk-core/src/main/java/org/embulk/plugin/PluginType.java +47 -0
  58. data/embulk-core/src/main/java/org/embulk/plugin/SetThreadContextClassLoader.java +19 -0
  59. data/embulk-core/src/main/java/org/embulk/spi/Buffer.java +113 -0
  60. data/embulk-core/src/main/java/org/embulk/spi/BufferAllocator.java +8 -0
  61. data/embulk-core/src/main/java/org/embulk/spi/Column.java +92 -0
  62. data/embulk-core/src/main/java/org/embulk/spi/ColumnConfig.java +79 -0
  63. data/embulk-core/src/main/java/org/embulk/spi/DecoderPlugin.java +16 -0
  64. data/embulk-core/src/main/java/org/embulk/spi/EncoderPlugin.java +16 -0
  65. data/embulk-core/src/main/java/org/embulk/spi/Exec.java +76 -0
  66. data/embulk-core/src/main/java/org/embulk/spi/ExecAction.java +6 -0
  67. data/embulk-core/src/main/java/org/embulk/spi/ExecSession.java +105 -0
  68. data/embulk-core/src/main/java/org/embulk/spi/Extension.java +42 -0
  69. data/embulk-core/src/main/java/org/embulk/spi/FileInput.java +11 -0
  70. data/embulk-core/src/main/java/org/embulk/spi/FileInputPlugin.java +19 -0
  71. data/embulk-core/src/main/java/org/embulk/spi/FileInputRunner.java +113 -0
  72. data/embulk-core/src/main/java/org/embulk/spi/FileOutput.java +13 -0
  73. data/embulk-core/src/main/java/org/embulk/spi/FileOutputPlugin.java +20 -0
  74. data/embulk-core/src/main/java/org/embulk/spi/FileOutputRunner.java +167 -0
  75. data/embulk-core/src/main/java/org/embulk/spi/FormatterPlugin.java +18 -0
  76. data/embulk-core/src/main/java/org/embulk/spi/GuessPlugin.java +9 -0
  77. data/embulk-core/src/main/java/org/embulk/spi/InputPlugin.java +20 -0
  78. data/embulk-core/src/main/java/org/embulk/spi/OutputPlugin.java +21 -0
  79. data/embulk-core/src/main/java/org/embulk/spi/Page.java +45 -0
  80. data/embulk-core/src/main/java/org/embulk/spi/PageBuilder.java +327 -0
  81. data/embulk-core/src/main/java/org/embulk/spi/PageFormat.java +47 -0
  82. data/embulk-core/src/main/java/org/embulk/spi/PageOutput.java +11 -0
  83. data/embulk-core/src/main/java/org/embulk/spi/PageReader.java +227 -0
  84. data/embulk-core/src/main/java/org/embulk/spi/ParserPlugin.java +17 -0
  85. data/embulk-core/src/main/java/org/embulk/spi/Schema.java +101 -0
  86. data/embulk-core/src/main/java/org/embulk/spi/SchemaConfig.java +52 -0
  87. data/embulk-core/src/main/java/org/embulk/spi/SchemaVisitor.java +14 -0
  88. data/embulk-core/src/main/java/org/embulk/spi/Transactional.java +10 -0
  89. data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileInput.java +17 -0
  90. data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileOutput.java +19 -0
  91. data/embulk-core/src/main/java/org/embulk/spi/TransactionalPageOutput.java +17 -0
  92. data/embulk-core/src/main/java/org/embulk/spi/time/DateTimeZoneSerDe.java +57 -0
  93. data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelper.java +8 -0
  94. data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelperFactory.java +6 -0
  95. data/embulk-core/src/main/java/org/embulk/spi/time/Timestamp.java +159 -0
  96. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormat.java +98 -0
  97. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormatter.java +55 -0
  98. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParseException.java +6 -0
  99. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParser.java +60 -0
  100. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampSerDe.java +50 -0
  101. data/embulk-core/src/main/java/org/embulk/spi/type/AbstractType.java +55 -0
  102. data/embulk-core/src/main/java/org/embulk/spi/type/BooleanType.java +12 -0
  103. data/embulk-core/src/main/java/org/embulk/spi/type/DoubleType.java +12 -0
  104. data/embulk-core/src/main/java/org/embulk/spi/type/LongType.java +12 -0
  105. data/embulk-core/src/main/java/org/embulk/spi/type/StringType.java +12 -0
  106. data/embulk-core/src/main/java/org/embulk/spi/type/TimestampType.java +39 -0
  107. data/embulk-core/src/main/java/org/embulk/spi/type/Type.java +15 -0
  108. data/embulk-core/src/main/java/org/embulk/spi/type/TypeDeserializer.java +47 -0
  109. data/embulk-core/src/main/java/org/embulk/spi/type/Types.java +14 -0
  110. data/embulk-core/src/main/java/org/embulk/spi/util/CharsetSerDe.java +55 -0
  111. data/embulk-core/src/main/java/org/embulk/spi/util/Decoders.java +81 -0
  112. data/embulk-core/src/main/java/org/embulk/spi/util/Encoders.java +81 -0
  113. data/embulk-core/src/main/java/org/embulk/spi/util/FileInputInputStream.java +110 -0
  114. data/embulk-core/src/main/java/org/embulk/spi/util/FileOutputOutputStream.java +94 -0
  115. data/embulk-core/src/main/java/org/embulk/spi/util/InputStreamFileInput.java +111 -0
  116. data/embulk-core/src/main/java/org/embulk/spi/util/Inputs.java +74 -0
  117. data/embulk-core/src/main/java/org/embulk/spi/util/LineDecoder.java +118 -0
  118. data/embulk-core/src/main/java/org/embulk/spi/util/LineEncoder.java +109 -0
  119. data/embulk-core/src/main/java/org/embulk/spi/util/ListFileInput.java +52 -0
  120. data/embulk-core/src/main/java/org/embulk/spi/util/Newline.java +38 -0
  121. data/embulk-core/src/main/java/org/embulk/spi/util/PagePrinter.java +102 -0
  122. data/embulk-core/src/main/java/org/embulk/spi/util/Pages.java +139 -0
  123. data/embulk-core/src/test/java/org/embulk/EmbulkTestRuntime.java +110 -0
  124. data/embulk-core/src/test/java/org/embulk/GuiceBinder.java +72 -0
  125. data/embulk-core/src/test/java/org/embulk/RandomManager.java +53 -0
  126. data/embulk-core/src/test/java/org/embulk/TestPluginSourceModule.java +23 -0
  127. data/embulk-core/src/test/java/org/embulk/TestUtilityModule.java +17 -0
  128. data/embulk-core/src/test/java/org/embulk/config/TestConfigSource.java +114 -0
  129. data/embulk-core/src/test/java/org/embulk/config/TestTaskSource.java +70 -0
  130. data/embulk-core/src/test/java/org/embulk/plugin/MockPluginSource.java +57 -0
  131. data/embulk-core/src/test/java/org/embulk/plugin/TestPluginType.java +18 -0
  132. data/embulk-core/src/test/java/org/embulk/spi/MockFileOutput.java +63 -0
  133. data/embulk-core/src/test/java/org/embulk/spi/MockFormatterPlugin.java +101 -0
  134. data/embulk-core/src/test/java/org/embulk/spi/MockParserPlugin.java +73 -0
  135. data/embulk-core/src/test/java/org/embulk/spi/PageTestUtils.java +78 -0
  136. data/embulk-core/src/test/java/org/embulk/spi/TestFileInputInputStream.java +67 -0
  137. data/embulk-core/src/test/java/org/embulk/spi/TestFileInputRunner.java +180 -0
  138. data/embulk-core/src/test/java/org/embulk/spi/TestFileOutputRunner.java +192 -0
  139. data/embulk-core/src/test/java/org/embulk/spi/TestInputStreamFileInput.java +188 -0
  140. data/embulk-core/src/test/java/org/embulk/spi/TestPageBuilderReader.java +301 -0
  141. data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestamp.java +116 -0
  142. data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestampFormatterParser.java +52 -0
  143. data/embulk-core/src/test/java/org/embulk/spi/type/TestTypeSerDe.java +45 -0
  144. data/embulk-core/src/test/java/org/embulk/spi/util/TestLineDecoder.java +132 -0
  145. data/embulk-core/src/test/java/org/embulk/spi/util/TestLineEncoder.java +123 -0
  146. data/embulk-standards/build.gradle +6 -0
  147. data/embulk-standards/pom.xml +68 -0
  148. data/embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java +158 -0
  149. data/embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java +233 -0
  150. data/embulk-standards/src/main/java/org/embulk/standards/CsvTokenizer.java +355 -0
  151. data/embulk-standards/src/main/java/org/embulk/standards/GzipFileDecoderPlugin.java +55 -0
  152. data/embulk-standards/src/main/java/org/embulk/standards/GzipFileEncoderPlugin.java +39 -0
  153. data/embulk-standards/src/main/java/org/embulk/standards/LocalFileInputPlugin.java +138 -0
  154. data/embulk-standards/src/main/java/org/embulk/standards/LocalFileOutputPlugin.java +128 -0
  155. data/embulk-standards/src/main/java/org/embulk/standards/NullOutputPlugin.java +46 -0
  156. data/embulk-standards/src/main/java/org/embulk/standards/S3FileInputPlugin.java +238 -0
  157. data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginExtension.java +16 -0
  158. data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginModule.java +44 -0
  159. data/embulk-standards/src/main/java/org/embulk/standards/StdoutOutputPlugin.java +71 -0
  160. data/embulk-standards/src/main/resources/META-INF/services/org.embulk.spi.Extension +1 -0
  161. data/embulk-standards/src/test/java/org/embulk/standards/TestCsvParserPlugin.java +69 -0
  162. data/embulk-standards/src/test/java/org/embulk/standards/TestCsvTokenizer.java +291 -0
  163. data/embulk-standards/src/test/java/org/embulk/standards/TestS3FileInputPlugin.java +43 -0
  164. data/embulk.gemspec +27 -0
  165. data/examples/config.yml +34 -0
  166. data/examples/csv/sample.csv.gz +0 -0
  167. data/gradle/wrapper/gradle-wrapper.jar +0 -0
  168. data/gradle/wrapper/gradle-wrapper.properties +6 -0
  169. data/gradlew +164 -0
  170. data/gradlew.bat +90 -0
  171. data/lib/embulk.rb +16 -0
  172. data/lib/embulk/buffer.rb +17 -0
  173. data/lib/embulk/column.rb +47 -0
  174. data/lib/embulk/command/embulk.rb +39 -0
  175. data/lib/embulk/command/embulk_example.rb +32 -0
  176. data/lib/embulk/command/embulk_generate_bin.rb +62 -0
  177. data/lib/embulk/command/embulk_run.rb +243 -0
  178. data/lib/embulk/data/bundle/.bundle/config +3 -0
  179. data/lib/embulk/data/bundle/Gemfile +31 -0
  180. data/lib/embulk/data/bundle/Gemfile.lock +8 -0
  181. data/lib/embulk/data/bundle/embulk/input_example.rb +40 -0
  182. data/lib/embulk/data/bundle/embulk/output_example.rb +51 -0
  183. data/lib/embulk/data_source.rb +66 -0
  184. data/lib/embulk/error.rb +5 -0
  185. data/lib/embulk/guess_charset.rb +26 -0
  186. data/lib/embulk/guess_csv.rb +195 -0
  187. data/lib/embulk/guess_gzip.rb +18 -0
  188. data/lib/embulk/guess_newline.rb +20 -0
  189. data/lib/embulk/guess_plugin.rb +113 -0
  190. data/lib/embulk/input_plugin.rb +53 -0
  191. data/lib/embulk/java/bootstrap.rb +12 -0
  192. data/lib/embulk/java/imports.rb +26 -0
  193. data/lib/embulk/java/time_helper.rb +77 -0
  194. data/lib/embulk/output_plugin.rb +104 -0
  195. data/lib/embulk/page.rb +28 -0
  196. data/lib/embulk/page_builder.rb +22 -0
  197. data/lib/embulk/plugin.rb +152 -0
  198. data/lib/embulk/plugin_registry.rb +70 -0
  199. data/lib/embulk/schema.rb +85 -0
  200. data/lib/embulk/time_format_guess.rb +331 -0
  201. data/lib/embulk/version.rb +3 -0
  202. data/pom.xml +533 -0
  203. data/settings.gradle +5 -0
  204. 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
+ }