embulk 0.6.27 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -0
  3. data/Gemfile.lock +6 -1
  4. data/README.md +4 -4
  5. data/bin/embulk +39 -17
  6. data/build.gradle +23 -8
  7. data/embulk-cli/src/main/java/org/embulk/cli/Main.java +11 -2
  8. data/embulk-core/build.gradle +9 -4
  9. data/embulk-core/src/main/java/org/embulk/EmbulkEmbed.java +160 -61
  10. data/embulk-core/src/main/java/org/embulk/EmbulkService.java +1 -0
  11. data/embulk-core/src/main/java/org/embulk/command/TablePreviewPrinter.java +0 -1
  12. data/embulk-core/src/main/java/org/embulk/config/CommitReport.java +5 -1
  13. data/embulk-core/src/main/java/org/embulk/config/ConfigLoader.java +28 -7
  14. data/embulk-core/src/main/java/org/embulk/config/DataSourceImpl.java +1 -4
  15. data/embulk-core/src/main/java/org/embulk/config/DataSourceSerDe.java +6 -3
  16. data/embulk-core/src/main/java/org/embulk/config/ModelManager.java +0 -2
  17. data/embulk-core/src/main/java/org/embulk/config/TaskReport.java +29 -0
  18. data/embulk-core/src/main/java/org/embulk/exec/BulkLoader.java +42 -45
  19. data/embulk-core/src/main/java/org/embulk/exec/ExecModule.java +0 -1
  20. data/embulk-core/src/main/java/org/embulk/exec/GuessExecutor.java +4 -7
  21. data/embulk-core/src/main/java/org/embulk/exec/LocalExecutorPlugin.java +5 -6
  22. data/embulk-core/src/main/java/org/embulk/exec/LoggerProvider.java +0 -1
  23. data/embulk-core/src/main/java/org/embulk/exec/PooledBufferAllocator.java +0 -3
  24. data/embulk-core/src/main/java/org/embulk/exec/PreviewExecutor.java +2 -2
  25. data/embulk-core/src/main/java/org/embulk/exec/ResumeState.java +26 -9
  26. data/embulk-core/src/main/java/org/embulk/exec/SamplingParserPlugin.java +2 -4
  27. data/embulk-core/src/main/java/org/embulk/guice/Bootstrap.java +12 -5
  28. data/embulk-core/src/main/java/org/embulk/guice/CloseableInjector.java +1 -1
  29. data/embulk-core/src/main/java/org/embulk/guice/LifeCycleInjector.java +26 -0
  30. data/embulk-core/src/main/java/org/embulk/guice/{CloseableInjectorProxy.java → LifeCycleInjectorProxy.java} +20 -6
  31. data/embulk-core/src/main/java/org/embulk/jruby/JRubyScriptingModule.java +10 -12
  32. data/embulk-core/src/main/java/org/embulk/plugin/PluginClassLoaderModule.java +0 -1
  33. data/embulk-core/src/main/java/org/embulk/plugin/PluginManager.java +14 -1
  34. data/embulk-core/src/main/java/org/embulk/plugin/compat/InputPluginWrapper.java +102 -0
  35. data/embulk-core/src/main/java/org/embulk/plugin/compat/PluginWrappers.java +30 -0
  36. data/embulk-core/src/main/java/org/embulk/plugin/compat/TransactionalFileInputWrapper.java +96 -0
  37. data/embulk-core/src/main/java/org/embulk/plugin/compat/TransactionalFileOutputWrapper.java +102 -0
  38. data/embulk-core/src/main/java/org/embulk/plugin/compat/TransactionalPageOutputWrapper.java +95 -0
  39. data/embulk-core/src/main/java/org/embulk/spi/ColumnConfig.java +0 -2
  40. data/embulk-core/src/main/java/org/embulk/spi/Exec.java +8 -2
  41. data/embulk-core/src/main/java/org/embulk/spi/ExecSession.java +7 -1
  42. data/embulk-core/src/main/java/org/embulk/spi/Extension.java +2 -2
  43. data/embulk-core/src/main/java/org/embulk/spi/FileInputPlugin.java +3 -3
  44. data/embulk-core/src/main/java/org/embulk/spi/FileInputRunner.java +12 -10
  45. data/embulk-core/src/main/java/org/embulk/spi/FileOutputPlugin.java +3 -3
  46. data/embulk-core/src/main/java/org/embulk/spi/FileOutputRunner.java +11 -9
  47. data/embulk-core/src/main/java/org/embulk/spi/FilterPlugin.java +0 -3
  48. data/embulk-core/src/main/java/org/embulk/spi/InputPlugin.java +4 -4
  49. data/embulk-core/src/main/java/org/embulk/spi/OutputPlugin.java +3 -3
  50. data/embulk-core/src/main/java/org/embulk/spi/PageReader.java +0 -1
  51. data/embulk-core/src/main/java/org/embulk/spi/ProcessTask.java +0 -5
  52. data/embulk-core/src/main/java/org/embulk/spi/SchemaConfig.java +0 -1
  53. data/embulk-core/src/main/java/org/embulk/spi/TaskState.java +19 -4
  54. data/embulk-core/src/main/java/org/embulk/spi/TempFileSpace.java +0 -3
  55. data/embulk-core/src/main/java/org/embulk/spi/Transactional.java +2 -2
  56. data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileInput.java +2 -2
  57. data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileOutput.java +2 -2
  58. data/embulk-core/src/main/java/org/embulk/spi/TransactionalPageOutput.java +2 -2
  59. data/embulk-core/src/main/java/org/embulk/spi/time/DateTimeZoneSerDe.java +0 -2
  60. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormat.java +0 -3
  61. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormatter.java +0 -1
  62. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParser.java +0 -1
  63. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampSerDe.java +0 -1
  64. data/embulk-core/src/main/java/org/embulk/spi/type/TypeDeserializer.java +0 -3
  65. data/embulk-core/src/main/java/org/embulk/spi/unit/LocalFileSerDe.java +0 -3
  66. data/embulk-core/src/main/java/org/embulk/spi/unit/ToStringMap.java +0 -1
  67. data/embulk-core/src/main/java/org/embulk/spi/util/Executors.java +15 -12
  68. data/embulk-core/src/main/java/org/embulk/spi/util/Filters.java +0 -1
  69. data/embulk-core/src/test/java/org/embulk/spi/TestFileInputRunner.java +7 -7
  70. data/embulk-core/src/test/java/org/embulk/spi/TestFileOutputRunner.java +8 -8
  71. data/embulk-docs/src/built-in.rst +27 -30
  72. data/embulk-docs/src/conf.py +2 -2
  73. data/embulk-docs/src/release.rst +1 -2
  74. data/embulk-docs/src/release/release-0.7.0.rst +96 -0
  75. data/embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java +0 -4
  76. data/embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java +0 -10
  77. data/embulk-standards/src/main/java/org/embulk/standards/CsvTokenizer.java +1 -5
  78. data/embulk-standards/src/main/java/org/embulk/standards/LocalFileInputPlugin.java +4 -5
  79. data/embulk-standards/src/main/java/org/embulk/standards/LocalFileOutputPlugin.java +4 -5
  80. data/embulk-standards/src/main/java/org/embulk/standards/NullOutputPlugin.java +4 -4
  81. data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginModule.java +0 -3
  82. data/embulk-standards/src/main/java/org/embulk/standards/StdoutOutputPlugin.java +4 -6
  83. data/embulk.gemspec +14 -1
  84. data/lib/embulk.rb +59 -4
  85. data/lib/embulk/command/embulk_bundle.rb +56 -0
  86. data/lib/embulk/command/embulk_main.rb +2 -0
  87. data/lib/embulk/command/embulk_migrate_plugin.rb +170 -0
  88. data/lib/embulk/command/embulk_new_plugin.rb +4 -1
  89. data/lib/embulk/command/embulk_run.rb +188 -227
  90. data/lib/embulk/data/bundle/.ruby-version +1 -0
  91. data/lib/embulk/data/bundle/Gemfile +4 -1
  92. data/lib/embulk/data/bundle/embulk/input/example.rb +4 -4
  93. data/lib/embulk/data/bundle/embulk/output/example.rb +4 -4
  94. data/lib/embulk/data/new/README.md.erb +1 -1
  95. data/lib/embulk/data/new/java/file_input.java.erb +4 -4
  96. data/lib/embulk/data/new/java/file_output.java.erb +2 -2
  97. data/lib/embulk/data/new/java/gradle/wrapper/gradle-wrapper.jar +0 -0
  98. data/lib/embulk/data/new/java/gradle/wrapper/gradle-wrapper.properties +2 -2
  99. data/lib/embulk/data/new/java/input.java.erb +3 -3
  100. data/lib/embulk/data/new/java/output.java.erb +2 -2
  101. data/lib/embulk/data/new/ruby/.ruby-version +1 -0
  102. data/lib/embulk/data/new/ruby/gemspec.erb +1 -0
  103. data/lib/embulk/data/new/ruby/input.rb.erb +3 -3
  104. data/lib/embulk/data/new/ruby/output.rb.erb +4 -4
  105. data/lib/embulk/data/package_data.rb +1 -15
  106. data/lib/embulk/guess/charset.rb +10 -1
  107. data/lib/embulk/input_plugin.rb +12 -12
  108. data/lib/embulk/java/bootstrap.rb +7 -4
  109. data/lib/embulk/java/imports.rb +34 -2
  110. data/lib/embulk/logger.rb +2 -0
  111. data/lib/embulk/output_plugin.rb +12 -12
  112. data/lib/embulk/page_builder.rb +1 -1
  113. data/lib/embulk/plugin.rb +0 -1
  114. data/lib/embulk/runner.rb +184 -0
  115. data/lib/embulk/version.rb +1 -1
  116. metadata +76 -55
  117. data/embulk-core/src/main/java/org/embulk/command/LiquidTemplate.java +0 -8
  118. data/embulk-core/src/main/java/org/embulk/command/Runner.java +0 -369
  119. data/embulk-docs/src/release/release-0.6.26.rst +0 -17
  120. data/embulk-docs/src/release/release-0.6.27.rst +0 -11
  121. data/lib/embulk/command/embulk.rb +0 -47
  122. data/lib/embulk/data/bundle/Gemfile.lock +0 -8
  123. data/lib/embulk/exec.rb +0 -8
  124. data/lib/embulk/gems.rb +0 -29
  125. data/lib/embulk/java/liquid_helper.rb +0 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9d6457e1454597d2e0fac7b4411651cdab29de99
