embulk 0.3.2 → 0.4.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 (138) hide show
  1. checksums.yaml +5 -13
  2. data/.travis.yml +16 -0
  3. data/Gemfile +0 -1
  4. data/README.md +37 -19
  5. data/Rakefile +5 -37
  6. data/bin/embulk +1 -1
  7. data/build.gradle +178 -95
  8. data/embulk-core/build.gradle +1 -1
  9. data/embulk-core/src/main/java/org/embulk/command/Runner.java +11 -10
  10. data/embulk-core/src/main/java/org/embulk/config/ConfigDiff.java +26 -0
  11. data/embulk-core/src/main/java/org/embulk/config/ConfigInject.java +14 -0
  12. data/embulk-core/src/main/java/org/embulk/config/DataSourceImpl.java +2 -2
  13. data/embulk-core/src/main/java/org/embulk/config/DataSourceSerDe.java +4 -3
  14. data/embulk-core/src/main/java/org/embulk/config/TaskSerDe.java +5 -3
  15. data/embulk-core/src/main/java/org/embulk/config/TaskValidationException.java +1 -0
  16. data/embulk-core/src/main/java/org/embulk/exec/ExecutionResult.java +6 -6
  17. data/embulk-core/src/main/java/org/embulk/exec/GuessExecutor.java +19 -19
  18. data/embulk-core/src/main/java/org/embulk/exec/LocalExecutor.java +61 -36
  19. data/embulk-core/src/main/java/org/embulk/plugin/InjectedPluginSource.java +4 -0
  20. data/embulk-core/src/main/java/org/embulk/plugin/PluginManager.java +16 -1
  21. data/embulk-core/src/main/java/org/embulk/spi/Column.java +1 -1
  22. data/embulk-core/src/main/java/org/embulk/spi/{SchemaVisitor.java → ColumnVisitor.java} +1 -1
  23. data/embulk-core/src/main/java/org/embulk/spi/Exec.java +3 -3
  24. data/embulk-core/src/main/java/org/embulk/spi/ExecSession.java +2 -2
  25. data/embulk-core/src/main/java/org/embulk/spi/FileInputPlugin.java +3 -3
  26. data/embulk-core/src/main/java/org/embulk/spi/FileInputRunner.java +3 -3
  27. data/embulk-core/src/main/java/org/embulk/spi/FileOutputPlugin.java +3 -3
  28. data/embulk-core/src/main/java/org/embulk/spi/FileOutputRunner.java +3 -3
  29. data/embulk-core/src/main/java/org/embulk/spi/FilterPlugin.java +1 -1
  30. data/embulk-core/src/main/java/org/embulk/spi/GuessPlugin.java +2 -2
  31. data/embulk-core/src/main/java/org/embulk/spi/InputPlugin.java +3 -3
  32. data/embulk-core/src/main/java/org/embulk/spi/OutputPlugin.java +3 -3
  33. data/embulk-core/src/main/java/org/embulk/spi/PluginClassLoader.java +80 -0
  34. data/embulk-core/src/main/java/org/embulk/spi/Schema.java +1 -1
  35. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormatter.java +2 -2
  36. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParser.java +2 -2
  37. data/embulk-core/src/main/java/org/embulk/spi/util/Filters.java +1 -1
  38. data/embulk-core/src/main/java/org/embulk/spi/util/LineEncoder.java +2 -2
  39. data/embulk-core/src/main/java/org/embulk/spi/util/PagePrinter.java +6 -6
  40. data/embulk-core/src/main/java/org/embulk/spi/util/Pages.java +6 -6
  41. data/embulk-core/src/test/java/org/embulk/GuiceBinder.java +1 -1
  42. data/embulk-core/src/test/java/org/embulk/plugin/MockPluginSource.java +1 -0
  43. data/embulk-core/src/test/java/org/embulk/spi/MockFormatterPlugin.java +2 -2
  44. data/embulk-core/src/test/java/org/embulk/spi/PageTestUtils.java +1 -1
  45. data/embulk-core/src/test/java/org/embulk/spi/TestFileInputRunner.java +3 -3
  46. data/embulk-core/src/test/java/org/embulk/spi/TestFileOutputRunner.java +4 -4
  47. data/embulk-docs/Makefile +178 -0
  48. data/embulk-docs/build.gradle +20 -0
  49. data/embulk-docs/make.bat +243 -0
  50. data/embulk-docs/push-gh-pages.sh +29 -0
  51. data/embulk-docs/src/conf.py +260 -0
  52. data/embulk-docs/src/index.rst +19 -0
  53. data/embulk-docs/src/release.rst +14 -0
  54. data/embulk-docs/src/release/release-0.1.0.rst +8 -0
  55. data/embulk-docs/src/release/release-0.2.0.rst +16 -0
  56. data/embulk-docs/src/release/release-0.2.1.rst +19 -0
  57. data/embulk-docs/src/release/release-0.3.0.rst +34 -0
  58. data/embulk-docs/src/release/release-0.3.1.rst +11 -0
  59. data/embulk-docs/src/release/release-0.3.2.rst +15 -0
  60. data/embulk-docs/src/release/release-0.4.0.rst +74 -0
  61. data/embulk-standards/build.gradle +0 -1
  62. data/embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java +2 -2
  63. data/embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java +12 -3
  64. data/embulk-standards/src/main/java/org/embulk/standards/GzipFileDecoderPlugin.java +2 -2
  65. data/embulk-standards/src/main/java/org/embulk/standards/LocalFileInputPlugin.java +49 -26
  66. data/embulk-standards/src/main/java/org/embulk/standards/LocalFileOutputPlugin.java +16 -17
  67. data/embulk-standards/src/main/java/org/embulk/standards/NullOutputPlugin.java +4 -4
  68. data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginModule.java +0 -1
  69. data/embulk-standards/src/main/java/org/embulk/standards/StdoutOutputPlugin.java +5 -5
  70. data/gradle/wrapper/gradle-wrapper.jar +0 -0
  71. data/gradle/wrapper/gradle-wrapper.properties +2 -2
  72. data/lib/embulk/buffer.rb +2 -2
  73. data/lib/embulk/column.rb +6 -6
  74. data/lib/embulk/command/embulk_example.rb +1 -1
  75. data/lib/embulk/command/embulk_new_plugin.rb +87 -0
  76. data/lib/embulk/command/embulk_run.rb +84 -26
  77. data/lib/embulk/data/bundle/Gemfile +12 -20
  78. data/lib/embulk/data/bundle/embulk/{filter_example.rb → filter/example.rb} +3 -3
  79. data/lib/embulk/data/bundle/embulk/{input_example.rb → input/example.rb} +3 -3
  80. data/lib/embulk/data/bundle/embulk/{output_example.rb → output/example.rb} +3 -3
  81. data/lib/embulk/data/new/LICENSE.txt +21 -0
  82. data/lib/embulk/data/new/README.md.erb +75 -0
  83. data/lib/embulk/data/new/gitignore.erb +12 -0
  84. data/lib/embulk/data/new/java/build.gradle.erb +57 -0
  85. data/lib/embulk/data/new/java/decoder.java.erb +40 -0
  86. data/lib/embulk/data/new/java/encoder.java.erb +40 -0
  87. data/lib/embulk/data/new/java/file_input.java.erb +64 -0
  88. data/lib/embulk/data/new/java/file_output.java.erb +66 -0
  89. data/lib/embulk/data/new/java/filter.java.erb +47 -0
  90. data/lib/embulk/data/new/java/formatter.java.erb +45 -0
  91. data/lib/embulk/data/new/java/gradle/wrapper/gradle-wrapper.jar +0 -0
  92. data/lib/embulk/data/new/java/gradle/wrapper/gradle-wrapper.properties +6 -0
  93. data/lib/embulk/data/new/java/gradlew +164 -0
  94. data/lib/embulk/data/new/java/gradlew.bat +90 -0
  95. data/lib/embulk/data/new/java/input.java.erb +69 -0
  96. data/lib/embulk/data/new/java/output.java.erb +65 -0
  97. data/lib/embulk/data/new/java/parser.java.erb +51 -0
  98. data/lib/embulk/data/new/java/plugin_loader.rb.erb +3 -0
  99. data/lib/embulk/data/new/java/test.java.erb +5 -0
  100. data/lib/embulk/data/new/ruby/Gemfile +2 -0
  101. data/lib/embulk/data/new/ruby/Rakefile +1 -0
  102. data/lib/embulk/data/new/ruby/filter.rb.erb +39 -0
  103. data/lib/embulk/data/new/ruby/gemspec.erb +19 -0
  104. data/lib/embulk/data/new/ruby/input.rb.erb +47 -0
  105. data/lib/embulk/data/new/ruby/output.rb.erb +59 -0
  106. data/lib/embulk/data/package_data.rb +64 -0
  107. data/lib/embulk/data_source.rb +2 -2
  108. data/lib/embulk/decoder_plugin.rb +27 -0
  109. data/lib/embulk/encoder_plugin.rb +27 -0
  110. data/lib/embulk/error.rb +3 -0
  111. data/lib/embulk/file_input_plugin.rb +27 -0
  112. data/lib/embulk/file_output_plugin.rb +27 -0
  113. data/lib/embulk/filter_plugin.rb +28 -9
  114. data/lib/embulk/formatter_plugin.rb +105 -0
  115. data/lib/embulk/guess_csv.rb +10 -1
  116. data/lib/embulk/guess_plugin.rb +22 -27
  117. data/lib/embulk/input_plugin.rb +34 -20
  118. data/lib/embulk/java/bootstrap.rb +5 -0
  119. data/lib/embulk/java/imports.rb +7 -0
  120. data/lib/embulk/java_plugin.rb +84 -0
  121. data/lib/embulk/output_plugin.rb +35 -19
  122. data/lib/embulk/page.rb +1 -1
  123. data/lib/embulk/page_builder.rb +1 -1
  124. data/lib/embulk/parser_plugin.rb +76 -0
  125. data/lib/embulk/plugin.rb +130 -65
  126. data/lib/embulk/plugin_registry.rb +19 -8
  127. data/lib/embulk/schema.rb +4 -4
  128. data/lib/embulk/version.rb +1 -1
  129. data/settings.gradle +1 -0
  130. metadata +123 -90
  131. data/ChangeLog +0 -46
  132. data/embulk-cli/pom.xml +0 -94
  133. data/embulk-core/pom.xml +0 -148
  134. data/embulk-core/src/main/java/org/embulk/config/NextConfig.java +0 -26
  135. data/embulk-standards/pom.xml +0 -68
  136. data/embulk-standards/src/main/java/org/embulk/standards/S3FileInputPlugin.java +0 -250
  137. data/embulk-standards/src/test/java/org/embulk/standards/TestS3FileInputPlugin.java +0 -43
  138. data/pom.xml +0 -541
