jubilee 1.1.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (155) hide show
  1. checksums.yaml +7 -0
  2. data/.ruby-version +1 -0
  3. data/.travis.yml +5 -0
  4. data/CHANGELOG +32 -0
  5. data/Gemfile +35 -0
  6. data/Gemfile.lock +244 -0
  7. data/Guardfile +24 -0
  8. data/KNOWN_ISSUES +6 -0
  9. data/LICENSE.txt +20 -0
  10. data/README.md +147 -0
  11. data/ROADMAP +5 -0
  12. data/Rakefile +98 -0
  13. data/bin/jubilee +6 -0
  14. data/bin/jubilee_d +13 -0
  15. data/examples/chatapp/Gemfile +5 -0
  16. data/examples/chatapp/Gemfile.lock +27 -0
  17. data/examples/chatapp/README.md +17 -0
  18. data/examples/chatapp/app.rb +57 -0
  19. data/examples/chatapp/config.ru +3 -0
  20. data/examples/chatapp/public/assets/javascripts/application.js +67 -0
  21. data/examples/chatapp/public/assets/javascripts/jquery.js +5 -0
  22. data/examples/chatapp/public/assets/javascripts/sockjs-0.3.4.min.js +27 -0
  23. data/examples/chatapp/public/assets/javascripts/vertxbus.js +216 -0
  24. data/examples/chatapp/public/assets/stylesheets/application.css +29 -0
  25. data/examples/client/sockjs-0.3.4.min.js +27 -0
  26. data/examples/client/vertxbus.js +216 -0
  27. data/examples/jubilee.conf.rb +12 -0
  28. data/examples/jubilee/keystore.jks +0 -0
  29. data/examples/jubilee/server-keystore.jks +0 -0
  30. data/jars/hazelcast-2.6.3.jar +0 -0
  31. data/jars/jackson-annotations-2.2.2.jar +0 -0
  32. data/jars/jackson-core-2.2.2.jar +0 -0
  33. data/jars/jackson-databind-2.2.2.jar +0 -0
  34. data/jars/netty-all-4.0.13.Final.jar +0 -0
  35. data/jars/vertx-core-2.1M3-SNAPSHOT.jar +0 -0
  36. data/jars/vertx-hazelcast-2.1M3-SNAPSHOT.jar +0 -0
  37. data/java/src/jubilee/JubileeService.java +20 -0
  38. data/java/src/org/jruby/jubilee/Const.java +32 -0
  39. data/java/src/org/jruby/jubilee/RackApplication.java +103 -0
  40. data/java/src/org/jruby/jubilee/RackEnvironment.java +150 -0
  41. data/java/src/org/jruby/jubilee/RackEnvironmentHash.java +449 -0
  42. data/java/src/org/jruby/jubilee/RackInput.java +62 -0
  43. data/java/src/org/jruby/jubilee/RackResponse.java +11 -0
  44. data/java/src/org/jruby/jubilee/RubyHttpServerResponse.java +88 -0
  45. data/java/src/org/jruby/jubilee/RubyServer.java +171 -0
  46. data/java/src/org/jruby/jubilee/deploy/Starter.java +26 -0
  47. data/java/src/org/jruby/jubilee/impl/RubyIORackInput.java +201 -0
  48. data/java/src/org/jruby/jubilee/impl/RubyNullIO.java +107 -0
  49. data/java/src/org/jruby/jubilee/utils/RubyHelper.java +37 -0
  50. data/java/src/org/jruby/jubilee/vertx/JubileeVertx.java +38 -0
  51. data/jubilee.gemspec +201 -0
  52. data/lib/jubilee.rb +17 -0
  53. data/lib/jubilee/application.rb +13 -0
  54. data/lib/jubilee/cli.rb +127 -0
  55. data/lib/jubilee/configuration.rb +177 -0
  56. data/lib/jubilee/const.rb +40 -0
  57. data/lib/jubilee/jubilee.jar +0 -0
  58. data/lib/jubilee/response.rb +69 -0
  59. data/lib/jubilee/server.rb +12 -0
  60. data/lib/jubilee/version.rb +10 -0
  61. data/lib/rack/chunked.rb +38 -0
  62. data/lib/rack/handler/jubilee.rb +44 -0
  63. data/lib/vertx.rb +26 -0
  64. data/lib/vertx/README.md +7 -0
  65. data/lib/vertx/buffer.rb +251 -0
  66. data/lib/vertx/event_bus.rb +206 -0
  67. data/lib/vertx/shared_data.rb +214 -0
  68. data/spec/apps/rack/basic/config.ru +50 -0
  69. data/spec/apps/rails4/basic/.gitignore +16 -0
  70. data/spec/apps/rails4/basic/Gemfile +41 -0
  71. data/spec/apps/rails4/basic/Gemfile.lock +127 -0
  72. data/spec/apps/rails4/basic/README.rdoc +28 -0
  73. data/spec/apps/rails4/basic/Rakefile +6 -0
  74. data/spec/apps/rails4/basic/app/assets/images/.keep +0 -0
  75. data/spec/apps/rails4/basic/app/assets/images/rails.png +0 -0
  76. data/spec/apps/rails4/basic/app/assets/javascripts/application.js +12 -0
  77. data/spec/apps/rails4/basic/app/assets/stylesheets/application.css +13 -0
  78. data/spec/apps/rails4/basic/app/controllers/application_controller.rb +5 -0
  79. data/spec/apps/rails4/basic/app/controllers/concerns/.keep +0 -0
  80. data/spec/apps/rails4/basic/app/controllers/reloader_controller.rb +11 -0
  81. data/spec/apps/rails4/basic/app/controllers/reloader_controller.rb.erb +11 -0
  82. data/spec/apps/rails4/basic/app/controllers/root_controller.rb +14 -0
  83. data/spec/apps/rails4/basic/app/helpers/application_helper.rb +2 -0
  84. data/spec/apps/rails4/basic/app/mailers/.keep +0 -0
  85. data/spec/apps/rails4/basic/app/models/.keep +0 -0
  86. data/spec/apps/rails4/basic/app/models/concerns/.keep +0 -0
  87. data/spec/apps/rails4/basic/app/views/layouts/application.html.erb +14 -0
  88. data/spec/apps/rails4/basic/app/views/reloader/index.html.erb +1 -0
  89. data/spec/apps/rails4/basic/app/views/root/index.html.erb +8 -0
  90. data/spec/apps/rails4/basic/app/views/root/streaming.html.erb +6 -0
  91. data/spec/apps/rails4/basic/bin/bundle +3 -0
  92. data/spec/apps/rails4/basic/bin/rails +4 -0
  93. data/spec/apps/rails4/basic/bin/rake +4 -0
  94. data/spec/apps/rails4/basic/config.ru +4 -0
  95. data/spec/apps/rails4/basic/config/application.rb +23 -0
  96. data/spec/apps/rails4/basic/config/boot.rb +4 -0
  97. data/spec/apps/rails4/basic/config/database.yml +20 -0
  98. data/spec/apps/rails4/basic/config/environment.rb +5 -0
  99. data/spec/apps/rails4/basic/config/environments/development.rb +29 -0
  100. data/spec/apps/rails4/basic/config/environments/production.rb +80 -0
  101. data/spec/apps/rails4/basic/config/environments/test.rb +36 -0
  102. data/spec/apps/rails4/basic/config/initializers/backtrace_silencers.rb +7 -0
  103. data/spec/apps/rails4/basic/config/initializers/filter_parameter_logging.rb +4 -0
  104. data/spec/apps/rails4/basic/config/initializers/inflections.rb +16 -0
  105. data/spec/apps/rails4/basic/config/initializers/mime_types.rb +5 -0
  106. data/spec/apps/rails4/basic/config/initializers/secret_token.rb +12 -0
  107. data/spec/apps/rails4/basic/config/initializers/session_store.rb +2 -0
  108. data/spec/apps/rails4/basic/config/initializers/wrap_parameters.rb +14 -0
  109. data/spec/apps/rails4/basic/config/locales/en.yml +23 -0
  110. data/spec/apps/rails4/basic/config/routes.rb +5 -0
  111. data/spec/apps/rails4/basic/db/seeds.rb +7 -0
  112. data/spec/apps/rails4/basic/lib/assets/.keep +0 -0
  113. data/spec/apps/rails4/basic/lib/tasks/.keep +0 -0
  114. data/spec/apps/rails4/basic/public/404.html +58 -0
  115. data/spec/apps/rails4/basic/public/422.html +58 -0
  116. data/spec/apps/rails4/basic/public/500.html +57 -0
  117. data/spec/apps/rails4/basic/public/favicon.ico +0 -0
  118. data/spec/apps/rails4/basic/public/robots.txt +5 -0
  119. data/spec/apps/rails4/basic/public/some_page.html +7 -0
  120. data/spec/apps/rails4/basic/test/controllers/.keep +0 -0
  121. data/spec/apps/rails4/basic/test/fixtures/.keep +0 -0
  122. data/spec/apps/rails4/basic/test/helpers/.keep +0 -0
  123. data/spec/apps/rails4/basic/test/integration/.keep +0 -0
  124. data/spec/apps/rails4/basic/test/mailers/.keep +0 -0
  125. data/spec/apps/rails4/basic/test/models/.keep +0 -0
  126. data/spec/apps/rails4/basic/test/test_helper.rb +15 -0
  127. data/spec/apps/rails4/basic/vendor/assets/javascripts/.keep +0 -0
  128. data/spec/apps/rails4/basic/vendor/assets/stylesheets/.keep +0 -0
  129. data/spec/apps/sinatra/basic/Gemfile +4 -0
  130. data/spec/apps/sinatra/basic/Gemfile.lock +20 -0
  131. data/spec/apps/sinatra/basic/basic.rb +27 -0
  132. data/spec/apps/sinatra/basic/config.ru +7 -0
  133. data/spec/apps/sinatra/basic/public/some_page.html +7 -0
  134. data/spec/apps/sinatra/basic/views/index.erb +4 -0
  135. data/spec/apps/sinatra/basic/views/posted.haml +2 -0
  136. data/spec/apps/sinatra/basic/views/poster.haml +4 -0
  137. data/spec/apps/sinatra/basic/views/request_mapping.haml +4 -0
  138. data/spec/integration/basic_rack_spec.rb +89 -0
  139. data/spec/integration/basic_rails4_spec.rb +64 -0
  140. data/spec/integration/basic_sinatra_spec.rb +80 -0
  141. data/spec/spec_helper.rb +13 -0
  142. data/test/.ruby-version +1 -0
  143. data/test/config/app.rb +5 -0
  144. data/test/jubilee/test_cli.rb +11 -0
  145. data/test/jubilee/test_configuration.rb +31 -0
  146. data/test/jubilee/test_rack_server.rb +137 -0
  147. data/test/jubilee/test_response.rb +272 -0
  148. data/test/jubilee/test_server.rb +72 -0
  149. data/test/jubilee/test_upload.rb +301 -0
  150. data/test/sinatra_app/app.rb +31 -0
  151. data/test/sinatra_app/config.ru +6 -0
  152. data/test/sinatra_app/public/test.html +10 -0
  153. data/test/sinatra_app/unicorn.conf.rb +29 -0
  154. data/test/test_helper.rb +93 -0
  155. metadata +242 -0