4
- data.tar.gz: 2a75ba2f38ffee891935b9072a04f14f67f8b651
3
+ metadata.gz: c6b45b793c322d59468c3d388e09313718a55de7
4
+ data.tar.gz: d34278276b5b486c18fd365382a817b1227772b9
5
5
  SHA512:
6
- metadata.gz: 20cfa0be896376240e28935b95f31c270c32528d8a60b8b96aaf8906369bf6783120bb16375fc4fe37e447e3895aaa6000c87c6ca3ff99cb3ed43b55b5e7b7f9
7
- data.tar.gz: 667309b4c8bca0542e43ead5d75b762ef3d552ddcb5a83b8ced5368f9913cfbae51f5e5c72a0f8426fc5662a5a27e5448ecfe200a64402fb545a7a2acedc1cd0
6
+ metadata.gz: 103dd7e4b4f913ea106fa0d9161e0876234c6f726e21eaca87994094006876f75990fc84d0350dcf2cf1c73570094e8208ce6db56bb6e249ce341ca4e447e5fd
7
+ data.tar.gz: 305595f0a9bf0a887b6f7eba813df88f6950f011afc82915fe9e88e9eb1bac83adf11bfde0dffa054dd59411eaf2c66149fd1eab8c0b8256f9dc22c08b23d786
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.2.2
data/Gemfile.lock CHANGED
@@ -1,11 +1,13 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- embulk (0.6.12)
4
+ embulk (0.7.0)
5
+ jruby-jars (= 9.0.0.0)
5
6
 