@@ -1,6 +1,6 @@
1
1
  sourceSets {
2
2
  main.resources {
3
3
  srcDirs 'src/main/resources'
4
- srcDirs '../lib'
4
+ srcDirs "${parent.projectDir}/lib"
5
5
  }
6
6
  }
@@ -17,7 +17,7 @@ import com.google.inject.Injector;
17
17
  import org.embulk.config.ConfigSource;
18
18
  import org.embulk.config.DataSource;
19
19
  import org.embulk.config.ConfigLoader;
20
- import org.embulk.config.NextConfig;
20
+ import org.embulk.config.ConfigDiff;
21
21
  import org.embulk.config.ModelManager;
22
22
  import org.embulk.config.ConfigException;
23
23
  import org.embulk.exec.LocalExecutor;
@@ -130,13 +130,14 @@ public class Runner
130
130
 
131
131
  // delete resume file
132
132
  if (options.getResumeStatePath() != null) {
133
- new File(options.getResumeStatePath()).delete();
133
+ boolean dontCare = new File(options.getResumeStatePath()).delete();
134
134
  }
135
135
 
136
136
  // write next config
137
- NextConfig nextConfig = result.getNextConfig();
138
- exec.getLogger(Runner.class).info("next config: {}", nextConfig.toString());
139
- writeNextConfig(options.getNextConfigOutputPath(), config, nextConfig);
137
+ ConfigDiff configDiff = result.getConfigDiff();
138
+ exec.getLogger(Runner.class).info("Committed.");
139
+ exec.getLogger(Runner.class).info("Next config diff: {}", configDiff.toString());
140
+ writeNextConfig(options.getNextConfigOutputPath(), config, configDiff);
140
141
  }
