warbler 1.4.10 → 2.0.0.pre1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +12 -29
- data/Gemfile +1 -12
- data/History.txt +5 -7
- data/Mavenfile +1 -2
- data/README.rdoc +51 -53
- data/Rakefile +7 -13
- data/ext/JarMain.java +12 -58
- data/ext/WarMain.java +13 -41
- data/ext/WarblerJar.java +8 -12
- data/lib/warbler.rb +0 -1
- data/lib/warbler/config.rb +11 -2
- data/lib/warbler/gems.rb +9 -9
- data/lib/warbler/jar.rb +2 -4
- data/lib/warbler/rake_helper.rb +0 -7
- data/lib/warbler/traits.rb +0 -1
- data/lib/warbler/traits/bundler.rb +12 -12
- data/lib/warbler/traits/gemspec.rb +12 -22
- data/lib/warbler/traits/rails.rb +5 -5
- data/lib/warbler/traits/war.rb +2 -7
- data/lib/warbler/version.rb +1 -1
- data/lib/warbler/web_server.rb +4 -16
- data/lib/warbler/zip_support.rb +3 -21
- data/lib/warbler_jar.jar +0 -0
- data/pom.xml +23 -6
- data/spec/drb_default_id_conv.rb +48 -50
- data/spec/sample_bundler/Gemfile +1 -1
- data/spec/sample_bundler/vendor/bundle/jruby/{1.8 → 2.2.0}/bin/rake +7 -3
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/cache/rake-10.4.2.gem +0 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/.autotest +7 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/.gemtest +0 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/.rubocop.yml +27 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/.togglerc +7 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/CONTRIBUTING.rdoc +34 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/History.rdoc +651 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/MIT-LICENSE +21 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/Manifest.txt +166 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/README.rdoc +140 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/Rakefile +81 -0
- data/spec/sample_bundler/vendor/bundle/{ruby/1.8/gems/rake-0.8.7 → jruby/2.2.0/gems/rake-10.4.2}/bin/rake +5 -3
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake.rb +79 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/alt_system.rb +110 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/application.rb +790 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/backtrace.rb +23 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/clean.rb +76 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/cloneable.rb +16 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/contrib/.document +1 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/contrib/compositepublisher.rb +21 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/contrib/ftptools.rb +137 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/contrib/publisher.rb +81 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/contrib/rubyforgepublisher.rb +18 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/contrib/sshpublisher.rb +61 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/contrib/sys.rb +4 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/cpu_counter.rb +125 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/default_loader.rb +14 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/dsl_definition.rb +201 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/early_time.rb +21 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/ext/core.rb +25 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/ext/module.rb +2 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/ext/pathname.rb +25 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/ext/string.rb +173 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/ext/time.rb +16 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/file_creation_task.rb +24 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/file_list.rb +428 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/file_task.rb +46 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/file_utils.rb +128 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/file_utils_ext.rb +144 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/gempackagetask.rb +4 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/invocation_chain.rb +56 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/invocation_exception_mixin.rb +16 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/late_time.rb +17 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/linked_list.rb +103 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/loaders/makefile.rb +40 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/multi_task.rb +13 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/name_space.rb +38 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/packagetask.rb +199 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/pathmap.rb +3 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/phony.rb +15 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/private_reader.rb +20 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/promise.rb +99 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/pseudo_status.rb +29 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/rake_module.rb +38 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/rake_test_loader.rb +22 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/rdoctask.rb +4 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/ruby182_test_unit_fix.rb +29 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/rule_recursion_overflow_error.rb +20 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/runtest.rb +27 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/scope.rb +42 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/task.rb +383 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/task_argument_error.rb +7 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/task_arguments.rb +98 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/task_manager.rb +310 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/tasklib.rb +24 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/testtask.rb +212 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/thread_history_display.rb +48 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/thread_pool.rb +164 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/trace_output.rb +22 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/version.rb +7 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/lib/rake/win32.rb +56 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/rakelib/publish.rake +20 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/rakelib/test_times.rake +25 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/file_creation.rb +34 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/helper.rb +130 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/support/rakefile_definitions.rb +478 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/support/ruby_runner.rb +34 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_private_reader.rb +42 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake.rb +40 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_application.rb +643 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_application_options.rb +466 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_backtrace.rb +119 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_clean.rb +61 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_cpu_counter.rb +68 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_definitions.rb +84 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_directory_task.rb +76 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_dsl.rb +40 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_early_time.rb +31 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_extension.rb +59 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_file_creation_task.rb +56 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_file_list.rb +655 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_file_list_path_map.rb +8 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_file_task.rb +197 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_file_utils.rb +309 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_ftp_file.rb +74 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_functional.rb +482 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_invocation_chain.rb +64 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_late_time.rb +18 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_linked_list.rb +84 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_makefile_loader.rb +46 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_multi_task.rb +64 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_name_space.rb +57 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_package_task.rb +79 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_path_map.rb +168 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_path_map_explode.rb +34 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_path_map_partial.rb +18 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_pathname_extensions.rb +15 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_pseudo_status.rb +21 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_rake_test_loader.rb +20 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_reduce_compat.rb +26 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_require.rb +40 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_rules.rb +388 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_scope.rb +44 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_task.rb +393 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_task_argument_parsing.rb +119 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_task_arguments.rb +127 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_task_lib.rb +9 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_task_manager.rb +178 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_task_manager_argument_resolution.rb +19 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_task_with_arguments.rb +172 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_test_task.rb +146 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_thread_pool.rb +145 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_top_level_functions.rb +71 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_rake_win32.rb +72 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_thread_history_display.rb +101 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/gems/rake-10.4.2/test/test_trace_output.rb +52 -0
- data/spec/sample_bundler/vendor/bundle/jruby/2.2.0/specifications/rake-10.4.2.gemspec +43 -0
- data/spec/sample_jar/sample_jar.gemspec +1 -2
- data/spec/spec_helper.rb +2 -8
- data/spec/warbler/bundler_spec.rb +11 -22
- data/spec/warbler/config_spec.rb +0 -3
- data/spec/warbler/jar_spec.rb +3 -77
- data/spec/warbler/task_spec.rb +5 -6
- data/spec/warbler/web_server_spec.rb +2 -2
- data/warble.rb +4 -4
- data/warbler.gemspec +8 -8
- metadata +451 -64
- data/lib/warbler/bundler_helper.rb +0 -22
- data/lib/warbler/traits/merb.rb +0 -35
- data/spec/sample_bundler/vendor/bundle/jruby/1.8/cache/rake-0.8.7.gem +0 -0
- data/spec/sample_bundler/vendor/bundle/jruby/1.8/gems/rake-0.8.7/bin/rake +0 -31
- data/spec/sample_bundler/vendor/bundle/jruby/1.8/gems/rake-0.8.7/lib/rake.rb +0 -2506
- data/spec/sample_bundler/vendor/bundle/jruby/1.8/specifications/rake-0.8.7.gemspec +0 -31
- data/spec/sample_bundler/vendor/bundle/jruby/1.9/bin/rake +0 -19
- data/spec/sample_bundler/vendor/bundle/jruby/1.9/cache/rake-0.8.7.gem +0 -0
- data/spec/sample_bundler/vendor/bundle/jruby/1.9/gems/rake-0.8.7/bin/rake +0 -31
- data/spec/sample_bundler/vendor/bundle/jruby/1.9/gems/rake-0.8.7/lib/rake.rb +0 -2506
- data/spec/sample_bundler/vendor/bundle/jruby/1.9/specifications/rake-0.8.7.gemspec +0 -30
- data/spec/sample_bundler/vendor/bundle/ruby/1.8/bin/rake +0 -19
- data/spec/sample_bundler/vendor/bundle/ruby/1.8/cache/rake-0.8.7.gem +0 -0
- data/spec/sample_bundler/vendor/bundle/ruby/1.8/gems/rake-0.8.7/lib/rake.rb +0 -2506
- data/spec/sample_bundler/vendor/bundle/ruby/1.8/specifications/rake-0.8.7.gemspec +0 -30
- data/spec/sample_bundler/vendor/bundle/ruby/1.9.1/bin/rake +0 -19
- data/spec/sample_bundler/vendor/bundle/ruby/1.9.1/cache/rake-0.8.7.gem +0 -0
- data/spec/sample_bundler/vendor/bundle/ruby/1.9.1/gems/rake-0.8.7/bin/rake +0 -31
- data/spec/sample_bundler/vendor/bundle/ruby/1.9.1/gems/rake-0.8.7/lib/rake.rb +0 -2506
- data/spec/sample_bundler/vendor/bundle/ruby/1.9.1/specifications/rake-0.8.7.gemspec +0 -30
- data/spec/sample_jar/sbin/sample_jar +0 -5
data/ext/WarMain.java
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import java.lang.reflect.Method;
|
|
9
|
+
import java.lang.reflect.Constructor;
|
|
9
10
|
import java.io.InputStream;
|
|
10
11
|
import java.io.ByteArrayInputStream;
|
|
11
12
|
import java.io.SequenceInputStream;
|
|
@@ -63,7 +64,6 @@ public class WarMain extends JarMain {
|
|
|
63
64
|
static final String MAIN = "/" + WarMain.class.getName().replace('.', '/') + ".class";
|
|
64
65
|
static final String WEBSERVER_PROPERTIES = "/WEB-INF/webserver.properties";
|
|
65
66
|
static final String WEBSERVER_JAR = "/WEB-INF/webserver.jar";
|
|
66
|
-
static final String WEBSERVER_CONFIG = "/WEB-INF/webserver.xml";
|
|
67
67
|
|
|
68
68
|
/**
|
|
69
69
|
* jruby arguments, consider the following command :
|
|
@@ -140,26 +140,20 @@ public class WarMain extends JarMain {
|
|
|
140
140
|
if ( is != null ) props.load(is);
|
|
141
141
|
} catch (Exception e) { }
|
|
142
142
|
|
|
143
|
-
String port =
|
|
143
|
+
String port = System.getProperty("warbler.port", System.getenv("PORT"));
|
|
144
144
|
port = port == null ? "8080" : port;
|
|
145
|
-
|
|
146
|
-
String webserverConfig = getSystemProperty("warbler.webserver_config", getENV("WARBLER_WEBSERVER_CONFIG"));
|
|
147
|
-
String embeddedWebserverConfig = new URI("jar", entryPath(WEBSERVER_CONFIG), null).toURL().toString();
|
|
148
|
-
webserverConfig = webserverConfig == null ? embeddedWebserverConfig : webserverConfig;
|
|
149
|
-
for ( Map.Entry entry : props.entrySet() ) {
|
|
145
|
+
for (Map.Entry entry : props.entrySet()) {
|
|
150
146
|
String val = (String) entry.getValue();
|
|
151
147
|
val = val.replace("{{warfile}}", archive).
|
|
152
148
|
replace("{{port}}", port).
|
|
153
|
-
replace("{{host}}", host).
|
|
154
|
-
replace("{{config}}", webserverConfig).
|
|
155
149
|
replace("{{webroot}}", webroot.getAbsolutePath());
|
|
156
150
|
entry.setValue(val);
|
|
157
151
|
}
|
|
158
152
|
|
|
159
153
|
if (props.getProperty("props") != null) {
|
|
160
154
|
String[] propsToSet = props.getProperty("props").split(",");
|
|
161
|
-
for (
|
|
162
|
-
|
|
155
|
+
for (String key : propsToSet) {
|
|
156
|
+
System.setProperty(key, props.getProperty(key));
|
|
163
157
|
}
|
|
164
158
|
}
|
|
165
159
|
|
|
@@ -241,7 +235,7 @@ public class WarMain extends JarMain {
|
|
|
241
235
|
|
|
242
236
|
invokeMethod(scriptingContainer, "setArgv", (Object) executableArgv);
|
|
243
237
|
invokeMethod(scriptingContainer, "setCurrentDirectory", extractRoot.getAbsolutePath());
|
|
244
|
-
initJRubyScriptingEnv(scriptingContainer
|
|
238
|
+
initJRubyScriptingEnv(scriptingContainer);
|
|
245
239
|
|
|
246
240
|
final Object provider = invokeMethod(scriptingContainer, "getProvider");
|
|
247
241
|
final Object rubyInstanceConfig = invokeMethod(provider, "getRubyInstanceConfig");
|
|
@@ -257,6 +251,8 @@ public class WarMain extends JarMain {
|
|
|
257
251
|
invokeMethod(rubyInstanceConfig, "processArguments", (Object) arguments);
|
|
258
252
|
|
|
259
253
|
Object runtime = invokeMethod(scriptingContainer, "getRuntime");
|
|
254
|
+
|
|
255
|
+
debug("loading resource: " + executablePath);
|
|
260
256
|
Object executableInput =
|
|
261
257
|
new SequenceInputStream(new ByteArrayInputStream(executableScriptEnvPrefix().getBytes()),
|
|
262
258
|
(InputStream) invokeMethod(rubyInstanceConfig, "getScriptSource"));
|
|
@@ -317,36 +313,12 @@ public class WarMain extends JarMain {
|
|
|
317
313
|
"end";
|
|
318
314
|
}
|
|
319
315
|
|
|
320
|
-
protected void initJRubyScriptingEnv(Object scriptingContainer
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
for (URL url : jars) {
|
|
325
|
-
if (url.toString().matches("file:/.*jruby-stdlib-.*jar")) {
|
|
326
|
-
jrubyStdlibJar = url.toString();
|
|
327
|
-
debug("using jruby-stdlib: " + jrubyStdlibJar);
|
|
328
|
-
} else if (url.toString().matches("file:/.*bcpkix-jdk15on-.*jar")) {
|
|
329
|
-
bcpkixJar = url.toString();
|
|
330
|
-
debug("using bcpkix: " + bcpkixJar);
|
|
331
|
-
} else if (url.toString().matches("file:/.*bcprov-jdk15on-.*jar")) {
|
|
332
|
-
bcprovJar = url.toString();
|
|
333
|
-
debug("using bcprov: " + bcprovJar);
|
|
334
|
-
}
|
|
335
|
-
}
|
|
316
|
+
protected void initJRubyScriptingEnv(Object scriptingContainer) throws Exception {
|
|
317
|
+
// for some reason, the container needs to run a scriptlet in order for it
|
|
318
|
+
// to be able to find the gem executables later
|
|
319
|
+
invokeMethod(scriptingContainer, "runScriptlet", "SCRIPTING_CONTAINER_INITIALIZED=true");
|
|
336
320
|
|
|
337
|
-
invokeMethod(scriptingContainer, "
|
|
338
|
-
"ruby = RUBY_VERSION.match(/^\\d\\.\\d/)[0] \n" +
|
|
339
|
-
"jruby_major_version = JRUBY_VERSION.match(/^\\d\\.\\d/)[0].to_f \n" +
|
|
340
|
-
"jruby_minor_version = JRUBY_VERSION.split('.')[2].to_i\n" +
|
|
341
|
-
"$: << \"" + jrubyStdlibJar + "!/META-INF/jruby.home/lib/ruby/#{ruby}/site_ruby\"\n" +
|
|
342
|
-
"$: << \"" + jrubyStdlibJar + "!/META-INF/jruby.home/lib/ruby/shared\"\n" +
|
|
343
|
-
"$: << \"" + jrubyStdlibJar + "!/META-INF/jruby.home/lib/ruby/#{ruby}\"\n" +
|
|
344
|
-
"if jruby_major_version >= 1.7 and jruby_minor_version < 13\n" +
|
|
345
|
-
" require \"" + bcpkixJar + "\".gsub('file:', '') unless \"" + bcpkixJar + "\".empty?\n" +
|
|
346
|
-
" require \"" + bcprovJar + "\".gsub('file:', '') unless \"" + bcprovJar + "\".empty?\n" +
|
|
347
|
-
"end");
|
|
348
|
-
|
|
349
|
-
invokeMethod(scriptingContainer, "setHomeDirectory", "classpath:/META-INF/jruby.home");
|
|
321
|
+
invokeMethod(scriptingContainer, "setHomeDirectory", "uri:classloader:/META-INF/jruby.home");
|
|
350
322
|
}
|
|
351
323
|
|
|
352
324
|
@Override
|
data/ext/WarblerJar.java
CHANGED
|
@@ -118,20 +118,16 @@ public class WarblerJar {
|
|
|
118
118
|
path = value.convertToString().getUnicodeValue();
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
+
InputStream inFile = getStream(path, null);
|
|
121
122
|
try {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
while ((bytesRead = inFile.read(buf)) != -1) {
|
|
128
|
-
zip.write(buf, 0, bytesRead);
|
|
129
|
-
}
|
|
130
|
-
} finally {
|
|
131
|
-
close(inFile);
|
|
123
|
+
zip.putNextEntry(new ZipEntry(entryName));
|
|
124
|
+
byte[] buf = new byte[16384];
|
|
125
|
+
int bytesRead;
|
|
126
|
+
while ((bytesRead = inFile.read(buf)) != -1) {
|
|
127
|
+
zip.write(buf, 0, bytesRead);
|
|
132
128
|
}
|
|
133
|
-
}
|
|
134
|
-
|
|
129
|
+
} finally {
|
|
130
|
+
close(inFile);
|
|
135
131
|
}
|
|
136
132
|
}
|
|
137
133
|
}
|
data/lib/warbler.rb
CHANGED
|
@@ -34,7 +34,6 @@ require 'warbler/executable_helper'
|
|
|
34
34
|
require 'warbler/rake_helper'
|
|
35
35
|
require 'warbler/pathmap_helper'
|
|
36
36
|
require 'warbler/platform_helper'
|
|
37
|
-
require 'warbler/bundler_helper'
|
|
38
37
|
require 'warbler/task'
|
|
39
38
|
require 'warbler/application'
|
|
40
39
|
require 'warbler/web_server'
|
data/lib/warbler/config.rb
CHANGED
|
@@ -242,8 +242,17 @@ module Warbler
|
|
|
242
242
|
end
|
|
243
243
|
end
|
|
244
244
|
|
|
245
|
-
|
|
246
|
-
|
|
245
|
+
# Deprecated
|
|
246
|
+
def war_name
|
|
247
|
+
$stderr.puts "config.war_name deprecated; replace with config.jar_name" #:nocov:
|
|
248
|
+
jar_name #:nocov:
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
# Deprecated
|
|
252
|
+
def war_name=(w)
|
|
253
|
+
$stderr.puts "config.war_name deprecated; replace with config.jar_name" #:nocov:
|
|
254
|
+
self.jar_name = w #:nocov:
|
|
255
|
+
end
|
|
247
256
|
|
|
248
257
|
private
|
|
249
258
|
def warbler_vendor_excludes(warbler_home)
|
data/lib/warbler/gems.rb
CHANGED
|
@@ -43,19 +43,16 @@ module Warbler
|
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
def specs(gem_dependencies)
|
|
46
|
-
@specs ||= map
|
|
46
|
+
@specs ||= map{|gem, version| find_single_gem_files(gem_dependencies, gem, version) }.flatten.compact
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
private
|
|
50
50
|
|
|
51
51
|
# Add a single gem to WEB-INF/gems
|
|
52
52
|
def find_single_gem_files(gem_dependencies, gem_pattern, version = nil)
|
|
53
|
-
gem_spec_class = Gem::Specification
|
|
54
|
-
gem_spec_class = Gem::BasicSpecification if Gem.const_defined?(:BasicSpecification)
|
|
55
|
-
# Gem::Specification < Gem::BasicSpecification (since RGs 2.1)
|
|
56
53
|
case gem_pattern
|
|
57
|
-
when
|
|
58
|
-
return
|
|
54
|
+
when Gem::Specification
|
|
55
|
+
return gem_pattern
|
|
59
56
|
when Gem::Dependency
|
|
60
57
|
gem = gem_pattern
|
|
61
58
|
else
|
|
@@ -65,11 +62,14 @@ module Warbler
|
|
|
65
62
|
return nil if gem.respond_to?(:type) and gem.type != :runtime
|
|
66
63
|
|
|
67
64
|
# Deal with deprecated Gem.source_index and #search
|
|
68
|
-
matched = gem.respond_to?(:to_spec) ? [
|
|
65
|
+
matched = gem.respond_to?(:to_spec) ? [gem.to_spec] : Gem.source_index.search(gem)
|
|
69
66
|
fail "gem '#{gem}' not installed" if matched.empty?
|
|
70
67
|
spec = matched.last
|
|
71
|
-
|
|
72
|
-
|
|
68
|
+
if gem_dependencies
|
|
69
|
+
[spec] + spec.dependencies.map{|gem| find_single_gem_files(gem_dependencies, gem) }
|
|
70
|
+
else
|
|
71
|
+
spec
|
|
72
|
+
end
|
|
73
73
|
end
|
|
74
74
|
|
|
75
75
|
end
|
data/lib/warbler/jar.rb
CHANGED
|
@@ -158,7 +158,7 @@ module Warbler
|
|
|
158
158
|
end
|
|
159
159
|
rm_f path
|
|
160
160
|
ensure_directory_entries
|
|
161
|
-
puts "Creating #{path}"
|
|
161
|
+
puts "Creating #{path}"
|
|
162
162
|
if Warbler::Config === config_or_path
|
|
163
163
|
@files.delete("#{config_or_path.jar_name}/#{path}")
|
|
164
164
|
end
|
|
@@ -290,10 +290,8 @@ module Warbler
|
|
|
290
290
|
zipfile.mkdir(entry.dup) # in case it's frozen rubyzip 0.9.6.1 workaround
|
|
291
291
|
elsif File.symlink?(src)
|
|
292
292
|
zipfile.get_output_stream(entry) { |f| f << File.read(src) }
|
|
293
|
-
elsif File.exist?(src)
|
|
294
|
-
zipfile.add(entry, src)
|
|
295
293
|
else
|
|
296
|
-
|
|
294
|
+
zipfile.add(entry, src)
|
|
297
295
|
end
|
|
298
296
|
end
|
|
299
297
|
end
|
data/lib/warbler/rake_helper.rb
CHANGED
data/lib/warbler/traits.rb
CHANGED
|
@@ -12,7 +12,6 @@ module Warbler
|
|
|
12
12
|
class Bundler
|
|
13
13
|
include Trait
|
|
14
14
|
include PathmapHelper
|
|
15
|
-
include BundlerHelper
|
|
16
15
|
|
|
17
16
|
def self.detect?
|
|
18
17
|
File.exist?(ENV['BUNDLE_GEMFILE'] || "Gemfile")
|
|
@@ -23,29 +22,30 @@ module Warbler
|
|
|
23
22
|
end
|
|
24
23
|
|
|
25
24
|
def before_configure
|
|
26
|
-
config.bundler
|
|
27
|
-
config.bundle_without = [
|
|
25
|
+
config.bundler = true
|
|
26
|
+
config.bundle_without = ["development", "test", "assets"]
|
|
28
27
|
end
|
|
29
28
|
|
|
30
29
|
def after_configure
|
|
31
30
|
add_bundler_gems if config.bundler
|
|
32
31
|
end
|
|
33
32
|
|
|
34
|
-
def add_bundler_gems
|
|
35
|
-
|
|
33
|
+
def add_bundler_gems
|
|
34
|
+
require 'bundler'
|
|
35
|
+
config.gems.clear
|
|
36
36
|
config.gem_dependencies = false # Bundler takes care of these
|
|
37
|
-
config.bundler = {}
|
|
37
|
+
config.bundler = {}
|
|
38
38
|
|
|
39
39
|
bundler_specs.each do |spec|
|
|
40
|
-
spec = to_spec(spec)
|
|
41
40
|
# Bundler HAX -- fixup bad #loaded_from attribute in fake
|
|
42
41
|
# bundler gemspec from bundler/source.rb
|
|
43
|
-
if spec.name ==
|
|
42
|
+
if spec.name == "bundler"
|
|
44
43
|
full_gem_path = Pathname.new(spec.full_gem_path)
|
|
45
|
-
|
|
44
|
+
|
|
45
|
+
while !full_gem_path.join('bundler.gemspec').exist?
|
|
46
46
|
full_gem_path = full_gem_path.dirname
|
|
47
47
|
# if at top of the path, meaning we cannot find bundler.gemspec, abort.
|
|
48
|
-
if full_gem_path.to_s
|
|
48
|
+
if full_gem_path.to_s=~/^[\.\/]$/
|
|
49
49
|
$stderr.puts("warning: Unable to detect bundler spec under '#{spec.full_gem_path}'' and is sub-dirs")
|
|
50
50
|
exit
|
|
51
51
|
end
|
|
@@ -139,8 +139,8 @@ module Warbler
|
|
|
139
139
|
definition = ::Bundler.definition
|
|
140
140
|
all = definition.specs.to_a
|
|
141
141
|
requested = definition.specs_for(definition.groups - bundle_without).to_a
|
|
142
|
-
excluded_git_specs = (all - requested).select {
|
|
143
|
-
excluded_git_specs.each {
|
|
142
|
+
excluded_git_specs = (all - requested).select {|spec| ::Bundler::Source::Git === spec.source }
|
|
143
|
+
excluded_git_specs.each {|spec| spec.groups << :warbler_excluded }
|
|
144
144
|
requested + excluded_git_specs
|
|
145
145
|
end
|
|
146
146
|
|
|
@@ -18,17 +18,18 @@ module Warbler
|
|
|
18
18
|
!Dir['*.gemspec'].empty?
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
-
def before_configure
|
|
21
|
+
def before_configure
|
|
22
22
|
@spec_file = Dir['*.gemspec'].first
|
|
23
|
-
|
|
24
|
-
@spec.
|
|
23
|
+
require 'yaml'
|
|
24
|
+
@spec = File.open(@spec_file) {|f| Gem::Specification.from_yaml(f) } rescue Gem::Specification.load(@spec_file)
|
|
25
|
+
@spec.runtime_dependencies.each {|g| config.gems << g }
|
|
25
26
|
config.dirs = []
|
|
26
|
-
config.compiled_ruby_files = @spec.files.select {
|
|
27
|
+
config.compiled_ruby_files = @spec.files.select {|f| f =~ /\.rb$/}
|
|
27
28
|
end
|
|
28
29
|
|
|
29
30
|
def after_configure
|
|
30
31
|
@spec.require_paths.each do |p|
|
|
31
|
-
add_init_load_path(
|
|
32
|
+
add_init_load_path(config.pathmaps.application.inject(p) {|pm,x| pm.pathmap(x)})
|
|
32
33
|
end
|
|
33
34
|
end
|
|
34
35
|
|
|
@@ -53,24 +54,13 @@ module Warbler
|
|
|
53
54
|
end
|
|
54
55
|
|
|
55
56
|
def default_executable
|
|
56
|
-
if
|
|
57
|
-
|
|
58
|
-
exe_path = File.join(@spec.bindir, exe_script) # bin/script
|
|
59
|
-
if File.exists?(exe_path)
|
|
60
|
-
exe_path
|
|
61
|
-
elsif File.exists?("bin/#{exe_script}") # compatibility
|
|
62
|
-
"bin/#{exe_script}" # ... should probably remove this
|
|
63
|
-
else
|
|
64
|
-
raise "no `#{exe_script}` executable script found"
|
|
65
|
-
end
|
|
66
|
-
elsif exe_path = Dir['bin/*'].sort.first
|
|
67
|
-
warn "no executables found in #{@spec_file}, using #{exe_path}"
|
|
68
|
-
exe_path
|
|
69
|
-
elsif exe_path = Dir['exe/*'].sort.first
|
|
70
|
-
warn "no executables found in #{@spec_file}, using #{exe_path}"
|
|
71
|
-
exe_path
|
|
57
|
+
if !@spec.executables.empty?
|
|
58
|
+
"bin/#{@spec.executables.first}"
|
|
72
59
|
else
|
|
73
|
-
|
|
60
|
+
exe = Dir['bin/*'].sort.first
|
|
61
|
+
raise "No executable script found" unless exe
|
|
62
|
+
warn "No default executable found in #{@spec_file}, using #{exe}"
|
|
63
|
+
exe
|
|
74
64
|
end
|
|
75
65
|
end
|
|
76
66
|
|
data/lib/warbler/traits/rails.rb
CHANGED
|
@@ -12,7 +12,7 @@ module Warbler
|
|
|
12
12
|
include Trait
|
|
13
13
|
|
|
14
14
|
def self.detect?
|
|
15
|
-
File.exist?(
|
|
15
|
+
File.exist?("config/environment.rb")
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
def self.requirements
|
|
@@ -24,15 +24,15 @@ module Warbler
|
|
|
24
24
|
config.webxml.rails.env = ENV['RAILS_ENV'] || 'production'
|
|
25
25
|
|
|
26
26
|
return unless Warbler.framework_detection
|
|
27
|
-
return false unless task = Warbler.project_application.lookup(
|
|
27
|
+
return false unless task = Warbler.project_application.lookup("environment")
|
|
28
28
|
|
|
29
29
|
task.invoke rescue nil
|
|
30
30
|
return false unless defined?(::Rails)
|
|
31
31
|
|
|
32
|
-
config.dirs <<
|
|
32
|
+
config.dirs << "tmp" if File.directory?("tmp")
|
|
33
33
|
config.webxml.booter = :rails
|
|
34
|
-
unless (defined?(::Rails.vendor_rails?) && ::Rails.vendor_rails?) || File.directory?(
|
|
35
|
-
config.gems[
|
|
34
|
+
unless (defined?(::Rails.vendor_rails?) && ::Rails.vendor_rails?) || File.directory?("vendor/rails")
|
|
35
|
+
config.gems["rails"] = ::Rails::VERSION::STRING
|
|
36
36
|
end
|
|
37
37
|
if defined?(::Rails.configuration.gems)
|
|
38
38
|
::Rails.configuration.gems.each do |g|
|
data/lib/warbler/traits/war.rb
CHANGED
|
@@ -18,7 +18,7 @@ module Warbler
|
|
|
18
18
|
DEFAULT_GEM_PATH = '/WEB-INF/gems'
|
|
19
19
|
|
|
20
20
|
def self.detect?
|
|
21
|
-
Traits::Rails.detect? || Traits::
|
|
21
|
+
Traits::Rails.detect? || Traits::Rack.detect?
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
def before_configure
|
|
@@ -134,8 +134,7 @@ module Warbler
|
|
|
134
134
|
def move_jars_to_webinf_lib(jar, selector = nil)
|
|
135
135
|
return unless selector # default is false
|
|
136
136
|
selector = /.*/ if selector == true # move all if not a RegExp given
|
|
137
|
-
|
|
138
|
-
default_jars = default_jar_paths.map { |file| File.basename(file) }
|
|
137
|
+
default_jars = default_jar_files.map { |file| File.basename(file) }
|
|
139
138
|
jar.files.keys.select { |k| k =~ /^WEB-INF\/.*\.jar$/ }.each do |k|
|
|
140
139
|
if k.start_with?('WEB-INF/lib/') # .jar already in WEB-INF/lib
|
|
141
140
|
if default_jars.include? k.sub('WEB-INF/lib/', '')
|
|
@@ -145,8 +144,6 @@ module Warbler
|
|
|
145
144
|
next
|
|
146
145
|
end
|
|
147
146
|
next unless selector =~ File.basename(k)
|
|
148
|
-
# default jars might end up mapped twice as they're part of gems
|
|
149
|
-
next if default_jar_paths.include?(jar.files[k])
|
|
150
147
|
name = k.sub('WEB-INF', '')[1..-1].gsub(/[\/\\]/, '-')
|
|
151
148
|
jar.files["WEB-INF/lib/#{name}"] = jar.files[k]
|
|
152
149
|
jar.files[k] = empty_jar
|
|
@@ -183,8 +180,6 @@ module Warbler
|
|
|
183
180
|
case self.booter
|
|
184
181
|
when :rack
|
|
185
182
|
"org.jruby.rack.RackServletContextListener"
|
|
186
|
-
when :merb
|
|
187
|
-
"org.jruby.rack.merb.MerbServletContextListener"
|
|
188
183
|
else # :rails, default
|
|
189
184
|
"org.jruby.rack.rails.RailsServletContextListener"
|
|
190
185
|
end
|
data/lib/warbler/version.rb
CHANGED
data/lib/warbler/web_server.rb
CHANGED
|
@@ -122,25 +122,13 @@ PROPS
|
|
|
122
122
|
|
|
123
123
|
def add(jar)
|
|
124
124
|
super
|
|
125
|
-
jar.files["WEB-INF/webserver.xml"] ||= StringIO.new(<<-CONFIG)
|
|
126
|
-
<?xml version="1.0"?>
|
|
127
|
-
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
|
|
128
|
-
|
|
129
|
-
<Configure id="Server" class="org.eclipse.jetty.server.Server">
|
|
130
|
-
</Configure>
|
|
131
|
-
CONFIG
|
|
132
|
-
|
|
133
125
|
jar.files["WEB-INF/webserver.properties"] = StringIO.new(<<-PROPS)
|
|
134
126
|
mainclass = org.eclipse.jetty.runner.Runner
|
|
135
|
-
args = args0,args1,args2
|
|
127
|
+
args = args0,args1,args2
|
|
136
128
|
props = jetty.home
|
|
137
|
-
args0 = --
|
|
138
|
-
args1 = {{
|
|
139
|
-
args2 =
|
|
140
|
-
args3 = {{port}}
|
|
141
|
-
args4 = --config
|
|
142
|
-
args5 = {{config}}
|
|
143
|
-
args6 = {{warfile}}
|
|
129
|
+
args0 = --port
|
|
130
|
+
args1 = {{port}}
|
|
131
|
+
args2 = {{warfile}}
|
|
144
132
|
jetty.home = {{webroot}}
|
|
145
133
|
PROPS
|
|
146
134
|
end
|