6
7
  GEM
7
8
  remote: https://rubygems.org/
8
9
  specs:
10
+ jruby-jars (9.0.0.0)
9
11
  kramdown (1.5.0)
10
12
  power_assert (0.2.2)
11
13
  rake (10.4.2)
@@ -24,3 +26,6 @@ DEPENDENCIES
24
26
  rake (>= 0.10.0)
25
27
  test-unit (~> 3.0.9)
26
28
  yard (~> 0.8.7)
29
+
30
+ BUNDLED WITH
31
+ 1.10.6
data/README.md CHANGED
@@ -104,13 +104,13 @@ embulk cleanup config.yml -r resume-state.yml
104
104
 
105
105
  ### Using plugin bundle
106
106
 
107
- `embulk bundle` subcommand creates (or updates if already exists) a private (isolated) bundle of a plugins.
107
+ `embulk bundle new` subcommand creates (or updates if already exists) a private (isolated) bundle of a plugins.
108
108
  You can use the bundle using `-b <bundle_dir>` option. `embulk bundle` also generates some example plugins to \<bundle_dir>/embulk/\*.rb directory.
109
109
 
110
110
  See the generated \<bundle_dir>/Gemfile file how to plugin bundles work.
111
111
 
112
112
  ```
113
- embulk bundle ./embulk_bundle
113
+ embulk bundle new ./embulk_bundle
114
114
  embulk guess -b ./embulk_bundle ...
115
115
  embulk run -b ./embulk_bundle ...
116
116
  ```
@@ -141,10 +141,10 @@ embulk selfupdate
141
141
  You can see JaCoCo's test coverage report at `${project}/build/reports/tests/index.html`