141
142
 
142
143
  public void cleanup(String configPath)
@@ -154,7 +155,7 @@ public class Runner
154
155
  local.cleanup(config, resume);
155
156
 
156
157
  // delete resume file
157
- new File(options.getResumeStatePath()).delete();
158
+ boolean dontCare = new File(options.getResumeStatePath()).delete();
158
159
  }
159
160
 
160
161
  public void guess(String partialConfigPath)
@@ -164,9 +165,9 @@ public class Runner
164
165
 
165
166
  ExecSession exec = newExecSession(config);
166
167
  GuessExecutor guess = injector.getInstance(GuessExecutor.class);
167
- NextConfig nextConfig = guess.guess(exec, config);
168
+ ConfigDiff configDiff = guess.guess(exec, config);
168
169
 
169
- String yml = writeNextConfig(options.getNextConfigOutputPath(), config, nextConfig);
170
+ String yml = writeNextConfig(options.getNextConfigOutputPath(), config, configDiff);
170
171
  System.err.println(yml);
171
172
  }
172
173
 
@@ -181,9 +182,9 @@ public class Runner
181
182
  }
182
183
  }
183
184
 
184
- private String writeNextConfig(String path, ConfigSource originalConfig, NextConfig nextConfigDiff)
185
+ private String writeNextConfig(String path, ConfigSource originalConfig, ConfigDiff configDiff)
185
186
  {
186
- return writeYaml(path, originalConfig.merge(nextConfigDiff));
187
+ return writeYaml(path, originalConfig.merge(configDiff));
187
188
  }
188
189
 
