embulk 0.6.27 → 0.7.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 (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
  }