142
142
  You can see Findbug's report at `${project}/build/reports/findbug/main.html` # FIXME coverage information is not included somehow
143
143
 
144
- You can use `classpath` task to use `./bin/embulk` for development:
144
+ You can use `classpath` task to use `bundle exec ./bin/embulk` for development:
145
145
 
146
146
  ```
147
- ./gradlew classpath # -x test: skip test
147
+ ./gradlew -t classpath # -x test: skip test
148
148
  ./bin/embulk
149
149
  ```
150
150
 
data/bin/embulk CHANGED
@@ -1,5 +1,18 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ if RUBY_PLATFORM =~ /java/i
4
+ # Enable embulk_bundle if run by CRuby.
5
+ # Disable embulk_bundle if run by JRuby.
6
+ if ENV['EMBULK_BIN_ENABLE_BUNDLE'] == File.expand_path(__FILE__)
7
+ ENV.delete('EMBULK_BIN_ENABLE_BUNDLE')
8
+ require_relative '../lib/embulk/command/embulk_bundle'
9
+ else
10
+ $LOAD_PATH << File.expand_path('../lib', File.dirname(__FILE__))
11
+ require 'embulk/command/embulk_main'
12
+ end
13
+ exit 0
14
+ end
15
+
3
16
  java_args = []
4
17
  jruby_args = []
5
18
  default_optimize = false
@@ -55,30 +68,39 @@ unless java_cmd
55
68
  end
56
69
  end
57
70
 
58
- embulk_home = File.dirname(File.dirname(__FILE__))
59
- classpath_dir = File.join(embulk_home, 'classpath')
60
- lib_dir = File.join(embulk_home, 'lib')
61
-
62
- jruby_complete = Dir.entries(classpath_dir).find {|jar| jar =~ /jruby-complete-[\d\.]+\.jar/ } rescue nil
63
- unless jruby_complete
64
- STDERR.puts "Could not find jruby-complete at #{embulk_home}/classpath directory."
65
- if embulk_home == '.'
66
- STDERR.puts "Did you run ./gradlew classpath? You need to build java code and create ./classpath directory first."
67
- end
68
- raise SystemExit.new(1)
69
- end
70
-
71
71
  if overwrite_optimize == true || (default_optimize == true && overwrite_optimize != false)
72
72
  java_args = %w[-XX:+AggressiveOpts -XX:+UseConcMarkSweepGC] + java_args
73
73
  else
74
74
  java_args = %w[-XX:+AggressiveOpts -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -Xverify:none] + java_args
75
75
  end
76
76
 
77
- # java ... -jar ruby-complete.jar $EMBULK_HOME/lib/embulk/command/embulk.rb "$@"
77
+ # Disable bundler options of CRuby before starting JRuby
78
+ ENV.delete('GEM_HOME')
79
+ ENV.delete('GEM_PATH')
80
+ ENV.delete('BUNDLE_GEMFILE')
81
+ ENV.delete('BUNDLE_BIN_PATH')
82
+ ENV.delete('RUBYLIB')
83
+ ENV.delete('RUBYOPT')
84
+
85
+ env = {
86
+ 'EMBULK_BIN_ENABLE_BUNDLE' => File.expand_path(__FILE__)
87
+ }
88
+
89
+ begin
90
+ require 'jruby-jars'
91
+ rescue LoadError => e
92
+ STDERR.puts "Could not load jruby-jar.gem. Did you run with \"bundle exec\"?"
93
+ raise e
94
+ end
95
+ jruby_cp = "#{File.dirname(JRubyJars.core_jar_path)}/*"
96
+
97
+ # java ... -jar ruby-complete.jar bin/embulk "$@"
78
98
  cmdline = [java_cmd]
79
99
  cmdline.concat java_args
80
- cmdline << '-jar' << File.join(classpath_dir, jruby_complete)
100
+ cmdline << '-cp' << jruby_cp << 'org.jruby.Main'
81
101
  cmdline.concat jruby_args
82
- cmdline << File.join(lib_dir, 'embulk/command/embulk.rb')
102
+ cmdline << __FILE__
83
103
  cmdline.concat ARGV
84
- exec *cmdline
104
+ exec env, *cmdline
105
+ exit 127
106
+
data/build.gradle CHANGED
@@ -16,10 +16,10 @@ def release_projects = [project(":embulk-core"), project(":embulk-standards")]
16
16
 