189
190
  private String writeYaml(String path, Object obj)
@@ -0,0 +1,26 @@
1
+ package org.embulk.config;
2
+
3
+ public interface ConfigDiff
4
+ extends DataSource
5
+ {
6
+ @Override
7
+ public ConfigDiff getNested(String attrName);
8
+
9
+ @Override
10
+ public ConfigDiff getNestedOrSetEmpty(String attrName);
11
+
12
+ @Override
13
+ public ConfigDiff set(String attrName, Object v);
14
+
15
+ @Override
16
+ public ConfigDiff setNested(String attrName, DataSource v);
17
+
18
+ @Override
19
+ public ConfigDiff setAll(DataSource other);
20
+
21
+ @Override
22
+ public ConfigDiff deepCopy();
23
+
24
+ @Override
25
+ public ConfigDiff merge(DataSource other);
26
+ }
@@ -0,0 +1,14 @@
1
+ package org.embulk.config;
2
+
3
+ import java.lang.annotation.Documented;
4
+ import java.lang.annotation.ElementType;
5
+ import java.lang.annotation.Retention;
6
+ import java.lang.annotation.RetentionPolicy;
7
+ import java.lang.annotation.Target;
8
+
9
+ @Documented
10
+ @Retention(RetentionPolicy.RUNTIME)
11
+ @Target(ElementType.METHOD)
12
+ public @interface ConfigInject
13
+ {
14
+ }
@@ -13,7 +13,7 @@ import com.fasterxml.jackson.databind.node.ArrayNode;
13
13
  import com.fasterxml.jackson.databind.node.JsonNodeFactory;
14
14
 
15
15
  public class DataSourceImpl