@@ -0,0 +1,177 @@
1
+ # -*- encoding: binary -*-
2
+
3
+ module Jubilee
4
+ # Implements a simple DSL for configuring a Jubilee server
5
+ #
6
+ # See https://github.com/isaiah/jubilee/examples/jubilee.conf.rb
7
+ # for example configuration files.
8
+ class Configuration
9
+
10
+ attr_accessor :config_file
11
+ attr_reader :options
12
+
13
+ def initialize(options, &block)
14
+ @config_file = options.delete(:config_file)
15
+ @options = options.dup
16
+ @block = block
17
+
18
+ reload
19
+ end
20
+
21
+ def reload
22
+ instance_eval(File.read(config_file), config_file) if config_file
23
+ end
24
+
25
+ def app
26
+ @app ||= load_rack_adapter(@options, &@block)
27
+ if !@options[:quiet] and @options[:environment] == "development"
28
+ logger = @options[:logger] || STDOUT
29
+ Rack::CommonLogger.new(@app, logger)
30
+ else
31
+ @app
32
+ end
33
+ end
34
+
35
+ # sets the host and port jubilee listens to +address+ may be an Integer port
36
+ # number for a TCP port or an "IP_ADDRESS:PORT" for TCP listeners
37
+ #
38
+ # listen 3000 # listen to port 3000 on all TCP interfaces
39
+ # listen "127.0.0.1:3000" # listen to port 3000 on the loopback interface
40
+ # listen "[::1]:3000" # listen to port 3000 on the IPv6 loopback interface
41
+ def listen(address)
42
+ @options[:host], @options[:port] = expand_addr(address)
43
+ end
44
+
45
+ # sets the working directory for jubilee
46
+ def working_directory(path)
47
+ path = File.expand_path(path)
48
+ if config_file && config_file[0] != ?/ && ! File.readable?("#{path}/#{config_file}")
49
+ raise ArgumentError,
50
+ "config_file=#{config_file} would not be accessible in" \
51
+ " working_directory=#{path}"
52
+ end
53
+ @options[:chdir] = path
54
+ end
55
+
56
+ # set the event bus bridge prefix, prefix, options
57
+ # eventbus /eventbus, inbound: {foo:bar}, outbound: {foo: bar}
58
+ # will set the event bus prefix as eventbus "/eventbus", it can be
59
+ # connected via new EventBus("http://localhost:8080/eventbus"), inbound and
60
+ # outbound options are security measures that will filter the messages
61
+ def eventbus(prefix, options = {})
62
+ @options[:event_bus][:prefix] = prefix
63
+ @options[:event_bus][:inbound] = options[:inbound]
64
+ @options[:event_bus][:outbound] = options[:outbound]
65
+ end
66
+
67
+ # Set the host and port to be discovered by other jubilee instances in the network
68
+ # +address+ may be an Integer port number for a TCP port or an
69
+ # "IP_ADDRESS:PORT" for TCP listeners, or "IP_ADDRESS" and let the system
70
+ # to assign a port
71
+ #
72
+ # clustering true # enable cluster mode, default to "0.0.0.0:5701"
73
+ # clustering "0.0.0.0"
74
+ # clustering "0.0.0.0:5701"
75
+ # clustering 5701
76
+ def clustering(address)
77
+ if addr == true
78
+ @options[:cluster_host] = "0.0.0.0"
79
+ else
80
+ @options[:cluster_host], @options[:cluster_port] = expand_addr(address)
81
+ end
82
+ end
83
+
84
+ # enable debug messages
85
+ def debug(bool)
86
+ set_bool(:debug, bool)
87
+ end
88
+
89
+ # enable daemon mode
90
+ def daemonize(bool)
91
+ set_bool(:debug, bool)
92
+ end
93
+
94
+ # enable https mode, provide the :keystore path and password
95
+ def ssl(options = {})
96
+ set_path(:ssl_keystore, options[:keystore])
97
+ @options[:ssl_password] = options[:password]
98
+ @options[:ssl] = true
99
+ end
100
+
101
+ # sets the path for the PID file of the jubilee event loop
102
+ def pid(path)
103
+ set_path(:pid, path)
104
+ end
105
+
106
+ # Allows redirecting $stderr to a given path, if you are daemonizing and
107
+ # useing the default +logger+, this defautls to log/jubilee.stderr.log
108
+ def stderr_path(path)
109
+ set_path(:stderr_path, path)
110
+ end
111
+
112
+ # live stderr_path, this defaults to log/jubilee.stdout.log when daemonized
113
+ def stdout_path(path)
114
+ set_path(:stdout_path, path)
115
+ end
116
+
117
+ private
118
+ def load_rack_adapter(options, &block)
119
+ if block
120
+ inner_app = Rack::Builder.new(&block).to_app
121
+ else
122
+ if options[:rackup]
123
+ Kernel.load(options[:rackup])
124
+ inner_app = Object.const_get(File.basename(options[:rackup], '.rb').capitalize.to_sym).new
125
+ else
126
+ Dir.chdir options[:chdir] if options[:chdir]
127
+ inner_app, _ = Rack::Builder.parse_file "config.ru"
128
+ end
129
+ end
130
+ inner_app
131
+ end
132
+
133
+ def expand_addr(addr)
134
+ return ["0.0.0.0", addr] if addr === Integer
135
+ case addr
136
+ when %r{\A(?:\*:)?(\d+)\z}
137
+ ["0.0.0.0", $1]
138
+ when %r{\A\[([a-fA-F0-9:]+)\]:(\d+)\z}, %r{\A(.*):(\d+)\z}
139
+ canonicalize_tcp($1, $2.to_i)
140
+ when %r{\A?:\*\z}
141
+ [addr, nil]
142
+ else
143
+ raise ArgumentError, "unrecognizable address #{var}=#{addr.inspect}"
144
+ end
145
+ end
146
+
147
+ def set_int(var, n, min)
148
+ Integer === n or raise ArgumentError, "not an integer: #{var}=#{n.inspect}"
149
+ n >= min or raise ArgumentError, "too low (< #{min}): #{var}=#{n.inspect}"
150
+ @options[var] = n
151
+ end
152
+
153
+ def set_path(var, path)
154
+ case path
155
+ when NilClass, String
156
+ @options[var] = path
157
+ else
158
+ raise ArgumentError
159
+ end
160
+ end
161
+
162
+ def set_bool(var, bool)
163
+ case bool
164
+ when true, false
165
+ @options[var] = bool
166
+ else
167
+ raise ArgumentError, "#{var}=#{bool.inspect} not a boolean"
168
+ end
169
+ end
170
+
171
+ def canonicalize_tcp(addr, port)
172
+ packed = Socket.pack_sockaddr_in(port, addr)
173
+ port, addr = Socket.unpack_sockaddr_in(packed)
174
+ /:/ =~ addr ? ["[#{addr}]",port] : [addr, port]
175
+ end
176
+ end
177
+ end
@@ -0,0 +1,40 @@
1
+ module Jubilee
2
+ module Const
3
+ JUBILEE_VERSION = Version::STRING
4
+ HTTP_11 = "HTTP/1.1".freeze
5
+ HTTP_10 = "HTTP/1.0".freeze
6
+
7
+ SERVER_SOFTWARE = "SERVER_SOFTWARE".freeze
8
+ SERVER_PROTOCOL = "SERVER_PROTOCOL".freeze
9
+ GATEWAY_INTERFACE = "GATEWAY_INTERFACE".freeze
10
+ SERVER_NAME = "SERVER_NAME".freeze
11
+ SERVER_PORT = "SERVER_PORT".freeze
12
+
13
+ CGI_VER = "CGI/1.2".freeze
14
+
15
+ RACK_INPUT = "rack.input".freeze
16
+
17
+ REQUEST_METHOD = 'REQUEST_METHOD'.freeze
18
+ GET = 'GET'.freeze
19
+ POST = "POST".freeze
20
+ REQUEST_PATH = "REQUEST_PATH".freeze
21
+ REQUEST_URI = "REQUEST_URI".freeze
22
+ PATH_INFO = "PATH_INFO".freeze
23
+ QUERY_STRING = "QUERY_STRING".freeze
24
+
25
+ CONTENT_LENGTH = "Content-Length".freeze
26
+ TRANSFER_ENCODING = "Transfer-Encoding".freeze
27
+
28
+ HTTP_VERSION = "HTTP_VERSION".freeze
29
+ HTTP_HOST = "HTTP_HOST".freeze
30
+ HTTP_USER_AGENT = "HTTP_USER_AGENT".freeze
31
+ HTTP_ACCEPT = "HTTP_ACCEPT".freeze
32
+ HTTP_COOKIE = "HTTP_COOKIE".freeze
33
+ HTTP_ACCEPT_LANGUAGE = "HTTP_ACCEPT_LANGUAGE".freeze
34
+ HTTP_ACCEPT_ENCODING = "HTTP_ACCEPT_ENCODING".freeze
35
+ HTTP_CONNECTION = "HTTP_CONNECTION".freeze
36
+ NEWLINE = "\n".freeze
37
+
38
+ STATUS_WITH_NO_ENTITY_BODY = Hash[[204,205,304].map{|s| [s, true]}]
39
+ end
40
+ end
Binary file
@@ -0,0 +1,69 @@
1
+ require 'java'
2
+ module Jubilee
3
+ class Response
4
+ include Const
5
+ include org.jruby.jubilee.RackResponse
6
+
7
+ def initialize(array)
8
+ @status, @headers, @body = *array
9
+ @status = @status.to_i
10
+ @content_length = nil
11
+ if @body.kind_of? Array and @body.size == 1
12
+ @content_length = @body[0].bytesize
13
+ end
14
+ end
15
+
16
+ # See Rack::Utils::
17
+ def respond(response)
18
+ no_body = @status < 200 || STATUS_WITH_NO_ENTITY_BODY[@status]
19
+ write_status(response)
20
+ write_headers(response)
21
+ if no_body
22
+ response.end
23
+ else
24
+ if @body.respond_to?(:to_path)
25
+ response.send_file(@body.to_path)
26
+ else
27
+ write_body(response)
28
+ response.end
29
+ end
30
+ end
31
+ rescue NativeException => e
32
+ puts e
33
+ ensure
34
+ @body.close if @body.respond_to?(:close)
35
+ end
36
+
37
+ private
38
+ def write_status(response)
39
+ response.status_code = @status
40
+ end
41
+
42
+ def write_headers(response)
43
+ @headers.each do |key, values|
44
+ case key
45
+ when CONTENT_LENGTH
46
+ @content_length = values
47
+ next
48
+ when TRANSFER_ENCODING
49
+ @content_length = nil
50
+ end
51
+ # Multiple values are joined by \n
52
+ response.put_header(key, values)
53
+ end
54
+ end
55
+
56
+ def write_body(response)
57
+ response.put_default_headers
58
+ if @content_length
59
+ response.put_header(CONTENT_LENGTH, @content_length.to_s)
60
+ else
61
+ response.chunked = true
62
+ end
63
+
64
+ @body.each do |part|
65
+ response.write(part)
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,12 @@
1
+ require 'rack/methodoverride'
2
+ module Jubilee
3
+ class Server < VertxServer
4
+ def initialize(app, opts = {})
5
+ options = {Port: 8080, ssl: false}.merge(opts)
6
+ if (options[:ssl]) && options[:keystore_path].nil?
7
+ raise ArgumentError, "Please provide a keystore for ssl"
8
+ end
9
+ super(Application.new(app), options)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ module Jubilee
2
+ module Version
3
+ MAJOR = 1
4
+ MINOR = 1
5
+ PATCH = 0
6
+ BUILD = nil
7
+
8
+ STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
9
+ end
10
+ end
@@ -0,0 +1,38 @@
1
+ # Rails use this to chunk it's streaming response body, which we don't need
2
+ module Rack
3
+ class Chunked
4
+ class Body
5
+ def initialize(body)
6
+ @body = body
7
+ end
8
+
9
+ def each
10
+ @body.each {|chunk| yield chunk}
11
+ end
12
+
13
+ def close
14
+ @body.close if @body.respond_to?(:close)
15
+ end
16
+ end
17
+
18
+ include Rack::Utils
19
+
20
+ def initialize(app)
21
+ @app = app
22
+ end
23
+
24
+ def call(env)
25
+ status, headers, body = @app.call(env)
26
+ headers = HeaderHash.new(headers)
27
+
28
+ unless env['HTTP_VERSION'] == 'HTTP/1.0' ||
29
+ STATUS_WITH_NO_ENTITY_BODY.include?(status) ||
30
+ headers['Content-Length'] ||
31
+ headers['Transfer-Encoding']
32
+ headers.delete('Content-Length')
33
+ headers.delete('Transfer-Encoding')
34
+ end
35
+ [status, headers, body]
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,44 @@
1
+ require 'rack/handler'
2
+ require 'jubilee'
3
+ require 'java'
4
+
5
+ module Rack
6
+ module Handler
7
+ module Jubilee
8
+ DEFAULT_OPTIONS = {
9
+ :Host => '0.0.0.0',
10
+ :Port => 3000,
11
+ :Verbose => false
12
+ }
13
+ def self.run(app, options = {})
14
+ options = DEFAULT_OPTIONS.merge(options)
15
+
16
+ if options[:Verbose]
17
+ app = Rack::CommonLogger.new(app, STDOUT)
18
+ end
19
+
20
+ if options[:environment]
21
+ ENV["RACK_ENV"] = options[:environment].to_s
22
+ end
23
+
24
+ @server = ::Jubilee::Server.new(app, options)
25
+
26
+ puts "Jubilee #{::Jubilee::Const::JUBILEE_VERSION} starting..."
27
+ puts "* Environment: #{ENV['RACK_ENV']}"
28
+ puts "* Listening on http://#{options[:Host]}:#{options[:Port]}"
29
+
30
+ yield @server if block_given?
31
+
32
+ @server.start
33
+ @starter = org.jruby.jubilee.deploy.Starter.new
34
+ @starter.block
35
+ end
36
+
37
+ def self.shutdown
38
+ @server.stop{ @starter.unblock }
39
+ exit
40
+ end
41
+ end
42
+ register :jubilee, Jubilee
43
+ end
44
+ end
@@ -0,0 +1,26 @@
1
+ # Copyright 2011 the original author or authors.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ include Java
16
+
17
+ require 'vertx/buffer'
18
+ require 'vertx/event_bus'
19
+
20
+ # This is the module for vertx related feature like EventBus and SharedData,
21
+ # these features are built into jubilee server, by requiring 'vertx' in your
22
+ # rack application, you get access to the functionalities offered by vertx
23
+ # platform.
24
+
25
+ module Vertx
26
+ end
@@ -0,0 +1,7 @@
1
+ Because embeded Vertx doesn't support modules, I have to copy the ruby api
2
+ from the [mod-lang-jruby](https://github.com/vert-x/mod-lang-jruby) project.
3
+
4
+ Some of the files that are not required for the jubilee api are removed.
5
+
6
+ These files are exactly the same as the original project, except the directory
7
+ name changed to follow the ruby conversion of namespaces.
@@ -0,0 +1,251 @@
1
+ # Copyright 2011-2012 the original author or authors.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'vertx/shared_data'
16
+
17
+ module Vertx
18
+
19
+ # A Buffer represents a sequence of zero or more bytes that can be written to or read from, and which expands
20
+ # as necessary to accomodate any bytes written to it.
21
+ #
22
+ # Buffers are used in many places in vert.x, for example to read/write data to/from {NetSocket}, {AsyncFile},
23
+ # {WebSocket}, {HttpClientRequest}, {HttpClientResponse}, {HttpServerRequest}, {HttpServerResponse} etc.
24
+ #
25
+ # There are two ways to write data to a Buffer: The first method involves methods that take the form set_XXX.
26
+ # These methods write data into the buffer starting at the specified position. The position does not have to be inside data that
27
+ # has already been written to the buffer; the buffer will automatically expand to encompass the position plus any data that needs
28
+ # to be written. All positions are measured in bytes and start with zero.
29
+ #
30
+ # The second method involves methods that take the form append-XXX; these methods append data at the end of the buffer.
31
+ # Methods exist to both set and append all primitive types, String and other instances of Buffer.
32
+ #
33
+ # Data can be read from a buffer by invoking methods which take the form get_XXX. These methods take a parameter
34
+ # representing the position in the Buffer from where to read data.
35
+ #
36
+ # @author {http://tfox.org Tim Fox}
37
+ class Buffer
38
+
39
+ # @private
40
+ def initialize(j_buffer)
41
+ @buffer = j_buffer
42
+ end
43
+
44
+ # Creates a new empty buffer. The {#length} of the buffer immediately after creation will be zero.
45
+ # @param initial_size_hint [FixNum] is a hint to the system for how much memory
46
+ # to initially allocate to the buffer to prevent excessive automatic re-allocations as data is written to it.
47
+ def Buffer.create(initial_size_hint = 0)
48
+ Buffer.new(org.vertx.java.core.buffer.Buffer.new(initial_size_hint))
49
+ end
50
+
51
+ # Create a new Buffer from a String
52
+ # @param str [String] The String to encode into the Buffer
53
+ # @param enc [String] Encoding to use. Defaults to "UTF-8"
54
+ def Buffer.create_from_str(str, enc = "UTF-8")
55
+ Buffer.new(org.vertx.java.core.buffer.Buffer.new(str, enc))
56
+ end
57
+
58
+ # Return a String representation of the buffer.
59
+ # @param enc [String] The encoding to use. Defaults to "UTF-8"
60
+ # @return [String] a String representation of the buffer.
61
+ def to_s(enc = "UTF-8")
62
+ @buffer.toString(enc)
63
+ end
64
+
65
+ # Get the byte at position pos in the buffer.
66
+ # @param pos [FixNum] the position in the buffer from where to retrieve the byte
67
+ # @return [FixNum] the byte
68
+ def get_byte(pos)
69
+ @buffer.getByte(pos)
70
+ end
71
+
72
+ # Get the FixNum represented by a sequence of bytes starting at position pos in the buffer.
73
+ # @param pos [FixNum] the position in the buffer from where to retrieve the FixNum.
74
+ # @param bytes [FixNum] the number of bytes to retrieve from position pos to create the FixNum. Valid values are 1, 2, 4 and 8.
75
+ # @return [FixNum] the FixNum
76
+ def get_fixnum(pos, bytes)
77
+ case bytes
78
+ when 1
79
+ @buffer.getByte(pos)
80
+ when 2
81
+ @buffer.getShort(pos)
82
+ when 4
83
+ @buffer.getInt(pos)
84
+ when 8
85
+ @buffer.getLong(pos)
86
+ else
87
+ raise "bytes must be 1, 2, 4, or 8"
88
+ end
89
+ end
90
+
91
+ # Get the Float represented by a sequence of bytes starting at position pos in the buffer.
92
+ # @param pos [Float] the position in the buffer from where to retrieve the Float.
93
+ # @param bytes [Float] the number of bytes to retrieve from position pos to create the Float. Valid values are 4 and 8.
94
+ # @return [Float] the Float
95
+ def get_float(pos, bytes)
96
+ case bytes
97
+ when 4
98
+ @buffer.getFloat(pos)
99
+ when 8
100
+ @buffer.getDouble(pos)
101
+ else
102
+ raise "bytes must be 4 or 8"
103
+ end
104
+ end
105
+
106
+ # Return bytes from the buffer interpreted as a String
107
+ # @param pos [FixNum] the position in the buffer from where to start reading
108
+ # @param end_pos [FixNum] the position in the buffer to end reading
109
+ # @param enc [String] The encoding to use
110
+ # @return [String] the String
111
+ def get_string(pos, end_pos, enc = 'UTF-8')
112
+ @buffer.getString(pos, end_pos, enc)
113
+ end
114
+
115
+ # Return bytes in the buffer as a Buffer
116
+ # @param start_pos [FixNum] - the position in this buffer from where to start the copy.
117
+ # @param end_pos [FixNum] - the copy will be made up to index end_pos - 1
118
+ # @return [Buffer] the copy
119
+ def get_buffer(pos, end_pos)
120
+ j_buff = @buffer.getBuffer(pos, end_pos)
121
+ Buffer.new(j_buff)
122
+ end
123
+
124
+ # Appends another buffer to the end of this buffer. The buffer will expand as necessary to accomodate any bytes
125
+ # written.
126
+ # @param buff [Buffer] the buffer to append.
127
+ # @return [Buffer] a reference to self so multiple operations can be appended together.
128
+ def append_buffer(buff)
129
+ @buffer.appendBuffer(buff._to_java_buffer)
130
+ self
131
+ end
132
+
133
+ # Appends a FixNum to the end of this buffer. The buffer will expand as necessary to accomodate any bytes written.
134
+ # @param num [FixNum] the fixnum to append.
135
+ # @param bytes [FixNum] the number of bytes to write in the buffer to represent the fixnum. Valid values are 1, 2, 4 and 8.
136
+ # @return [Buffer] a reference to self so multiple operations can be appended together.
137
+ def append_fixnum(num, bytes)
138
+ case bytes
139
+ when 1
140
+ @buffer.appendByte(num)
141
+ when 2
142
+ @buffer.appendShort(num)
143
+ when 4
144
+ @buffer.appendInt(num)
145
+ when 8
146
+ @buffer.appendLong(num)
147
+ else
148
+ raise "bytes must be 1, 2, 4, or 8"
149
+ end
150
+ self
151
+ end
152
+
153
+ # Appends a Float to the end of this buffer. The buffer will expand as necessary to accomodate any bytes written.
154
+ # @param num [Float] the float to append.
155
+ # @param bytes [FixNum] the number of bytes to write in the buffer to represent the float. Valid values are 4 and 8.
156
+ # @return [Buffer] a reference to self so multiple operations can be appended together.
157
+ def append_float(num, bytes)
158
+ case bytes
159
+ when 4
160
+ @buffer.appendFloat(num)
161
+ when 8
162
+ @buffer.appendDouble(num)
163
+ else
164
+ raise "bytes must be 4 or 8"
165
+ end
166
+ end
167
+
168
+ # Appends a string to the end of this buffer. The buffer will expand as necessary to accomodate any bytes written.
169
+ # @param str [String] the string to append.
170
+ # @param enc [String] the encoding to use. Defaults to "UTF-8"
171
+ # @return [Buffer] a reference to self so multiple operations can be appended together.
172
+ def append_str(str, enc = "UTF-8")
173
+ @buffer.appendString(str, enc)
174
+ self
175
+ end
176
+
177
+ # Sets bytes in the buffer to a representation of a FixNum. The buffer will expand as necessary to accomodate any bytes written.
178
+ # @param pos [FixNum] - the position in the buffer from where to start writing the FixNum
179
+ # @param num [FixNum] - the FixNum to write
180
+ # @param bytes [FixNum] - the number of bytes to write to represent the FixNum. Valid values are 1, 2, 4, and 8
181
+ # @return [Buffer] a reference to self so multiple operations can be appended together.
182
+ def set_fixnum(pos, num, bytes)
183
+ case bytes
184
+ when 1
185
+ @buffer.setByte(pos, num)
186
+ when 2
187
+ @buffer.setShort(pos, num)
188
+ when 4
189
+ @buffer.setInt(pos, num)
190
+ when 8
191
+ @buffer.setLong(pos, num)
192
+ else
193
+ raise "bytes must be 1, 2, 4, or 8"
194
+ end
195
+ self
196
+ end
197
+
198
+ # Sets bytes in the buffer to a representation of a Float. The buffer will expand as necessary to accomodate any bytes written.
199
+ # @param pos [FixNum] - the position in the buffer from where to start writing the Float
200
+ # @param num [Float] - the Float to write
201
+ # @param bytes [FixNum] - the number of bytes to write to represent the Float. Valid values are 4 and 8
202
+ # @return [Buffer] a reference to self so multiple operations can be appended together.
203
+ def set_float(pos, num, bytes)
204
+ case bytes
205
+ when 4
206
+ @buffer.setFloat(pos, num)
207
+ when 8
208
+ @buffer.setDouble(pos, num)
209
+ else
210
+ raise "bytes must be 4 or 8"
211
+ end
212
+ self
213
+ end
214
+
215
+ # Sets bytes in this buffer to the bytes of the specified buffer. The buffer will expand as necessary to accomodate any bytes written.
216
+ # @param pos [FixNum] - the position in this buffer from where to start writing the buffer
217
+ # @param buff [Buffer] - the buffer to write into this buffer
218
+ # @return [Buffer] a reference to self so multiple operations can be appended together.
219
+ def set_buffer(pos, buff)
220
+ @buffer.setBytes(pos, buff._to_java_buffer)
221
+ self
222
+ end
223
+
224
+ # Set bytes in the buffer to the string encoding in the specified encoding
225
+ # @param pos [FixNum] - the position in this buffer from where to start writing the string
226
+ # @param str [String] the string
227
+ # @param enc [String] the encoding
228
+ # @return [Buffer] a reference to self so multiple operations can be appended together.
229
+ def set_string(pos, str, enc = 'UTF-8')
230
+ @buffer.setString(pos, str, enc)
231
+ self
232
+ end
233
+
234
+ # @return [FixNum] the length of this buffer, in bytes.
235
+ def length
236
+ @buffer.length
237
+ end
238
+
239
+ # Get a copy of the entire buffer.
240
+ # @return [Buffer] the copy
241
+ def copy
242
+ Buffer.new(@buffer.copy())
243
+ end
244
+
245
+ # @private
246
+ def _to_java_buffer
247
+ @buffer
248
+ end
249
+
250
+ end
251
+ end