17
17
  allprojects {
18
18
  group = 'org.embulk'
19
- version = '0.6.27'
19
+ version = '0.7.0'
20
20
 
21
21
  ext {
22
- jrubyVersion = '1.7.21'
22
+ jrubyVersion = '9.0.0.0'
23
23
  }
24
24
 
25
25
  apply plugin: 'java'
@@ -247,21 +247,35 @@ rubyTest.dependsOn('classpath')
247
247
  //
248
248
  // gem task
249
249
  //
250
- task gem(type: JRubyExec) {
250
+ task gemJRuby(type: JRubyExec, dependsOn: ["classpath"]) {
251
251
  jrubyArgs '-rrubygems/gem_runner', '-eGem::GemRunner.new.run(ARGV)'
252
252
  script './lib/embulk/version.rb' // dummy
253
253
  scriptArgs 'build', 'embulk.gemspec'
254
+ doLast { file("${project.name}-${project.version}-java.gem").renameTo("pkg/${project.name}-${project.version}-java.gem") }
255
+ }
256
+
257
+ task gem(type: Exec, dependsOn: ["classpath", "gemJRuby"]) {
258
+ executable "gem"
259
+ args "build", "embulk.gemspec"
260
+ doFirst {
261
+ def rubyVersion = file(".ruby-version").getText().trim()
262
+ if (!"ruby --version".execute().text.contains(rubyVersion)) {
263
+ throw new GradleException("Version of 'ruby' command in PATH must be ${rubyVersion}. Use rbenv and install ${rubyVersion}")
264
+ }
265
+ }
254
266
  doLast { file("${project.name}-${project.version}.gem").renameTo("pkg/${project.name}-${project.version}.gem") }
255
267
  }
256
- gem.dependsOn('classpath')
257
268
 
258
269
  //
259
270
  // rubyGemsUpload task
260
271
  //
261
- task rubyGemsUpload(type: JRubyExec, dependsOn: ["gem"]) {
262
- jrubyArgs '-rrubygems/gem_runner', '-eGem::GemRunner.new.run(ARGV)'
263
- script './lib/embulk/version.rb' // dummy
264
- scriptArgs 'push', "pkg/embulk-${project.version}.gem"
272
+ task rubyGemsUploadJRuby(type: Exec, dependsOn: ["gem"]) {
273
+ executable "gem"
274
+ args "push", "pkg/embulk-${project.version}-java.gem"
275
+ }
276
+ task rubyGemsUpload(type: Exec, dependsOn: ["gem", "rubyGemsUploadJRuby"]) {
277
+ executable "gem"
278
+ args "push", "pkg/embulk-${project.version}.gem"
265
279
  }
266
280
 
267
281
  //
@@ -296,6 +310,7 @@ Manual operations:
296
310
  }
297
311
  bintrayUpload.mustRunAfter('releaseCheck')
298
312
  rubyGemsUpload.mustRunAfter('releaseCheck')
313
+ rubyGemsUploadJRuby.mustRunAfter('releaseCheck')
299
314
 
300
315
  task setVersion << {
301
316
  if (!project.hasProperty("to")) {
@@ -1,12 +1,21 @@
1
1
  package org.embulk.cli;
2
2
 
3
+ import java.net.URISyntaxException;
4
+
3
5
  public class Main
4
6
  {
5
7
  public static void main(String[] args)
6
8
  {
7
- // $ java -jar jruby-complete.jar classpath:embulk/command/embulk.rb "$@"
9
+ // $ java -jar jruby-complete.jar embulk-core.jar!/embulk/command/embulk_bundle.rb "$@"
8
10
  String[] jrubyArgs = new String[args.length + 1];
9
- jrubyArgs[0] = "classpath:embulk/command/embulk.rb";
11
+ String resourcePath;
12
+ try {
13
+ resourcePath = Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().toString() + "!/";
14
+ }
15
+ catch (URISyntaxException ex) {
16
+ resourcePath = "classpath:";
17
+ }
18
+ jrubyArgs[0] = resourcePath + "embulk/command/embulk_bundle.rb";
10
19
  System.arraycopy(args, 0, jrubyArgs, 1, args.length);
11
20
  org.jruby.Main.main(jrubyArgs);
12
21
  }
@@ -2,7 +2,7 @@ apply plugin: "com.github.jruby-gradle.jar"
2
2
 
3
3
  // include ruby scripts to jar. don't use sourceSets.main.resources.srcDirs
4
4
  // because IntelliJ causes error if srcDirs includes files out of projectDir.
5
- processResources.from("${rootProject.projectDir}/lib", "${buildDir}/jruby")
5
+ processResources.from("${rootProject.projectDir}/lib/", "${buildDir}/gemlib")
6
6
 
7
7
  configurations {
8
8
  // com.google.inject:guice depends on asm and cglib but version of the libraries conflict
@@ -38,17 +38,22 @@ dependencies {
38
38
  compile 'io.netty:netty-buffer:5.0.0.Alpha1'
39
39
  compile 'org.fusesource.jansi:jansi:1.11'
40
40
 
41
- // for embulk/guess/charset.rb
41
+ // For embulk/guess/charset.rb. See also embulk.gemspec
42
42
  compile 'com.ibm.icu:icu4j:54.1.1'
43
43
 
44
44
  gems 'rubygems:liquid:3.0.6'
45
45
  }
46
46
 
47
47
  task unpackGems(type: JRubyPrepare) {
48
- outputDir file("${buildDir}/jruby/embulk/gems")
48
+ outputDir file("${buildDir}/gem")
49
49
  dependencies configurations.gems
50
50
  doLast {
51
- fileTree(dir: "${buildDir}/jruby/embulk/gems/cache", include: "*.gem").each { f -> f.delete() }
51
+ // move to build/gem/*/lib/* to build/gemlib/
52
+ file("${buildDir}/gemlib").mkdirs()
53
+ file("${buildDir}/gem/gems").eachDir { gemDir ->
54
+ file("${gemDir}/lib").renameTo("${buildDir}/gemlib/")
55
+ }
56
+ fileTree(dir: "${buildDir}/gemlib", include: "**/.jrubydir").each { f -> f.delete() }
52
57
  }
53
58
  }
54
59
  processResources.dependsOn("unpackGems")
@@ -1,12 +1,12 @@
1
1
  package org.embulk;
2
2
 
3
+ import java.util.ArrayList;
3
4
  import java.util.Arrays;
4
5
  import java.util.List;
5
6
  import com.google.common.base.Function;
6
7
  import com.google.common.base.Throwables;
7
8
  import com.google.common.collect.ImmutableList;
8
9
  import com.google.common.collect.Iterables;
9
- import com.google.common.annotations.Beta;
10
10
  import com.google.inject.Injector;
11
11
  import com.google.inject.Module;
12
12
  import com.fasterxml.jackson.databind.ObjectMapper;
@@ -14,7 +14,6 @@ import org.embulk.config.ModelManager;
14
14
  import org.embulk.config.ConfigSource;
15
15
  import org.embulk.config.ConfigDiff;
16
16
  import org.embulk.config.ConfigLoader;
17
- import org.embulk.EmbulkService;
18
17
  import org.embulk.exec.BulkLoader;
19
18
  import org.embulk.exec.GuessExecutor;
20
19
  import org.embulk.exec.PreviewExecutor;
@@ -22,69 +21,115 @@ import org.embulk.exec.PreviewResult;
22
21
  import org.embulk.exec.ExecutionResult;
23
22
  import org.embulk.exec.PartialExecutionException;
24
23
  import org.embulk.exec.ResumeState;
24
+ import org.embulk.spi.BufferAllocator;
25
25
  import org.embulk.spi.ExecSession;
26
26
  import org.embulk.guice.Bootstrap;
27
- import org.embulk.guice.CloseableInjector;
27
+ import org.embulk.guice.LifeCycleInjector;
28
28
  import static com.google.common.base.Preconditions.checkState;
29
29
  import static com.google.common.base.Preconditions.checkNotNull;
30
30
 
31
- @Beta
32
31
  public class EmbulkEmbed
33
- implements AutoCloseable
34
32
  {
35
33
  public static ConfigLoader newSystemConfigLoader()
36
34
  {
37
35
  return new ConfigLoader(new ModelManager(null, new ObjectMapper()));
38
36
  }
39
37
 
40
- private final CloseableInjector injector;
41
- private final BulkLoader bulkLoader;
42
- private final GuessExecutor guessExecutor;
43
- private final PreviewExecutor previewExecutor;
44
-
45
- public EmbulkEmbed(ConfigSource systemConfig, Module... additionalModules)
38
+ public static class Bootstrap
46
39
  {
47
- this(systemConfig, Arrays.asList(additionalModules));
48
- }
40
+ private final ConfigLoader systemConfigLoader;
49
41
 
50
- public EmbulkEmbed(ConfigSource systemConfig,
51
- final Iterable<? extends Module> additionalModules)
52
- {
53
- this(systemConfig,
54
- new Function<List<Module>, Iterable<Module>>()
55
- {
56
- public Iterable<Module> apply(List<Module> source)
42
+ private ConfigSource systemConfig;
43
+
44
+ private final List<Function<? super List<Module>, ? extends Iterable<? extends Module>>> moduleOverrides;
45
+
46
+ public Bootstrap()
47
+ {
48
+ this.systemConfigLoader = newSystemConfigLoader();
49
+ this.systemConfig = systemConfigLoader.newConfigSource();
50
+ this.moduleOverrides = new ArrayList<>();
51
+ }
52
+
53
+ public ConfigLoader getSystemConfigLoader()
54
+ {
55
+ return systemConfigLoader;
56
+ }
57
+
58
+ public Bootstrap setSystemConfig(ConfigSource systemConfig)
59
+ {
60
+ this.systemConfig = systemConfig.deepCopy();
61
+ return this;
62
+ }
63
+
64
+ public Bootstrap addModules(Module... additionalModules)
65
+ {
66
+ return addModules(Arrays.asList(additionalModules));
67
+ }
68
+
69
+ public Bootstrap addModules(Iterable<? extends Module> additionalModules)
70
+ {
71
+ final List<Module> copy = ImmutableList.copyOf(additionalModules);
72
+ return overrideModules(
73
+ new Function<List<Module>, Iterable<Module>>()
57
74
  {
58
- return Iterables.concat(source, additionalModules);
59
- }
60
- });
75
+ public Iterable<Module> apply(List<Module> modules)
76
+ {
77
+ return Iterables.concat(modules, copy);
78
+ }
79
+ });
80
+ }
81
+
82
+ public Bootstrap overrideModules(Function<? super List<Module>, ? extends Iterable<? extends Module>> function)
83
+ {
84
+ moduleOverrides.add(function);
85
+ return this;
86
+ }
87
+
88
+ public EmbulkEmbed initialize()
89
+ {
90
+ return build(true);
91
+ }
92
+
93
+ public EmbulkEmbed initializeCloseable()
94
+ {
95
+ return build(false);
96
+ }
97
+
98
+ private EmbulkEmbed build(boolean destroyOnShutdownHook)
99
+ {
100
+ org.embulk.guice.Bootstrap bootstrap = new org.embulk.guice.Bootstrap()
101
+ .requireExplicitBindings(false)
102
+ .addModules(EmbulkService.standardModuleList(systemConfig));
103
+
104
+ for (Function<? super List<Module>, ? extends Iterable<? extends Module>> override : moduleOverrides) {
105
+ bootstrap = bootstrap.overrideModules(override);
106
+ }
107
+
108
+ LifeCycleInjector injector;
109
+ if (destroyOnShutdownHook) {
110
+ injector = bootstrap.initialize();
111
+ } else {
112
+ injector = bootstrap.initializeCloseable();
113
+ }
114
+
115
+ return new EmbulkEmbed(systemConfig, injector);
116
+ }
61
117
  }
62
118
 
63
- public EmbulkEmbed(ConfigSource systemConfig,
64
- Function<? super List<Module>, ? extends Iterable<? extends Module>> overrideModules)
119
+ private final LifeCycleInjector injector;
120
+ private final BulkLoader bulkLoader;
121
+ private final GuessExecutor guessExecutor;
122
+ private final PreviewExecutor previewExecutor;
123
+
124
+ EmbulkEmbed(ConfigSource systemConfig, LifeCycleInjector injector)
65
125
  {
66
- this.injector = new Bootstrap()
67
- .requireExplicitBindings(false)
68
- .addModules(EmbulkService.standardModuleList(systemConfig))
69
- .overrideModules(overrideModules)
70
- .initializeCloseable();
126
+ this.injector = injector;
71
127
  injector.getInstance(org.slf4j.ILoggerFactory.class);
72
128
  this.bulkLoader = new BulkLoader(injector, systemConfig);
73
129
  this.guessExecutor = injector.getInstance(GuessExecutor.class);
74
130
  this.previewExecutor = injector.getInstance(PreviewExecutor.class);
75
131
  }
76
132
 
77
- @Override
78
- public void close()
79
- {
80
- try {
81
- injector.close();
82
- }
83
- catch (Exception ex) {
84
- throw Throwables.propagate(ex);
85
- }
86
- }
87
-
88
133
  public Injector getInjector()
89
134
  {
90
135
  return injector;
@@ -95,31 +140,45 @@ public class EmbulkEmbed
95
140
  return injector.getInstance(ModelManager.class);
96
141
  }
97
142
 
98
- public ConfigLoader newConfigLoader()
143
+ public BufferAllocator getBufferAllocator()
99
144
  {
100
- return injector.getInstance(ConfigLoader.class);
145
+ return injector.getInstance(BufferAllocator.class);
101
146
  }
102
147
 
103
- public ExecSession.Builder sessionBuilder(ConfigSource execConfig)
148
+ public ConfigLoader newConfigLoader()
104
149
  {
105
- return ExecSession.builder(injector).fromExecConfig(execConfig);
150
+ return injector.getInstance(ConfigLoader.class);
106
151
  }
107
152
 
108
- public ConfigDiff guess(ExecSession exec, ConfigSource config)
153
+ public ConfigDiff guess(ConfigSource config)
109
154
  {
110
- return guessExecutor.guess(exec, config);
155
+ ExecSession exec = newExecSession(config);
156
+ try {
157
+ return guessExecutor.guess(exec, config);
158
+ }
159
+ finally {
160
+ exec.cleanup();
161
+ }
111
162
  }
112
163
 
113
- public PreviewResult preview(ExecSession exec, ConfigSource config)
164
+ public PreviewResult preview(ConfigSource config)
114
165
  {
115
- return previewExecutor.preview(exec, config);
166
+ ExecSession exec = newExecSession(config);
167
+ try {
168
+ return previewExecutor.preview(exec, config);
169
+ }
170
+ finally {
171
+ exec.cleanup();
172
+ }
116
173
  }
117
174
 
118
- public ExecutionResult run(ExecSession exec, ConfigSource config)
175
+ public ExecutionResult run(ConfigSource config)
119
176
  {
177
+ ExecSession exec = newExecSession(config);
120
178
  try {
121
179
  return bulkLoader.run(exec, config);
122
- } catch (PartialExecutionException partial) {
180
+ }
181
+ catch (PartialExecutionException partial) {
123
182
  try {
124
183
  bulkLoader.cleanup(config, partial.getResumeState());
125
184
  } catch (Throwable ex) {
@@ -127,22 +186,52 @@ public class EmbulkEmbed
127
186
  }
128
187
  throw partial;
129
188
  }
189
+ finally {
190
+ try {
191
+ exec.cleanup();
192
+ }
193
+ catch (Exception ex) {
194
+ // TODO add this exception to ExecutionResult.getIgnoredExceptions
195
+ // or partial.addSuppressed
196
+ ex.printStackTrace(System.err);
197
+ }
198
+ }
130
199
  }
131
200
 
132
- public ResumableResult runResumable(ExecSession exec, ConfigSource config)
201
+ public ResumableResult runResumable(ConfigSource config)
133
202
  {
134
- ExecutionResult result;
203
+ ExecSession exec = newExecSession(config);
135
204
  try {
136
- result = bulkLoader.run(exec, config);
137
- } catch (PartialExecutionException partial) {
138
- return new ResumableResult(partial);
205
+ ExecutionResult result;
206
+ try {
207
+ result = bulkLoader.run(exec, config);
208
+ } catch (PartialExecutionException partial) {
209
+ return new ResumableResult(partial);
210
+ }
211
+ return new ResumableResult(result);
212
+ }
213
+ finally {
214
+ try {
215
+ exec.cleanup();
216
+ }
217
+ catch (Exception ex) {
218
+ // TODO add this exception to ExecutionResult.getIgnoredExceptions
219
+ // or partial.addSuppressed
220
+ ex.printStackTrace(System.err);
221
+ }
139
222
  }
140
- return new ResumableResult(result);
141
223
  }
142
224
 
143
- public ResumeAction resumeAction(ConfigSource config, ResumeState resumeState)
225
+ private ExecSession newExecSession(ConfigSource config)
144
226
  {
145
- return new ResumeAction(config, resumeState);
227
+ ConfigSource execConfig = config.deepCopy().getNestedOrSetEmpty("exec");
228
+ return ExecSession.builder(injector).fromExecConfig(execConfig).build();
229
+ }
230
+
231
+ public ResumeStateAction resumeState(ConfigSource config, ConfigSource resumeStateConfig)
232
+ {
233
+ ResumeState resumeState = resumeStateConfig.loadConfig(ResumeState.class);
234
+ return new ResumeStateAction(config, resumeState);
146
235
  }
147
236
 
148
237
  public static class ResumableResult
@@ -186,12 +275,12 @@ public class EmbulkEmbed
186
275
  }
187
276
  }
188
277
 
189
- public class ResumeAction
278
+ public class ResumeStateAction
190
279
  {
191
280
  private final ConfigSource config;
192
281
  private final ResumeState resumeState;
193
282
 
194
- public ResumeAction(ConfigSource config, ResumeState resumeState)
283
+ public ResumeStateAction(ConfigSource config, ResumeState resumeState)
195
284
  {
196
285
  this.config = config;
197
286
  this.resumeState = resumeState;
@@ -213,4 +302,14 @@ public class EmbulkEmbed
213
302
  bulkLoader.cleanup(config, resumeState);
214
303
  }
215
304
  }
305
+
306
+ public void destroy()
307
+ {
308
+ try {
309
+ injector.destroy();
310
+ }
311
+ catch (Exception ex) {
312
+ throw Throwables.propagate(ex);
313
+ }
314
+ }
216
315
  }