16
- implements ConfigSource, TaskSource, CommitReport, NextConfig
16
+ implements ConfigSource, TaskSource, CommitReport, ConfigDiff
17
17
  {
18
18
  protected final ObjectNode data;
19
19
  protected final ModelManager model;
@@ -51,7 +51,7 @@ public class DataSourceImpl
51
51
  @Override
52
52
  public Iterable<Map.Entry<String, JsonNode>> getAttributes()
53
53
  {
54
- return new Iterable() {
54
+ return new Iterable<Map.Entry<String,JsonNode>>() {
55
55
  public Iterator<Map.Entry<String, JsonNode>> iterator()
56
56
  {
57
57
  return data.fields();
@@ -38,9 +38,9 @@ public class DataSourceSerDe
38
38
  addSerializer(CommitReport.class, new DataSourceSerializer<CommitReport>());
39
39
  addDeserializer(CommitReport.class, new DataSourceDeserializer<CommitReport>(model));
40
40
 
41
- // NextConfig
42
- addSerializer(NextConfig.class, new DataSourceSerializer<NextConfig>());
43
- addDeserializer(NextConfig.class, new DataSourceDeserializer<NextConfig>(model));
41
+ // ConfigDiff
42
+ addSerializer(ConfigDiff.class, new DataSourceSerializer<ConfigDiff>());
43
+ addDeserializer(ConfigDiff.class, new DataSourceDeserializer<ConfigDiff>(model));
44
44
  }
45
45
  }
46
46
 
@@ -57,6 +57,7 @@ public class DataSourceSerDe
57
57
  }
58
58
 
59
59
  @Override
60
+ @SuppressWarnings("unchecked")
60
61
  public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException
61
62
  {
62
63
  JsonNode json = treeObjectMapper.readTree(jp);
@@ -28,7 +28,6 @@ import com.fasterxml.jackson.databind.SerializerProvider;
28
28
  import com.fasterxml.jackson.databind.DeserializationContext;
29
29
  import com.fasterxml.jackson.databind.DeserializationConfig;
30
30
  import com.fasterxml.jackson.databind.JsonMappingException;
31
- import com.fasterxml.jackson.annotation.JacksonInject;
32
31
 
33
32
  class TaskSerDe
34
33
  {
@@ -93,7 +92,7 @@ class TaskSerDe
93
92
  Method getterMethod = getter.getValue();
94
93
  String fieldName = getter.getKey();
95
94
 
96
- if (getterMethod.getAnnotation(JacksonInject.class) != null) {
95
+ if (getterMethod.getAnnotation(ConfigInject.class) != null) {
97
96
  // InjectEntry
98
97
  continue;
99
98
  }
@@ -117,7 +116,7 @@ class TaskSerDe
117
116
  for (Map.Entry<String, Method> getter : TaskInvocationHandler.fieldGetters(iface).entrySet()) {
118
117
  Method getterMethod = getter.getValue();
119
118
  String fieldName = getter.getKey();
120
- JacksonInject inject = getterMethod.getAnnotation(JacksonInject.class);
119
+ ConfigInject inject = getterMethod.getAnnotation(ConfigInject.class);
121
120
  if (inject != null) {
122
121
  // InjectEntry
123
122
  builder.add(new InjectEntry(fieldName, getterMethod.getReturnType()));
@@ -137,6 +136,7 @@ class TaskSerDe
137
136
  }
138
137
 
139
138
  @Override
139
+ @SuppressWarnings("unchecked")
140
140
  public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException
141
141
  {
142
142
  Map<String, Object> objects = new ConcurrentHashMap<String, Object>();
@@ -317,6 +317,7 @@ class TaskSerDe
317
317
  });
318
318
  }
319
319
 
320
+ @SuppressWarnings("unchecked")
320
321
  protected JsonDeserializer<?> newTaskDeserializer(Class<?> raw)
321
322
  {
322
323
  return new TaskDeserializer(nestedObjectMapper, model, raw);
@@ -335,6 +336,7 @@ class TaskSerDe
335
336
  public String getModuleName() { return "embulk.config.ConfigTaskSerDe"; }
336
337
 
337
338
  @Override
339
+ @SuppressWarnings("unchecked")
338
340
  protected JsonDeserializer<?> newTaskDeserializer(Class<?> raw)
339
341
  {
340
342
  return new ConfigTaskDeserializer(nestedObjectMapper, model, raw);
@@ -15,6 +15,7 @@ public class TaskValidationException
15
15
  this.violations = violations;
16
16
  }
17
17
 
18
+ @SuppressWarnings("unchecked")
18
19
  public Set<ConstraintViolation<?>> getViolations()
19
20
  {
20
21
  return violations;
@@ -1,22 +1,22 @@
1
1
  package org.embulk.exec;
2
2
 
3
3
  import java.util.List;
4
- import org.embulk.config.NextConfig;
4
+ import org.embulk.config.ConfigDiff;
5
5
 
6
6
  public class ExecutionResult
7
7
  {
8
- private final NextConfig nextConfig;
8
+ private final ConfigDiff configDiff;
9
9
  private final List<Throwable> ignoredExceptions;
10
10
 
11
- public ExecutionResult(NextConfig nextConfig, List<Throwable> ignoredExceptions)
11
+ public ExecutionResult(ConfigDiff configDiff, List<Throwable> ignoredExceptions)
12
12
  {
13
- this.nextConfig = nextConfig;
13
+ this.configDiff = configDiff;
14
14
  this.ignoredExceptions = ignoredExceptions;
15
15
  }
16
16
 
17
- public NextConfig getNextConfig()
17
+ public ConfigDiff getConfigDiff()
18
18
  {
19
- return nextConfig;
19
+ return configDiff;
20
20
  }
21
21
 
22
22
  public List<Throwable> getIgnoredExceptions()
@@ -8,7 +8,7 @@ import com.google.inject.Injector;
8
8
  import com.google.common.base.Throwables;
9
9
  import org.embulk.config.Config;
10
10
  import org.embulk.config.ConfigDefault;
11
- import org.embulk.config.NextConfig;
11
+ import org.embulk.config.ConfigDiff;
12
12
  import org.embulk.config.DataSource;
13
13
  import org.embulk.config.Task;
14
14
  import org.embulk.config.TaskSource;
@@ -64,11 +64,11 @@ public class GuessExecutor
64
64
  new PluginType("csv"));
65
65
  }
66
66
 
67
- public NextConfig guess(ExecSession exec, final ConfigSource config)
67
+ public ConfigDiff guess(ExecSession exec, final ConfigSource config)
68
68
  {
69
69
  try {
70
- return Exec.doWith(exec, new ExecAction<NextConfig>() {
71
- public NextConfig run()
70
+ return Exec.doWith(exec, new ExecAction<ConfigDiff>() {
71
+ public ConfigDiff run()
72
72
  {
73
73
  return doGuess(config);
74
74
  }
@@ -78,7 +78,7 @@ public class GuessExecutor
78
78
  }
79
79
  }
80
80
 
81
- private NextConfig doGuess(ConfigSource config)
81
+ private ConfigDiff doGuess(ConfigSource config)
82
82
  {
83
83
  Buffer sample = SamplingParserPlugin.runFileInputSampling(config);
84
84
  if (sample.limit() == 0) {
@@ -93,11 +93,11 @@ public class GuessExecutor
93
93
  return runGuessInput(sample, config, guessPlugins);
94
94
  }
95
95
 
96
- private NextConfig runGuessInput(Buffer sample,
96
+ private ConfigDiff runGuessInput(Buffer sample,
97
97
  ConfigSource config, List<PluginType> guessPlugins)
98
98
  {
99
99
  // repeat guessing upto 10 times
100
- NextConfig lastGuessed = Exec.newNextConfig();
100
+ ConfigDiff lastGuessed = Exec.newConfigDiff();
101
101
  for (int i=0; i < 10; i++) {
102
102
  // include last-guessed config to run guess input
103
103
  ConfigSource originalConfig = config.getNested("in").deepCopy().merge(lastGuessed);
@@ -109,7 +109,7 @@ public class GuessExecutor
109
109
 
110
110
  // run FileInputPlugin
111
111
  final FileInputRunner input = new FileInputRunner(new BufferFileInputPlugin(sample));
112
- NextConfig guessed;
112
+ ConfigDiff guessed;
113
113
  try {
114
114
  input.transaction(guessInputConfig, new InputPlugin.Control() {
115
115
  public List<CommitReport> run(TaskSource inputTaskSource, Schema schema, int processorCount)
@@ -148,9 +148,9 @@ public class GuessExecutor
148
148
  return wrapInIn(lastGuessed);
149
149
  }
150
150
 
151
- private static NextConfig wrapInIn(NextConfig lastGuessed)
151
+ private static ConfigDiff wrapInIn(ConfigDiff lastGuessed)
152
152
  {
153
- NextConfig wrapped = Exec.newNextConfig();
153
+ ConfigDiff wrapped = Exec.newConfigDiff();
154
154
  wrapped.getNestedOrSetEmpty("in").merge(lastGuessed);
155
155
  return wrapped;
156
156
  }
@@ -165,13 +165,13 @@ public class GuessExecutor
165
165
  this.buffer = buffer;
166
166
  }
167
167
 
168
- public NextConfig transaction(ConfigSource config, FileInputPlugin.Control control)
168
+ public ConfigDiff transaction(ConfigSource config, FileInputPlugin.Control control)
169
169
  {
170
170
  control.run(Exec.newTaskSource(), 1);
171
- return Exec.newNextConfig();
171
+ return Exec.newConfigDiff();
172
172
  }
173
173
 
174
- public NextConfig resume(TaskSource taskSource,
174
+ public ConfigDiff resume(TaskSource taskSource,
175
175
  int processorCount,
176
176
  FileInputPlugin.Control control)
177
177
  {
@@ -271,9 +271,9 @@ public class GuessExecutor
271
271
 
272
272
  // run guess plugins
273
273
  ConfigSource mergedConfig = originalConfig.deepCopy();
274
- NextConfig mergedGuessed = Exec.newNextConfig();
274
+ ConfigDiff mergedGuessed = Exec.newConfigDiff();
275
275
  for (int i=0; i < guesses.size(); i++) {
276
- NextConfig guessed = guesses.get(i).guess(originalConfig, sample);
276
+ ConfigDiff guessed = guesses.get(i).guess(originalConfig, sample);
277
277
  guessed = addAssumedDecoderConfigs(originalConfig, guessed);
278
278
  mergedGuessed.merge(guessed);
279
279
  mergedConfig.merge(mergedGuessed);
@@ -308,7 +308,7 @@ public class GuessExecutor
308
308
 
309
309
  private static class ConfigSourceList extends ArrayList<ConfigSource> { };
310
310
 
311
- private static NextConfig addAssumedDecoderConfigs(ConfigSource originalConfig, NextConfig guessed)
311
+ private static ConfigDiff addAssumedDecoderConfigs(ConfigSource originalConfig, ConfigDiff guessed)
312
312
  {
313
313
  List<ConfigSource> guessedDecoders = guessed.get(ConfigSourceList.class, "decoders", null);
314
314
  if (guessedDecoders == null) {
@@ -328,14 +328,14 @@ public class GuessExecutor
328
328
  public static class GuessedNoticeError
329
329
  extends Error
330
330
  {
331
- private final NextConfig guessedConfig;
331
+ private final ConfigDiff guessedConfig;
332
332
 
333
- public GuessedNoticeError(NextConfig guessedConfig)
333
+ public GuessedNoticeError(ConfigDiff guessedConfig)
334
334
  {
335
335
  this.guessedConfig = guessedConfig;
336
336
  }
337
337
 
338
- public NextConfig getGuessedConfig()
338
+ public ConfigDiff getGuessedConfig()
339
339
  {
340
340
  return guessedConfig;
341
341
  }
@@ -22,7 +22,7 @@ import org.embulk.config.Config;
22
22
  import org.embulk.config.ConfigDefault;
23
23
  import org.embulk.config.ConfigSource;
24
24
  import org.embulk.config.TaskSource;
25
- import org.embulk.config.NextConfig;
25
+ import org.embulk.config.ConfigDiff;
26
26
  import org.embulk.config.CommitReport;
27
27
  import org.embulk.plugin.PluginType;
28
28
  import org.embulk.spi.Schema;
@@ -93,8 +93,8 @@ public class LocalExecutor
93
93
  private volatile Throwable[] exceptions;
94
94
  private volatile CommitReport[] inputCommitReports;
95
95
  private volatile CommitReport[] outputCommitReports;
96
- private volatile NextConfig inputNextConfig;
97
- private volatile NextConfig outputNextConfig;
96
+ private volatile ConfigDiff inputConfigDiff;
97
+ private volatile ConfigDiff outputConfigDiff;
98
98
  private int processorCount;
99
99
 
100
100
  public ProcessState(Logger logger)
@@ -231,20 +231,20 @@ public class LocalExecutor
231
231
  return false;
232
232
  }
233
233
 
234
- public void setOutputNextConfig(NextConfig outputNextConfig)
234
+ public void setOutputConfigDiff(ConfigDiff outputConfigDiff)
235
235
  {
236
- if (outputNextConfig == null) {
237
- outputNextConfig = Exec.newNextConfig();
236
+ if (outputConfigDiff == null) {
237
+ outputConfigDiff = Exec.newConfigDiff();
238
238
  }
239
- this.outputNextConfig = outputNextConfig;
239
+ this.outputConfigDiff = outputConfigDiff;
240
240
  }
241
241
 
242
- public void setInputNextConfig(NextConfig inputNextConfig)
242
+ public void setInputConfigDiff(ConfigDiff inputConfigDiff)
243
243
  {
244
- if (inputNextConfig == null) {
245
- inputNextConfig = Exec.newNextConfig();
244
+ if (inputConfigDiff == null) {
245
+ inputConfigDiff = Exec.newConfigDiff();
246
246
  }
247
- this.inputNextConfig = inputNextConfig;
247
+ this.inputConfigDiff = inputConfigDiff;
248
248
  }
249
249
 
250
250
  public List<CommitReport> getInputCommitReports()
@@ -297,12 +297,12 @@ public class LocalExecutor
297
297
 
298
298
  public ExecutionResult buildExecuteResultWithWarningException(Throwable ex)
299
299
  {
300
- NextConfig nextConfig = Exec.newNextConfig();
301
- if (inputNextConfig != null) {
302
- nextConfig.getNestedOrSetEmpty("in").merge(inputNextConfig);
300
+ ConfigDiff configDiff = Exec.newConfigDiff();
301
+ if (inputConfigDiff != null) {
302
+ configDiff.getNestedOrSetEmpty("in").merge(inputConfigDiff);
303
303
  }
304
- if (outputNextConfig != null) {
305
- nextConfig.getNestedOrSetEmpty("out").merge(outputNextConfig);
304
+ if (outputConfigDiff != null) {
305
+ configDiff.getNestedOrSetEmpty("out").merge(outputConfigDiff);
306
306
  }
307
307
 
308
308
  ImmutableList.Builder<Throwable> ignoredExceptions = ImmutableList.builder();
@@ -315,17 +315,22 @@ public class LocalExecutor
315
315
  ignoredExceptions.add(ex);
316
316
  }
317
317
 
318
- return new ExecutionResult(nextConfig, ignoredExceptions.build());
318
+ return new ExecutionResult(configDiff, ignoredExceptions.build());
319
+ }
320
+
321
+ public ResumeState buildResumeState(ExecutorTask task, ExecSession exec)
322
+ {
323
+ return new ResumeState(
324
+ exec.getSessionConfigSource(),
325
+ task.getInputTask(), task.getOutputTask(),
326
+ inputSchema, outputSchema,
327
+ Arrays.asList(inputCommitReports), Arrays.asList(outputCommitReports));
319
328
  }
320
329
 
321
330
  public PartialExecutionException buildPartialExecuteException(Throwable cause,
322
331
  ExecutorTask task, ExecSession exec)
323
332
  {
324
- return new PartialExecutionException(cause, new ResumeState(
325
- exec.getSessionConfigSource(),
326
- task.getInputTask(), task.getOutputTask(),
327
- inputSchema, outputSchema,
328
- Arrays.asList(inputCommitReports), Arrays.asList(outputCommitReports)));
333
+ return new PartialExecutionException(cause, buildResumeState(task, exec));
329
334
  }
330
335
  }
331
336
 
@@ -417,7 +422,7 @@ public class LocalExecutor
417
422
 
418
423
  final ProcessState state = new ProcessState(Exec.getLogger(LocalExecutor.class));
419
424
  try {
420
- NextConfig inputNextConfig = in.transaction(task.getInputConfig(), new InputPlugin.Control() {
425
+ ConfigDiff inputConfigDiff = in.transaction(task.getInputConfig(), new InputPlugin.Control() {
421
426
  public List<CommitReport> run(final TaskSource inputTask, final Schema inputSchema, final int processorCount)
422
427
  {
423
428
  state.initialize(processorCount);
@@ -427,27 +432,37 @@ public class LocalExecutor
427
432
  {
428
433
  Schema outputSchema = last(filterSchemas);
429
434
  state.setOutputSchema(outputSchema);
430
- NextConfig outputNextConfig = out.transaction(task.getOutputConfig(), outputSchema, processorCount, new OutputPlugin.Control() {
435
+ ConfigDiff outputConfigDiff = out.transaction(task.getOutputConfig(), outputSchema, processorCount, new OutputPlugin.Control() {
431
436
  public List<CommitReport> run(final TaskSource outputTask)
432
437
  {
433
438
  task.setInputTask(inputTask);
434
439
  task.setFilterTasks(filterTasks);
435
440
  task.setOutputTask(outputTask);
436
441
 
437
- process(task.dump(), filterSchemas, processorCount, state);
438
- if (!state.isAllCommitted()) {
439
- throw state.getRepresentativeException();
442
+ if (processorCount > 0) {
443
+ process(task.dump(), filterSchemas, processorCount, state);
444
+ if (!state.isAllCommitted()) {
445
+ throw state.getRepresentativeException();
446
+ }
447
+ } else {
448
+ // TODO warning?
440
449
  }
441
450
  return state.getOutputCommitReports();
442
451
  }
443
452
  });
444
- state.setOutputNextConfig(outputNextConfig);
453
+ state.setOutputConfigDiff(outputConfigDiff);
445
454
  }
446
455
  });
447
456
  return state.getInputCommitReports();
448
457
  }
449
458
  });
450
- state.setInputNextConfig(inputNextConfig);
459
+ state.setInputConfigDiff(inputConfigDiff);
460
+
461
+ try {
462
+ doCleanup(config, state.buildResumeState(task, Exec.session()));
463
+ } catch (Exception ex) {
464
+ state.logger.warn("Commit succeeded but cleanup failed. Ignoring this exception.", ex); // TODO
465
+ }
451
466
 
452
467
  return state.buildExecuteResult();
453
468
 
@@ -473,7 +488,7 @@ public class LocalExecutor
473
488
 
474
489
  final ProcessState state = new ProcessState(Exec.getLogger(LocalExecutor.class));
475
490
  try {
476
- NextConfig inputNextConfig = in.resume(resume.getInputTaskSource(), resume.getInputSchema(), resume.getInputCommitReports().size(), new InputPlugin.Control() {
491
+ ConfigDiff inputConfigDiff = in.resume(resume.getInputTaskSource(), resume.getInputSchema(), resume.getInputCommitReports().size(), new InputPlugin.Control() {
477
492
  public List<CommitReport> run(final TaskSource inputTask, final Schema inputSchema, final int processorCount)
478
493
  {
479
494
  // TODO validate inputTask?
@@ -485,7 +500,7 @@ public class LocalExecutor
485
500
  {
486
501
  Schema outputSchema = last(filterSchemas);
487
502
  state.setOutputSchema(outputSchema);
488
- NextConfig outputNextConfig = out.resume(resume.getOutputTaskSource(), outputSchema, processorCount, new OutputPlugin.Control() {
503
+ ConfigDiff outputConfigDiff = out.resume(resume.getOutputTaskSource(), outputSchema, processorCount, new OutputPlugin.Control() {
489
504
  public List<CommitReport> run(final TaskSource outputTask)
490
505
  {
491
506
  // TODO validate outputTask?
@@ -502,20 +517,30 @@ public class LocalExecutor
502
517
  }
503
518
  }
504
519
 
505
- process(task.dump(), filterSchemas, processorCount, state);
506
- if (!state.isAllCommitted()) {
507
- throw state.getRepresentativeException();
520
+ if (processorCount > 0) {
521
+ process(task.dump(), filterSchemas, processorCount, state);
522
+ if (!state.isAllCommitted()) {
523
+ throw state.getRepresentativeException();
524
+ }
525
+ } else {
526
+ // TODO warning?
508
527
  }
509
528
  return state.getOutputCommitReports();
510
529
  }
511
530
  });
512
- state.setOutputNextConfig(outputNextConfig);
531
+ state.setOutputConfigDiff(outputConfigDiff);
513
532
  }
514
533
  });
515
534
  return state.getInputCommitReports();
516
535
  }
517
536
  });
518
- state.setInputNextConfig(inputNextConfig);
537
+ state.setInputConfigDiff(inputConfigDiff);
538
+
539
+ try {
540
+ doCleanup(config, state.buildResumeState(task, Exec.session()));
541
+ } catch (Exception ex) {
542
+ state.logger.warn("Commit succeeded but cleanup failed. Ignoring this exception.", ex); // TODO
543
+ }
519
544
 
520
545
  return state.buildExecuteResult();
521
546